velocious 1.0.406 → 1.0.407
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/README.md +1 -0
- package/build/src/database/query/index.d.ts +16 -2
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +9 -3
- package/build/src/database/query/model-class-query.d.ts +18 -0
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +58 -2
- package/build/src/database/query/preloader/belongs-to.d.ts +22 -1
- package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
- package/build/src/database/query/preloader/belongs-to.js +117 -63
- package/build/src/database/query/preloader/has-many.d.ts +17 -1
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +59 -27
- package/build/src/database/query/preloader/has-one.d.ts +5 -1
- package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-one.js +23 -7
- package/build/src/database/query/preloader/selection.d.ts +87 -0
- package/build/src/database/query/preloader/selection.d.ts.map +1 -0
- package/build/src/database/query/preloader/selection.js +132 -0
- package/build/src/database/query/preloader.d.ts +22 -1
- package/build/src/database/query/preloader.d.ts.map +1 -1
- package/build/src/database/query/preloader.js +44 -7
- package/build/src/database/record/index.d.ts +22 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +26 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import ensureModelClassInitialized from "./ensure-model-class-initialized.js";
|
|
3
|
+
import PreloaderSelection from "./selection.js";
|
|
3
4
|
import restArgsError from "../../../utils/rest-args-error.js";
|
|
4
5
|
export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
5
6
|
/**
|
|
6
7
|
* @param {object} args - Options object.
|
|
7
8
|
* @param {import("../../record/index.js").default[]} args.models - Model instances.
|
|
8
9
|
* @param {import("../../record/relationships/has-many.js").default} args.relationship - Relationship.
|
|
10
|
+
* @param {PreloaderSelection} [args.selection] - Column selection and idempotency rules.
|
|
9
11
|
*/
|
|
10
|
-
constructor({ models, relationship, ...restArgs }) {
|
|
12
|
+
constructor({ models, relationship, selection, ...restArgs }) {
|
|
11
13
|
restArgsError(restArgs);
|
|
12
14
|
this.models = models;
|
|
13
15
|
this.relationship = relationship;
|
|
16
|
+
this.selection = selection || new PreloaderSelection();
|
|
14
17
|
}
|
|
15
18
|
/** @returns {Promise<import("../../record/index.js").default[]>} - Loaded target models. */
|
|
16
19
|
async run() {
|
|
@@ -19,6 +22,33 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
19
22
|
}
|
|
20
23
|
return await this._runDirect();
|
|
21
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Partitions `this.models` into those already satisfied by the current
|
|
27
|
+
* selection (skip) and those that still need loading. Satisfied models'
|
|
28
|
+
* already-loaded targets are collected so nested preloads keep working.
|
|
29
|
+
* @param {typeof import("../../record/index.js").default} targetModelClass - Target model class.
|
|
30
|
+
* @param {string[]} mappingColumns - Columns required for mapping (foreign key).
|
|
31
|
+
* @returns {{modelsToLoad: import("../../record/index.js").default[], satisfiedTargets: import("../../record/index.js").default[]}} - The partition.
|
|
32
|
+
*/
|
|
33
|
+
_partition(targetModelClass, mappingColumns) {
|
|
34
|
+
const relationshipName = this.relationship.getRelationshipName();
|
|
35
|
+
/** @type {import("../../record/index.js").default[]} */
|
|
36
|
+
const modelsToLoad = [];
|
|
37
|
+
/** @type {import("../../record/index.js").default[]} */
|
|
38
|
+
const satisfiedTargets = [];
|
|
39
|
+
for (const model of this.models) {
|
|
40
|
+
const instanceRelationship = model.getRelationshipByName(relationshipName);
|
|
41
|
+
if (this.selection.isSatisfied({ instanceRelationship, targetModelClass, mappingColumns })) {
|
|
42
|
+
const loaded = instanceRelationship.getLoadedOrUndefined();
|
|
43
|
+
if (Array.isArray(loaded))
|
|
44
|
+
satisfiedTargets.push(...loaded);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
modelsToLoad.push(model);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { modelsToLoad, satisfiedTargets };
|
|
51
|
+
}
|
|
22
52
|
/**
|
|
23
53
|
* Preload through a join table (e.g. hasMany("invoiceGroups", {through: "invoiceGroupLinks"})).
|
|
24
54
|
*
|
|
@@ -38,6 +68,10 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
38
68
|
const targetModelClass = this.relationship.getTargetModelClass();
|
|
39
69
|
if (!targetModelClass)
|
|
40
70
|
throw new Error("No target model class could be gotten from relationship");
|
|
71
|
+
const targetForeignKey = this.relationship.getForeignKey();
|
|
72
|
+
const { modelsToLoad, satisfiedTargets } = this._partition(targetModelClass, [targetForeignKey]);
|
|
73
|
+
if (modelsToLoad.length == 0)
|
|
74
|
+
return satisfiedTargets;
|
|
41
75
|
const configuration = this.relationship.getConfiguration();
|
|
42
76
|
await ensureModelClassInitialized(throughModelClass, configuration);
|
|
43
77
|
await ensureModelClassInitialized(targetModelClass, configuration);
|
|
@@ -48,7 +82,7 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
48
82
|
const modelsByPrimaryKeyValue = {};
|
|
49
83
|
/** @type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
50
84
|
const preloadCollections = {};
|
|
51
|
-
for (const model of
|
|
85
|
+
for (const model of modelsToLoad) {
|
|
52
86
|
const primaryKeyValue = /** @type {string | number} */ (model.readColumn(primaryKey));
|
|
53
87
|
preloadCollections[primaryKeyValue] = [];
|
|
54
88
|
if (!modelsPrimaryKeyValues.includes(primaryKeyValue))
|
|
@@ -65,7 +99,6 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
65
99
|
const parentToTargetIds = {};
|
|
66
100
|
/** @type {Set<string | number>} */
|
|
67
101
|
const allTargetIds = new Set();
|
|
68
|
-
const targetForeignKey = this.relationship.getForeignKey();
|
|
69
102
|
for (const throughModel of throughModels) {
|
|
70
103
|
const parentId = /** @type {string | number} */ (throughModel.readColumn(throughForeignKey));
|
|
71
104
|
const throughId = /** @type {string | number} */ (throughModel.readColumn(throughModelClass.primaryKey()));
|
|
@@ -80,6 +113,7 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
80
113
|
if (allTargetIds.size > 0) {
|
|
81
114
|
let query = targetModelClass.where({ [targetForeignKey]: [...allTargetIds] });
|
|
82
115
|
query = this.relationship.applyScope(query);
|
|
116
|
+
query = this.selection.applyToQuery({ query, targetModelClass, mappingColumns: [targetForeignKey] });
|
|
83
117
|
targetModels = await query.toArray();
|
|
84
118
|
}
|
|
85
119
|
// Step 3: Index target models by their foreign key (maps to through model ID)
|
|
@@ -107,16 +141,13 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
107
141
|
const preloadedCollection = preloadCollections[modelValue];
|
|
108
142
|
for (const model of modelsByPrimaryKeyValue[modelValue]) {
|
|
109
143
|
const modelRelationship = model.getRelationshipByName(this.relationship.getRelationshipName());
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
else {
|
|
114
|
-
modelRelationship.addToLoaded(preloadedCollection);
|
|
115
|
-
}
|
|
144
|
+
// Replace rather than append: `modelsToLoad` are exactly the records we
|
|
145
|
+
// intend to (re)load, so a forced re-preload must not duplicate entries.
|
|
146
|
+
modelRelationship.setLoaded(preloadedCollection);
|
|
116
147
|
modelRelationship.setPreloaded(true);
|
|
117
148
|
}
|
|
118
149
|
}
|
|
119
|
-
return targetModels;
|
|
150
|
+
return [...satisfiedTargets, ...targetModels];
|
|
120
151
|
}
|
|
121
152
|
/**
|
|
122
153
|
* Preload direct has-many relationships.
|
|
@@ -124,18 +155,24 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
124
155
|
* @returns {Promise<import("../../record/index.js").default[]>} - Loaded target models.
|
|
125
156
|
*/
|
|
126
157
|
async _runDirect() {
|
|
158
|
+
const foreignKey = this.relationship.getForeignKey();
|
|
159
|
+
const primaryKey = this.relationship.getPrimaryKey();
|
|
160
|
+
if (!primaryKey) {
|
|
161
|
+
throw new Error(`${this.relationship.getModelClass().name}#${this.relationship.getRelationshipName()} doesn't have a primary key`);
|
|
162
|
+
}
|
|
163
|
+
const targetModelClass = this.relationship.getTargetModelClass();
|
|
164
|
+
if (!targetModelClass)
|
|
165
|
+
throw new Error("No target model class could be gotten from relationship");
|
|
166
|
+
const { modelsToLoad, satisfiedTargets } = this._partition(targetModelClass, [foreignKey]);
|
|
167
|
+
if (modelsToLoad.length == 0)
|
|
168
|
+
return satisfiedTargets;
|
|
127
169
|
/** @type {Array<number | string>} */
|
|
128
170
|
const modelsPrimaryKeyValues = [];
|
|
129
171
|
/** @type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
130
172
|
const modelsByPrimaryKeyValue = {};
|
|
131
|
-
const foreignKey = this.relationship.getForeignKey();
|
|
132
|
-
const primaryKey = this.relationship.getPrimaryKey();
|
|
133
173
|
/** @type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
134
174
|
const preloadCollections = {};
|
|
135
|
-
|
|
136
|
-
throw new Error(`${this.relationship.getModelClass().name}#${this.relationship.getRelationshipName()} doesn't have a primary key`);
|
|
137
|
-
}
|
|
138
|
-
for (const model of this.models) {
|
|
175
|
+
for (const model of modelsToLoad) {
|
|
139
176
|
const primaryKeyValue = /** @type {string | number} */ (model.readColumn(primaryKey));
|
|
140
177
|
preloadCollections[primaryKeyValue] = [];
|
|
141
178
|
if (!modelsPrimaryKeyValues.includes(primaryKeyValue))
|
|
@@ -151,12 +188,10 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
151
188
|
const typeColumn = this.relationship.getPolymorphicTypeColumn();
|
|
152
189
|
whereArgs[typeColumn] = this.relationship.getModelClass().getModelName();
|
|
153
190
|
}
|
|
154
|
-
const targetModelClass = this.relationship.getTargetModelClass();
|
|
155
|
-
if (!targetModelClass)
|
|
156
|
-
throw new Error("No target model class could be gotten from relationship");
|
|
157
191
|
await ensureModelClassInitialized(targetModelClass, this.relationship.getConfiguration());
|
|
158
192
|
let query = targetModelClass.where(whereArgs);
|
|
159
193
|
query = this.relationship.applyScope(query);
|
|
194
|
+
query = this.selection.applyToQuery({ query, targetModelClass, mappingColumns: [foreignKey] });
|
|
160
195
|
const targetModels = await query.toArray();
|
|
161
196
|
for (const targetModel of targetModels) {
|
|
162
197
|
const foreignKeyValue = /** @type {string | number} */ (targetModel.readColumn(foreignKey));
|
|
@@ -166,16 +201,13 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
166
201
|
const preloadedCollection = preloadCollections[modelValue];
|
|
167
202
|
for (const model of modelsByPrimaryKeyValue[modelValue]) {
|
|
168
203
|
const modelRelationship = model.getRelationshipByName(this.relationship.getRelationshipName());
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
else {
|
|
173
|
-
modelRelationship.addToLoaded(preloadedCollection);
|
|
174
|
-
}
|
|
204
|
+
// Replace rather than append: `modelsToLoad` are exactly the records we
|
|
205
|
+
// intend to (re)load, so a forced re-preload must not duplicate entries.
|
|
206
|
+
modelRelationship.setLoaded(preloadedCollection);
|
|
175
207
|
modelRelationship.setPreloaded(true);
|
|
176
208
|
}
|
|
177
209
|
}
|
|
178
|
-
return targetModels;
|
|
210
|
+
return [...satisfiedTargets, ...targetModels];
|
|
179
211
|
}
|
|
180
212
|
}
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLW1hbnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcXVlcnkvcHJlbG9hZGVyL2hhcy1tYW55LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLDJCQUEyQixNQUFNLHFDQUFxQyxDQUFBO0FBQzdFLE9BQU8sYUFBYSxNQUFNLG1DQUFtQyxDQUFBO0FBRTdELE1BQU0sQ0FBQyxPQUFPLE9BQU8sc0NBQXNDO0lBQ3pEOzs7O09BSUc7SUFDSCxZQUFZLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLFFBQVEsRUFBQztRQUM3QyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7SUFDbEMsQ0FBQztJQUVELDRGQUE0RjtJQUM1RixLQUFLLENBQUMsR0FBRztRQUNQLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2pDLENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDZixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBRXBELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSw2QkFBNkIsQ0FBQyxDQUFBO1FBQ3BJLENBQUM7UUFFRCxNQUFNLHVCQUF1QixHQUFHLHFCQUFxQixDQUFD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QUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNwQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ2pDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixpQkFBaUIsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtnQkFDcEQsQ0FBQztnQkFFRCxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCBmcm9tIFwiLi9lbnN1cmUtbW9kZWwtY2xhc3MtaW5pdGlhbGl6ZWQuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlQcmVsb2FkZXJIYXNNYW55IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5tb2RlbHMgLSBNb2RlbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL3JlbGF0aW9uc2hpcHMvaGFzLW1hbnkuanNcIikuZGVmYXVsdH0gYXJncy5yZWxhdGlvbnNoaXAgLSBSZWxhdGlvbnNoaXAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7bW9kZWxzLCByZWxhdGlvbnNoaXAsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLm1vZGVscyA9IG1vZGVsc1xuICAgIHRoaXMucmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IC0gTG9hZGVkIHRhcmdldCBtb2RlbHMuICovXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBpZiAodGhpcy5yZWxhdGlvbnNoaXAudGhyb3VnaCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1blRocm91Z2goKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9ydW5EaXJlY3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgdGhyb3VnaCBhIGpvaW4gdGFibGUgKGUuZy4gaGFzTWFueShcImludm9pY2VHcm91cHNcIiwge3Rocm91Z2g6IFwiaW52b2ljZUdyb3VwTGlua3NcIn0pKS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IC0gTG9hZGVkIHRhcmdldCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyBfcnVuVGhyb3VnaCgpIHtcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0UHJpbWFyeUtleSgpXG5cbiAgICBpZiAoIXByaW1hcnlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLnJlbGF0aW9uc2hpcC5nZXRNb2RlbENsYXNzKCkubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9IGRvZXNuJ3QgaGF2ZSBhIHByaW1hcnkga2V5YClcbiAgICB9XG5cbiAgICBjb25zdCB0aHJvdWdoUmVsYXRpb25zaGlwTmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodGhpcy5yZWxhdGlvbnNoaXAudGhyb3VnaClcbiAgICBjb25zdCBwYXJlbnRNb2RlbENsYXNzID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0TW9kZWxDbGFzcygpXG4gICAgY29uc3QgdGhyb3VnaFJlbGF0aW9uc2hpcCA9IHBhcmVudE1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHRocm91Z2hSZWxhdGlvbnNoaXBOYW1lKVxuICAgIGNvbnN0IHRocm91Z2hNb2RlbENsYXNzID0gdGhyb3VnaFJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghdGhyb3VnaE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgVGhyb3VnaCByZWxhdGlvbnNoaXAgJHt0aHJvdWdoUmVsYXRpb25zaGlwTmFtZX0gaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb3VsZCBiZSBnb3R0ZW4gZnJvbSByZWxhdGlvbnNoaXBcIilcblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRDb25maWd1cmF0aW9uKClcblxuICAgIGF3YWl0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCh0aHJvdWdoTW9kZWxDbGFzcywgY29uZmlndXJhdGlvbilcbiAgICBhd2FpdCBlbnN1cmVNb2RlbENsYXNzSW5pdGlhbGl6ZWQodGFyZ2V0TW9kZWxDbGFzcywgY29uZmlndXJhdGlvbilcblxuICAgIGNvbnN0IHRocm91Z2hGb3JlaWduS2V5ID0gdGhyb3VnaFJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KClcblxuICAgIC8qKiBAdHlwZSB7QXJyYXk8bnVtYmVyIHwgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzID0gW11cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciB8IHN0cmluZywgQXJyYXk8aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+Pn0gKi9cbiAgICBjb25zdCBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZSA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIgfCBzdHJpbmcsIEFycmF5PGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pj59ICovXG4gICAgY29uc3QgcHJlbG9hZENvbGxlY3Rpb25zID0ge31cblxuICAgIGZvciAoY29uc3QgbW9kZWwgb2YgdGhpcy5tb2RlbHMpIHtcbiAgICAgIGNvbnN0IHByaW1hcnlLZXlWYWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAobW9kZWwucmVhZENvbHVtbihwcmltYXJ5S2V5KSlcblxuICAgICAgcHJlbG9hZENvbGxlY3Rpb25zW3ByaW1hcnlLZXlWYWx1ZV0gPSBbXVxuXG4gICAgICBpZiAoIW1vZGVsc1ByaW1hcnlLZXlWYWx1ZXMuaW5jbHVkZXMocHJpbWFyeUtleVZhbHVlKSkgbW9kZWxzUHJpbWFyeUtleVZhbHVlcy5wdXNoKHByaW1hcnlLZXlWYWx1ZSlcbiAgICAgIGlmICghKHByaW1hcnlLZXlWYWx1ZSBpbiBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZSkpIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlW3ByaW1hcnlLZXlWYWx1ZV0gPSBbXVxuXG4gICAgICBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZVtwcmltYXJ5S2V5VmFsdWVdLnB1c2gobW9kZWwpXG4gICAgfVxuXG4gICAgLy8gU3RlcCAxOiBRdWVyeSB0aGUgdGhyb3VnaCB0YWJsZSB0byBidWlsZCBwYXJlbnTihpJ0YXJnZXQgSUQgbWFwcGluZ1xuICAgIGNvbnN0IHRocm91Z2hNb2RlbHMgPSBhd2FpdCB0aHJvdWdoTW9kZWxDbGFzc1xuICAgICAgLndoZXJlKHtbdGhyb3VnaEZvcmVpZ25LZXldOiBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzfSlcbiAgICAgIC50b0FycmF5KClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyB8IG51bWJlciwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPj59ICovXG4gICAgY29uc3QgcGFyZW50VG9UYXJnZXRJZHMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nIHwgbnVtYmVyPn0gKi9cbiAgICBjb25zdCBhbGxUYXJnZXRJZHMgPSBuZXcgU2V0KClcblxuICAgIGNvbnN0IHRhcmdldEZvcmVpZ25LZXkgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KClcblxuICAgIGZvciAoY29uc3QgdGhyb3VnaE1vZGVsIG9mIHRocm91Z2hNb2RlbHMpIHtcbiAgICAgIGNvbnN0IHBhcmVudElkID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovICh0aHJvdWdoTW9kZWwucmVhZENvbHVtbih0aHJvdWdoRm9yZWlnbktleSkpXG4gICAgICBjb25zdCB0aHJvdWdoSWQgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKHRocm91Z2hNb2RlbC5yZWFkQ29sdW1uKHRocm91Z2hNb2RlbENsYXNzLnByaW1hcnlLZXkoKSkpXG5cbiAgICAgIGlmICghKHBhcmVudElkIGluIHBhcmVudFRvVGFyZ2V0SWRzKSkgcGFyZW50VG9UYXJnZXRJZHNbcGFyZW50SWRdID0gW11cblxuICAgICAgcGFyZW50VG9UYXJnZXRJZHNbcGFyZW50SWRdLnB1c2godGhyb3VnaElkKVxuICAgICAgYWxsVGFyZ2V0SWRzLmFkZCh0aHJvdWdoSWQpXG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBMb2FkIHRhcmdldCBtb2RlbHMgYnkgdGhlIGZvcmVpZ24ga2V5IHRoYXQgcG9pbnRzIHRvIHRoZSB0aHJvdWdoIHRhYmxlXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSAqL1xuICAgIGxldCB0YXJnZXRNb2RlbHMgPSBbXVxuXG4gICAgaWYgKGFsbFRhcmdldElkcy5zaXplID4gMCkge1xuICAgICAgbGV0IHF1ZXJ5ID0gdGFyZ2V0TW9kZWxDbGFzcy53aGVyZSh7W3RhcmdldEZvcmVpZ25LZXldOiBbLi4uYWxsVGFyZ2V0SWRzXX0pXG5cbiAgICAgIHF1ZXJ5ID0gdGhpcy5yZWxhdGlvbnNoaXAuYXBwbHlTY29wZShxdWVyeSlcbiAgICAgIHRhcmdldE1vZGVscyA9IGF3YWl0IHF1ZXJ5LnRvQXJyYXkoKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogSW5kZXggdGFyZ2V0IG1vZGVscyBieSB0aGVpciBmb3JlaWduIGtleSAobWFwcyB0byB0aHJvdWdoIG1vZGVsIElEKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyB8IG51bWJlciwgQXJyYXk8aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+Pn0gKi9cbiAgICBjb25zdCB0YXJnZXRNb2RlbHNCeUZvcmVpZ25LZXkgPSB7fVxuXG4gICAgZm9yIChjb25zdCB0YXJnZXRNb2RlbCBvZiB0YXJnZXRNb2RlbHMpIHtcbiAgICAgIGNvbnN0IGZrVmFsdWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKHRhcmdldE1vZGVsLnJlYWRDb2x1bW4odGFyZ2V0Rm9yZWlnbktleSkpXG5cbiAgICAgIGlmICghKGZrVmFsdWUgaW4gdGFyZ2V0TW9kZWxzQnlGb3JlaWduS2V5KSkgdGFyZ2V0TW9kZWxzQnlGb3JlaWduS2V5W2ZrVmFsdWVdID0gW11cblxuICAgICAgdGFyZ2V0TW9kZWxzQnlGb3JlaWduS2V5W2ZrVmFsdWVdLnB1c2godGFyZ2V0TW9kZWwpXG4gICAgfVxuXG4gICAgLy8gU3RlcCA0OiBNYXAgdGFyZ2V0cyB0byBwYXJlbnRzIHZpYSB0aGUgdGhyb3VnaCBtYXBwaW5nXG4gICAgZm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRUb1RhcmdldElkcykge1xuICAgICAgY29uc3QgdGhyb3VnaElkcyA9IHBhcmVudFRvVGFyZ2V0SWRzW3BhcmVudElkXVxuXG4gICAgICBmb3IgKGNvbnN0IHRocm91Z2hJZCBvZiB0aHJvdWdoSWRzKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVGFyZ2V0cyA9IHRhcmdldE1vZGVsc0J5Rm9yZWlnbktleVt0aHJvdWdoSWRdIHx8IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXRNb2RlbCBvZiBtYXRjaGluZ1RhcmdldHMpIHtcbiAgICAgICAgICBpZiAocGFyZW50SWQgaW4gcHJlbG9hZENvbGxlY3Rpb25zKSB7XG4gICAgICAgICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbcGFyZW50SWRdLnB1c2godGFyZ2V0TW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtb2RlbFZhbHVlIGluIHByZWxvYWRDb2xsZWN0aW9ucykge1xuICAgICAgY29uc3QgcHJlbG9hZGVkQ29sbGVjdGlvbiA9IHByZWxvYWRDb2xsZWN0aW9uc1ttb2RlbFZhbHVlXVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlW21vZGVsVmFsdWVdKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUmVsYXRpb25zaGlwID0gbW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHRoaXMucmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSlcblxuICAgICAgICBpZiAocHJlbG9hZGVkQ29sbGVjdGlvbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIG1vZGVsUmVsYXRpb25zaGlwLnNldExvYWRlZChbXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlbFJlbGF0aW9uc2hpcC5hZGRUb0xvYWRlZChwcmVsb2FkZWRDb2xsZWN0aW9uKVxuICAgICAgICB9XG5cbiAgICAgICAgbW9kZWxSZWxhdGlvbnNoaXAuc2V0UHJlbG9hZGVkKHRydWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldE1vZGVsc1xuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgZGlyZWN0IGhhcy1tYW55IHJlbGF0aW9uc2hpcHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W10+fSAtIExvYWRlZCB0YXJnZXQgbW9kZWxzLlxuICAgKi9cbiAgYXN5bmMgX3J1bkRpcmVjdCgpIHtcbiAgICAvKiogQHR5cGUge0FycmF5PG51bWJlciB8IHN0cmluZz59ICovXG4gICAgY29uc3QgbW9kZWxzUHJpbWFyeUtleVZhbHVlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIgfCBzdHJpbmcsIEFycmF5PGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pj59ICovXG4gICAgY29uc3QgbW9kZWxzQnlQcmltYXJ5S2V5VmFsdWUgPSB7fVxuXG4gICAgY29uc3QgZm9yZWlnbktleSA9IHRoaXMucmVsYXRpb25zaGlwLmdldEZvcmVpZ25LZXkoKVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRQcmltYXJ5S2V5KClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciB8IHN0cmluZywgQXJyYXk8aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+Pn0gKi9cbiAgICBjb25zdCBwcmVsb2FkQ29sbGVjdGlvbnMgPSB7fVxuXG4gICAgaWYgKCFwcmltYXJ5S2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5yZWxhdGlvbnNoaXAuZ2V0TW9kZWxDbGFzcygpLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfSBkb2Vzbid0IGhhdmUgYSBwcmltYXJ5IGtleWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLm1vZGVscykge1xuICAgICAgY29uc3QgcHJpbWFyeUtleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuXG4gICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbcHJpbWFyeUtleVZhbHVlXSA9IFtdXG5cbiAgICAgIGlmICghbW9kZWxzUHJpbWFyeUtleVZhbHVlcy5pbmNsdWRlcyhwcmltYXJ5S2V5VmFsdWUpKSBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzLnB1c2gocHJpbWFyeUtleVZhbHVlKVxuICAgICAgaWYgKCEocHJpbWFyeUtleVZhbHVlIGluIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlKSkgbW9kZWxzQnlQcmltYXJ5S2V5VmFsdWVbcHJpbWFyeUtleVZhbHVlXSA9IFtdXG5cbiAgICAgIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlW3ByaW1hcnlLZXlWYWx1ZV0ucHVzaChtb2RlbClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4+fSAqL1xuICAgIGNvbnN0IHdoZXJlQXJncyA9IHt9XG5cbiAgICB3aGVyZUFyZ3NbZm9yZWlnbktleV0gPSBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzXG5cbiAgICBpZiAodGhpcy5yZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkge1xuICAgICAgY29uc3QgdHlwZUNvbHVtbiA9IHRoaXMucmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljVHlwZUNvbHVtbigpXG5cbiAgICAgIHdoZXJlQXJnc1t0eXBlQ29sdW1uXSA9IHRoaXMucmVsYXRpb25zaGlwLmdldE1vZGVsQ2xhc3MoKS5nZXRNb2RlbE5hbWUoKVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0IG1vZGVsIGNsYXNzIGNvdWxkIGJlIGdvdHRlbiBmcm9tIHJlbGF0aW9uc2hpcFwiKVxuXG4gICAgYXdhaXQgZW5zdXJlTW9kZWxDbGFzc0luaXRpYWxpemVkKHRhcmdldE1vZGVsQ2xhc3MsIHRoaXMucmVsYXRpb25zaGlwLmdldENvbmZpZ3VyYXRpb24oKSlcblxuICAgIGxldCBxdWVyeSA9IHRhcmdldE1vZGVsQ2xhc3Mud2hlcmUod2hlcmVBcmdzKVxuXG4gICAgcXVlcnkgPSB0aGlzLnJlbGF0aW9uc2hpcC5hcHBseVNjb3BlKHF1ZXJ5KVxuXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldE1vZGVsIG9mIHRhcmdldE1vZGVscykge1xuICAgICAgY29uc3QgZm9yZWlnbktleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovICh0YXJnZXRNb2RlbC5yZWFkQ29sdW1uKGZvcmVpZ25LZXkpKVxuXG4gICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbZm9yZWlnbktleVZhbHVlXS5wdXNoKHRhcmdldE1vZGVsKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbW9kZWxWYWx1ZSBpbiBwcmVsb2FkQ29sbGVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHByZWxvYWRlZENvbGxlY3Rpb24gPSBwcmVsb2FkQ29sbGVjdGlvbnNbbW9kZWxWYWx1ZV1cblxuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZVttb2RlbFZhbHVlXSkge1xuICAgICAgICBjb25zdCBtb2RlbFJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZSh0aGlzLnJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpXG5cbiAgICAgICAgaWYgKHByZWxvYWRlZENvbGxlY3Rpb24ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICBtb2RlbFJlbGF0aW9uc2hpcC5zZXRMb2FkZWQoW10pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kZWxSZWxhdGlvbnNoaXAuYWRkVG9Mb2FkZWQocHJlbG9hZGVkQ29sbGVjdGlvbilcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGVsUmVsYXRpb25zaGlwLnNldFByZWxvYWRlZCh0cnVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRNb2RlbHNcbiAgfVxufVxuIl19
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLW1hbnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcXVlcnkvcHJlbG9hZGVyL2hhcy1tYW55LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLDJCQUEyQixNQUFNLHFDQUFxQyxDQUFBO0FBQzdFLE9BQU8sa0JBQWtCLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0MsT0FBTyxhQUFhLE1BQU0sbUNBQW1DLENBQUE7QUFFN0QsTUFBTSxDQUFDLE9BQU8sT0FBTyxzQ0FBc0M7SUFDekQ7Ozs7O09BS0c7SUFDSCxZQUFZLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDeEQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQTtJQUN4RCxDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDakMsQ0FBQztRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsY0FBYztRQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUNoRSx3REFBd0Q7UUFDeEQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLHdEQUF3RDtRQUN4RCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtRQUUzQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBRTFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pGLE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFLENBQUE7Z0JBRTFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUE7WUFDN0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFDLENBQUE7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFcEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLDZCQUE2QixDQUFDLENBQUE7UUFDcEksQ0FBQztRQUVELE1BQU0sdUJBQXVCLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUMxRCxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDM0YsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBRW5FLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3Qix1QkFBdUIsNEJBQTRCLENBQUMsQ0FBQTtRQUVwSCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUVoRSxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO1FBRWpHLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUMxRCxNQUFNLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtRQUU5RixJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sZ0JBQWdCLENBQUE7UUFFckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRTFELE1BQU0sMkJBQTJCLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDbkUsTUFBTSwyQkFBMkIsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUVsRSxNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxDQUFBO1FBRTdELHFDQUFxQztRQUNyQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQTtRQUVqQyxzRkFBc0Y7UUFDdEYsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUE7UUFFbEMsc0ZBQXNGO1FBQ3RGLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFBO1FBRTdCLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxlQUFlLEdBQUcsOEJBQThCLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7WUFFckYsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBRXhDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2dCQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUNuRyxJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksdUJBQXVCLENBQUM7Z0JBQUUsdUJBQXVCLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBRWhHLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBRUQsb0VBQW9FO1FBQ3BFLE1BQU0sYUFBYSxHQUFHLE1BQU0saUJBQWlCO2FBQzFDLEtBQUssQ0FBQyxFQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxzQkFBc0IsRUFBQyxDQUFDO2FBQ3BELE9BQU8sRUFBRSxDQUFBO1FBRVosOERBQThEO1FBQzlELE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFBO1FBRTVCLG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTlCLEtBQUssTUFBTSxZQUFZLElBQUksYUFBYSxFQUFFLENBQUM7WUFDekMsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtZQUM1RixNQUFNLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBRTFHLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQztnQkFBRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUE7WUFFdEUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzNDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDN0IsQ0FBQztRQUVELGlGQUFpRjtRQUNqRix3REFBd0Q7UUFDeEQsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBRXJCLElBQUksWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQTtZQUUzRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDM0MsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxDQUFBO1lBQ2xHLFlBQVksR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN0QyxDQUFDO1FBRUQsOEVBQThFO1FBQzlFLHNGQUFzRjtRQUN0RixNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQTtRQUVuQyxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHLDhCQUE4QixDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7WUFFekYsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLHdCQUF3QixDQUFDO2dCQUFFLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUVsRix3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDckQsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxLQUFLLE1BQU0sUUFBUSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDekMsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFOUMsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxlQUFlLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFBO2dCQUVqRSxLQUFLLE1BQU0sV0FBVyxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUMxQyxJQUFJLFFBQVEsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO3dCQUNuQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBQ2hELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLFVBQVUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFMUQsS0FBSyxNQUFNLEtBQUssSUFBSSx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQTtnQkFFOUYsd0VBQXdFO2dCQUN4RSx5RUFBeUU7Z0JBQ3pFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2dCQUNoRCxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFcEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLDZCQUE2QixDQUFDLENBQUE7UUFDcEksQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBRWhFLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUE7UUFFakcsTUFBTSxFQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBRXhGLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTyxnQkFBZ0IsQ0FBQTtRQUVyRCxxQ0FBcUM7UUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUE7UUFFakMsc0ZBQXNGO1FBQ3RGLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFBO1FBRWxDLHNGQUFzRjtRQUN0RixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQTtRQUU3QixLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pDLE1BQU0sZUFBZSxHQUFHLDhCQUE4QixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1lBRXJGLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUV4QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztnQkFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDbkcsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLHVCQUF1QixDQUFDO2dCQUFFLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUVoRyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFFcEIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLHNCQUFzQixDQUFBO1FBRTlDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtZQUUvRCxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUMxRSxDQUFDO1FBRUQsTUFBTSwyQkFBMkIsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtRQUV6RixJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFN0MsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUE7UUFFNUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFMUMsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUN2QyxNQUFNLGVBQWUsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtZQUUzRixrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDdkQsQ0FBQztRQUVELEtBQUssTUFBTSxVQUFVLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRTFELEtBQUssTUFBTSxLQUFLLElBQUksdUJBQXVCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUE7Z0JBRTlGLHdFQUF3RTtnQkFDeEUseUVBQXlFO2dCQUN6RSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtnQkFDaEQsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCBmcm9tIFwiLi9lbnN1cmUtbW9kZWwtY2xhc3MtaW5pdGlhbGl6ZWQuanNcIlxuaW1wb3J0IFByZWxvYWRlclNlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlQcmVsb2FkZXJIYXNNYW55IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5tb2RlbHMgLSBNb2RlbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL3JlbGF0aW9uc2hpcHMvaGFzLW1hbnkuanNcIikuZGVmYXVsdH0gYXJncy5yZWxhdGlvbnNoaXAgLSBSZWxhdGlvbnNoaXAuXG4gICAqIEBwYXJhbSB7UHJlbG9hZGVyU2VsZWN0aW9ufSBbYXJncy5zZWxlY3Rpb25dIC0gQ29sdW1uIHNlbGVjdGlvbiBhbmQgaWRlbXBvdGVuY3kgcnVsZXMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7bW9kZWxzLCByZWxhdGlvbnNoaXAsIHNlbGVjdGlvbiwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMubW9kZWxzID0gbW9kZWxzXG4gICAgdGhpcy5yZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiB8fCBuZXcgUHJlbG9hZGVyU2VsZWN0aW9uKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gLSBMb2FkZWQgdGFyZ2V0IG1vZGVscy4gKi9cbiAgYXN5bmMgcnVuKCkge1xuICAgIGlmICh0aGlzLnJlbGF0aW9uc2hpcC50aHJvdWdoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuVGhyb3VnaCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1bkRpcmVjdCgpXG4gIH1cblxuICAvKipcbiAgICogUGFydGl0aW9ucyBgdGhpcy5tb2RlbHNgIGludG8gdGhvc2UgYWxyZWFkeSBzYXRpc2ZpZWQgYnkgdGhlIGN1cnJlbnRcbiAgICogc2VsZWN0aW9uIChza2lwKSBhbmQgdGhvc2UgdGhhdCBzdGlsbCBuZWVkIGxvYWRpbmcuIFNhdGlzZmllZCBtb2RlbHMnXG4gICAqIGFscmVhZHktbG9hZGVkIHRhcmdldHMgYXJlIGNvbGxlY3RlZCBzbyBuZXN0ZWQgcHJlbG9hZHMga2VlcCB3b3JraW5nLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gdGFyZ2V0TW9kZWxDbGFzcyAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbWFwcGluZ0NvbHVtbnMgLSBDb2x1bW5zIHJlcXVpcmVkIGZvciBtYXBwaW5nIChmb3JlaWduIGtleSkuXG4gICAqIEByZXR1cm5zIHt7bW9kZWxzVG9Mb2FkOiBpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdLCBzYXRpc2ZpZWRUYXJnZXRzOiBpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfX0gLSBUaGUgcGFydGl0aW9uLlxuICAgKi9cbiAgX3BhcnRpdGlvbih0YXJnZXRNb2RlbENsYXNzLCBtYXBwaW5nQ29sdW1ucykge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3QgbW9kZWxzVG9Mb2FkID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3Qgc2F0aXNmaWVkVGFyZ2V0cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMubW9kZWxzKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZVJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTYXRpc2ZpZWQoe2luc3RhbmNlUmVsYXRpb25zaGlwLCB0YXJnZXRNb2RlbENsYXNzLCBtYXBwaW5nQ29sdW1uc30pKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IGluc3RhbmNlUmVsYXRpb25zaGlwLmdldExvYWRlZE9yVW5kZWZpbmVkKClcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsb2FkZWQpKSBzYXRpc2ZpZWRUYXJnZXRzLnB1c2goLi4ubG9hZGVkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kZWxzVG9Mb2FkLnB1c2gobW9kZWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHttb2RlbHNUb0xvYWQsIHNhdGlzZmllZFRhcmdldHN9XG4gIH1cblxuICAvKipcbiAgICogUHJlbG9hZCB0aHJvdWdoIGEgam9pbiB0YWJsZSAoZS5nLiBoYXNNYW55KFwiaW52b2ljZUdyb3Vwc1wiLCB7dGhyb3VnaDogXCJpbnZvaWNlR3JvdXBMaW5rc1wifSkpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gLSBMb2FkZWQgdGFyZ2V0IG1vZGVscy5cbiAgICovXG4gIGFzeW5jIF9ydW5UaHJvdWdoKCkge1xuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRQcmltYXJ5S2V5KClcblxuICAgIGlmICghcHJpbWFyeUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMucmVsYXRpb25zaGlwLmdldE1vZGVsQ2xhc3MoKS5uYW1lfSMke3RoaXMucmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX0gZG9lc24ndCBoYXZlIGEgcHJpbWFyeSBrZXlgKVxuICAgIH1cblxuICAgIGNvbnN0IHRocm91Z2hSZWxhdGlvbnNoaXBOYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0aGlzLnJlbGF0aW9uc2hpcC50aHJvdWdoKVxuICAgIGNvbnN0IHBhcmVudE1vZGVsQ2xhc3MgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRNb2RlbENsYXNzKClcbiAgICBjb25zdCB0aHJvdWdoUmVsYXRpb25zaGlwID0gcGFyZW50TW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUodGhyb3VnaFJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY29uc3QgdGhyb3VnaE1vZGVsQ2xhc3MgPSB0aHJvdWdoUmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgaWYgKCF0aHJvdWdoTW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGBUaHJvdWdoIHJlbGF0aW9uc2hpcCAke3Rocm91Z2hSZWxhdGlvbnNoaXBOYW1lfSBoYXMgbm8gdGFyZ2V0IG1vZGVsIGNsYXNzYClcblxuICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0IG1vZGVsIGNsYXNzIGNvdWxkIGJlIGdvdHRlbiBmcm9tIHJlbGF0aW9uc2hpcFwiKVxuXG4gICAgY29uc3QgdGFyZ2V0Rm9yZWlnbktleSA9IHRoaXMucmVsYXRpb25zaGlwLmdldEZvcmVpZ25LZXkoKVxuICAgIGNvbnN0IHttb2RlbHNUb0xvYWQsIHNhdGlzZmllZFRhcmdldHN9ID0gdGhpcy5fcGFydGl0aW9uKHRhcmdldE1vZGVsQ2xhc3MsIFt0YXJnZXRGb3JlaWduS2V5XSlcblxuICAgIGlmIChtb2RlbHNUb0xvYWQubGVuZ3RoID09IDApIHJldHVybiBzYXRpc2ZpZWRUYXJnZXRzXG5cbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgICBhd2FpdCBlbnN1cmVNb2RlbENsYXNzSW5pdGlhbGl6ZWQodGhyb3VnaE1vZGVsQ2xhc3MsIGNvbmZpZ3VyYXRpb24pXG4gICAgYXdhaXQgZW5zdXJlTW9kZWxDbGFzc0luaXRpYWxpemVkKHRhcmdldE1vZGVsQ2xhc3MsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICBjb25zdCB0aHJvdWdoRm9yZWlnbktleSA9IHRocm91Z2hSZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpXG5cbiAgICAvKiogQHR5cGUge0FycmF5PG51bWJlciB8IHN0cmluZz59ICovXG4gICAgY29uc3QgbW9kZWxzUHJpbWFyeUtleVZhbHVlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIgfCBzdHJpbmcsIEFycmF5PGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pj59ICovXG4gICAgY29uc3QgbW9kZWxzQnlQcmltYXJ5S2V5VmFsdWUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyIHwgc3RyaW5nLCBBcnJheTxpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD4+fSAqL1xuICAgIGNvbnN0IHByZWxvYWRDb2xsZWN0aW9ucyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVsc1RvTG9hZCkge1xuICAgICAgY29uc3QgcHJpbWFyeUtleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuXG4gICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbcHJpbWFyeUtleVZhbHVlXSA9IFtdXG5cbiAgICAgIGlmICghbW9kZWxzUHJpbWFyeUtleVZhbHVlcy5pbmNsdWRlcyhwcmltYXJ5S2V5VmFsdWUpKSBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzLnB1c2gocHJpbWFyeUtleVZhbHVlKVxuICAgICAgaWYgKCEocHJpbWFyeUtleVZhbHVlIGluIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlKSkgbW9kZWxzQnlQcmltYXJ5S2V5VmFsdWVbcHJpbWFyeUtleVZhbHVlXSA9IFtdXG5cbiAgICAgIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlW3ByaW1hcnlLZXlWYWx1ZV0ucHVzaChtb2RlbClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDE6IFF1ZXJ5IHRoZSB0aHJvdWdoIHRhYmxlIHRvIGJ1aWxkIHBhcmVudOKGknRhcmdldCBJRCBtYXBwaW5nXG4gICAgY29uc3QgdGhyb3VnaE1vZGVscyA9IGF3YWl0IHRocm91Z2hNb2RlbENsYXNzXG4gICAgICAud2hlcmUoe1t0aHJvdWdoRm9yZWlnbktleV06IG1vZGVsc1ByaW1hcnlLZXlWYWx1ZXN9KVxuICAgICAgLnRvQXJyYXkoKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBBcnJheTxzdHJpbmcgfCBudW1iZXI+Pn0gKi9cbiAgICBjb25zdCBwYXJlbnRUb1RhcmdldElkcyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmcgfCBudW1iZXI+fSAqL1xuICAgIGNvbnN0IGFsbFRhcmdldElkcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCB0aHJvdWdoTW9kZWwgb2YgdGhyb3VnaE1vZGVscykge1xuICAgICAgY29uc3QgcGFyZW50SWQgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKHRocm91Z2hNb2RlbC5yZWFkQ29sdW1uKHRocm91Z2hGb3JlaWduS2V5KSlcbiAgICAgIGNvbnN0IHRocm91Z2hJZCA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAodGhyb3VnaE1vZGVsLnJlYWRDb2x1bW4odGhyb3VnaE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpKSlcblxuICAgICAgaWYgKCEocGFyZW50SWQgaW4gcGFyZW50VG9UYXJnZXRJZHMpKSBwYXJlbnRUb1RhcmdldElkc1twYXJlbnRJZF0gPSBbXVxuXG4gICAgICBwYXJlbnRUb1RhcmdldElkc1twYXJlbnRJZF0ucHVzaCh0aHJvdWdoSWQpXG4gICAgICBhbGxUYXJnZXRJZHMuYWRkKHRocm91Z2hJZClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDI6IExvYWQgdGFyZ2V0IG1vZGVscyBieSB0aGUgZm9yZWlnbiBrZXkgdGhhdCBwb2ludHMgdG8gdGhlIHRocm91Z2ggdGFibGVcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgbGV0IHRhcmdldE1vZGVscyA9IFtdXG5cbiAgICBpZiAoYWxsVGFyZ2V0SWRzLnNpemUgPiAwKSB7XG4gICAgICBsZXQgcXVlcnkgPSB0YXJnZXRNb2RlbENsYXNzLndoZXJlKHtbdGFyZ2V0Rm9yZWlnbktleV06IFsuLi5hbGxUYXJnZXRJZHNdfSlcblxuICAgICAgcXVlcnkgPSB0aGlzLnJlbGF0aW9uc2hpcC5hcHBseVNjb3BlKHF1ZXJ5KVxuICAgICAgcXVlcnkgPSB0aGlzLnNlbGVjdGlvbi5hcHBseVRvUXVlcnkoe3F1ZXJ5LCB0YXJnZXRNb2RlbENsYXNzLCBtYXBwaW5nQ29sdW1uczogW3RhcmdldEZvcmVpZ25LZXldfSlcbiAgICAgIHRhcmdldE1vZGVscyA9IGF3YWl0IHF1ZXJ5LnRvQXJyYXkoKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogSW5kZXggdGFyZ2V0IG1vZGVscyBieSB0aGVpciBmb3JlaWduIGtleSAobWFwcyB0byB0aHJvdWdoIG1vZGVsIElEKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyB8IG51bWJlciwgQXJyYXk8aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+Pn0gKi9cbiAgICBjb25zdCB0YXJnZXRNb2RlbHNCeUZvcmVpZ25LZXkgPSB7fVxuXG4gICAgZm9yIChjb25zdCB0YXJnZXRNb2RlbCBvZiB0YXJnZXRNb2RlbHMpIHtcbiAgICAgIGNvbnN0IGZrVmFsdWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKHRhcmdldE1vZGVsLnJlYWRDb2x1bW4odGFyZ2V0Rm9yZWlnbktleSkpXG5cbiAgICAgIGlmICghKGZrVmFsdWUgaW4gdGFyZ2V0TW9kZWxzQnlGb3JlaWduS2V5KSkgdGFyZ2V0TW9kZWxzQnlGb3JlaWduS2V5W2ZrVmFsdWVdID0gW11cblxuICAgICAgdGFyZ2V0TW9kZWxzQnlGb3JlaWduS2V5W2ZrVmFsdWVdLnB1c2godGFyZ2V0TW9kZWwpXG4gICAgfVxuXG4gICAgLy8gU3RlcCA0OiBNYXAgdGFyZ2V0cyB0byBwYXJlbnRzIHZpYSB0aGUgdGhyb3VnaCBtYXBwaW5nXG4gICAgZm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRUb1RhcmdldElkcykge1xuICAgICAgY29uc3QgdGhyb3VnaElkcyA9IHBhcmVudFRvVGFyZ2V0SWRzW3BhcmVudElkXVxuXG4gICAgICBmb3IgKGNvbnN0IHRocm91Z2hJZCBvZiB0aHJvdWdoSWRzKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVGFyZ2V0cyA9IHRhcmdldE1vZGVsc0J5Rm9yZWlnbktleVt0aHJvdWdoSWRdIHx8IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXRNb2RlbCBvZiBtYXRjaGluZ1RhcmdldHMpIHtcbiAgICAgICAgICBpZiAocGFyZW50SWQgaW4gcHJlbG9hZENvbGxlY3Rpb25zKSB7XG4gICAgICAgICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbcGFyZW50SWRdLnB1c2godGFyZ2V0TW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtb2RlbFZhbHVlIGluIHByZWxvYWRDb2xsZWN0aW9ucykge1xuICAgICAgY29uc3QgcHJlbG9hZGVkQ29sbGVjdGlvbiA9IHByZWxvYWRDb2xsZWN0aW9uc1ttb2RlbFZhbHVlXVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlW21vZGVsVmFsdWVdKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUmVsYXRpb25zaGlwID0gbW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHRoaXMucmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSlcblxuICAgICAgICAvLyBSZXBsYWNlIHJhdGhlciB0aGFuIGFwcGVuZDogYG1vZGVsc1RvTG9hZGAgYXJlIGV4YWN0bHkgdGhlIHJlY29yZHMgd2VcbiAgICAgICAgLy8gaW50ZW5kIHRvIChyZSlsb2FkLCBzbyBhIGZvcmNlZCByZS1wcmVsb2FkIG11c3Qgbm90IGR1cGxpY2F0ZSBlbnRyaWVzLlxuICAgICAgICBtb2RlbFJlbGF0aW9uc2hpcC5zZXRMb2FkZWQocHJlbG9hZGVkQ29sbGVjdGlvbilcbiAgICAgICAgbW9kZWxSZWxhdGlvbnNoaXAuc2V0UHJlbG9hZGVkKHRydWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5zYXRpc2ZpZWRUYXJnZXRzLCAuLi50YXJnZXRNb2RlbHNdXG4gIH1cblxuICAvKipcbiAgICogUHJlbG9hZCBkaXJlY3QgaGFzLW1hbnkgcmVsYXRpb25zaGlwcy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IC0gTG9hZGVkIHRhcmdldCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyBfcnVuRGlyZWN0KCkge1xuICAgIGNvbnN0IGZvcmVpZ25LZXkgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KClcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0UHJpbWFyeUtleSgpXG5cbiAgICBpZiAoIXByaW1hcnlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLnJlbGF0aW9uc2hpcC5nZXRNb2RlbENsYXNzKCkubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9IGRvZXNuJ3QgaGF2ZSBhIHByaW1hcnkga2V5YClcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb3VsZCBiZSBnb3R0ZW4gZnJvbSByZWxhdGlvbnNoaXBcIilcblxuICAgIGNvbnN0IHttb2RlbHNUb0xvYWQsIHNhdGlzZmllZFRhcmdldHN9ID0gdGhpcy5fcGFydGl0aW9uKHRhcmdldE1vZGVsQ2xhc3MsIFtmb3JlaWduS2V5XSlcblxuICAgIGlmIChtb2RlbHNUb0xvYWQubGVuZ3RoID09IDApIHJldHVybiBzYXRpc2ZpZWRUYXJnZXRzXG5cbiAgICAvKiogQHR5cGUge0FycmF5PG51bWJlciB8IHN0cmluZz59ICovXG4gICAgY29uc3QgbW9kZWxzUHJpbWFyeUtleVZhbHVlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIgfCBzdHJpbmcsIEFycmF5PGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pj59ICovXG4gICAgY29uc3QgbW9kZWxzQnlQcmltYXJ5S2V5VmFsdWUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyIHwgc3RyaW5nLCBBcnJheTxpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD4+fSAqL1xuICAgIGNvbnN0IHByZWxvYWRDb2xsZWN0aW9ucyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVsc1RvTG9hZCkge1xuICAgICAgY29uc3QgcHJpbWFyeUtleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuXG4gICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbcHJpbWFyeUtleVZhbHVlXSA9IFtdXG5cbiAgICAgIGlmICghbW9kZWxzUHJpbWFyeUtleVZhbHVlcy5pbmNsdWRlcyhwcmltYXJ5S2V5VmFsdWUpKSBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzLnB1c2gocHJpbWFyeUtleVZhbHVlKVxuICAgICAgaWYgKCEocHJpbWFyeUtleVZhbHVlIGluIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlKSkgbW9kZWxzQnlQcmltYXJ5S2V5VmFsdWVbcHJpbWFyeUtleVZhbHVlXSA9IFtdXG5cbiAgICAgIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlW3ByaW1hcnlLZXlWYWx1ZV0ucHVzaChtb2RlbClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4+fSAqL1xuICAgIGNvbnN0IHdoZXJlQXJncyA9IHt9XG5cbiAgICB3aGVyZUFyZ3NbZm9yZWlnbktleV0gPSBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzXG5cbiAgICBpZiAodGhpcy5yZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkge1xuICAgICAgY29uc3QgdHlwZUNvbHVtbiA9IHRoaXMucmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljVHlwZUNvbHVtbigpXG5cbiAgICAgIHdoZXJlQXJnc1t0eXBlQ29sdW1uXSA9IHRoaXMucmVsYXRpb25zaGlwLmdldE1vZGVsQ2xhc3MoKS5nZXRNb2RlbE5hbWUoKVxuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCh0YXJnZXRNb2RlbENsYXNzLCB0aGlzLnJlbGF0aW9uc2hpcC5nZXRDb25maWd1cmF0aW9uKCkpXG5cbiAgICBsZXQgcXVlcnkgPSB0YXJnZXRNb2RlbENsYXNzLndoZXJlKHdoZXJlQXJncylcblxuICAgIHF1ZXJ5ID0gdGhpcy5yZWxhdGlvbnNoaXAuYXBwbHlTY29wZShxdWVyeSlcbiAgICBxdWVyeSA9IHRoaXMuc2VsZWN0aW9uLmFwcGx5VG9RdWVyeSh7cXVlcnksIHRhcmdldE1vZGVsQ2xhc3MsIG1hcHBpbmdDb2x1bW5zOiBbZm9yZWlnbktleV19KVxuXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldE1vZGVsIG9mIHRhcmdldE1vZGVscykge1xuICAgICAgY29uc3QgZm9yZWlnbktleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovICh0YXJnZXRNb2RlbC5yZWFkQ29sdW1uKGZvcmVpZ25LZXkpKVxuXG4gICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbZm9yZWlnbktleVZhbHVlXS5wdXNoKHRhcmdldE1vZGVsKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbW9kZWxWYWx1ZSBpbiBwcmVsb2FkQ29sbGVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHByZWxvYWRlZENvbGxlY3Rpb24gPSBwcmVsb2FkQ29sbGVjdGlvbnNbbW9kZWxWYWx1ZV1cblxuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZVttb2RlbFZhbHVlXSkge1xuICAgICAgICBjb25zdCBtb2RlbFJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZSh0aGlzLnJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpXG5cbiAgICAgICAgLy8gUmVwbGFjZSByYXRoZXIgdGhhbiBhcHBlbmQ6IGBtb2RlbHNUb0xvYWRgIGFyZSBleGFjdGx5IHRoZSByZWNvcmRzIHdlXG4gICAgICAgIC8vIGludGVuZCB0byAocmUpbG9hZCwgc28gYSBmb3JjZWQgcmUtcHJlbG9hZCBtdXN0IG5vdCBkdXBsaWNhdGUgZW50cmllcy5cbiAgICAgICAgbW9kZWxSZWxhdGlvbnNoaXAuc2V0TG9hZGVkKHByZWxvYWRlZENvbGxlY3Rpb24pXG4gICAgICAgIG1vZGVsUmVsYXRpb25zaGlwLnNldFByZWxvYWRlZCh0cnVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbLi4uc2F0aXNmaWVkVGFyZ2V0cywgLi4udGFyZ2V0TW9kZWxzXVxuICB9XG59XG4iXX0=
|
|
@@ -3,13 +3,17 @@ export default class VelociousDatabaseQueryPreloaderHasOne {
|
|
|
3
3
|
* @param {object} args - Options object.
|
|
4
4
|
* @param {Array<import("../../record/index.js").default>} args.models - Model instances.
|
|
5
5
|
* @param {import("../../record/relationships/has-one.js").default} args.relationship - Relationship.
|
|
6
|
+
* @param {PreloaderSelection} [args.selection] - Column selection and idempotency rules.
|
|
6
7
|
*/
|
|
7
|
-
constructor({ models, relationship, ...restArgs }: {
|
|
8
|
+
constructor({ models, relationship, selection, ...restArgs }: {
|
|
8
9
|
models: Array<import("../../record/index.js").default>;
|
|
9
10
|
relationship: import("../../record/relationships/has-one.js").default;
|
|
11
|
+
selection?: PreloaderSelection | undefined;
|
|
10
12
|
});
|
|
11
13
|
models: import("../../record/index.js").default[];
|
|
12
14
|
relationship: import("../../record/relationships/has-one.js").default;
|
|
15
|
+
selection: PreloaderSelection;
|
|
13
16
|
run(): Promise<import("../../record/index.js").default[]>;
|
|
14
17
|
}
|
|
18
|
+
import PreloaderSelection from "./selection.js";
|
|
15
19
|
//# sourceMappingURL=has-one.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"has-one.d.ts","sourceRoot":"","sources":["../../../../../src/database/query/preloader/has-one.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"has-one.d.ts","sourceRoot":"","sources":["../../../../../src/database/query/preloader/has-one.js"],"names":[],"mappings":"AAMA;IACE;;;;;OAKG;IACH,8DAJG;QAA6D,MAAM,EAA3D,KAAK,CAAC,OAAO,uBAAuB,EAAE,OAAO,CAAC;QACgB,YAAY,EAA1E,OAAO,uCAAuC,EAAE,OAAO;QAC7B,SAAS;KAC7C,EAOA;IAHC,kDAAoB;IACpB,sEAAgC;IAChC,8BAAsD;IAGxD,0DAmFC;CACF;+BAtG8B,gBAAgB"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import ensureModelClassInitialized from "./ensure-model-class-initialized.js";
|
|
3
|
+
import PreloaderSelection from "./selection.js";
|
|
3
4
|
import restArgsError from "../../../utils/rest-args-error.js";
|
|
4
5
|
export default class VelociousDatabaseQueryPreloaderHasOne {
|
|
5
6
|
/**
|
|
6
7
|
* @param {object} args - Options object.
|
|
7
8
|
* @param {Array<import("../../record/index.js").default>} args.models - Model instances.
|
|
8
9
|
* @param {import("../../record/relationships/has-one.js").default} args.relationship - Relationship.
|
|
10
|
+
* @param {PreloaderSelection} [args.selection] - Column selection and idempotency rules.
|
|
9
11
|
*/
|
|
10
|
-
constructor({ models, relationship, ...restArgs }) {
|
|
12
|
+
constructor({ models, relationship, selection, ...restArgs }) {
|
|
11
13
|
restArgsError(restArgs);
|
|
12
14
|
this.models = models;
|
|
13
15
|
this.relationship = relationship;
|
|
16
|
+
this.selection = selection || new PreloaderSelection();
|
|
14
17
|
}
|
|
15
18
|
async run() {
|
|
16
19
|
/** @type {Array<number | string>} */
|
|
@@ -19,9 +22,22 @@ export default class VelociousDatabaseQueryPreloaderHasOne {
|
|
|
19
22
|
const modelsByPrimaryKeyValue = {};
|
|
20
23
|
const foreignKey = this.relationship.getForeignKey();
|
|
21
24
|
const primaryKey = this.relationship.getPrimaryKey();
|
|
25
|
+
const relationshipName = this.relationship.getRelationshipName();
|
|
26
|
+
const targetModelClass = this.relationship.getTargetModelClass();
|
|
27
|
+
if (!targetModelClass)
|
|
28
|
+
throw new Error("No target model class could be gotten from relationship");
|
|
22
29
|
/** @type {Record<number | string, import("../../record/index.js").default | undefined>} */
|
|
23
30
|
const preloadCollections = {};
|
|
31
|
+
/** @type {import("../../record/index.js").default[]} */
|
|
32
|
+
const satisfiedTargets = [];
|
|
24
33
|
for (const model of this.models) {
|
|
34
|
+
const instanceRelationship = model.getRelationshipByName(relationshipName);
|
|
35
|
+
if (this.selection.isSatisfied({ instanceRelationship, targetModelClass, mappingColumns: [foreignKey] })) {
|
|
36
|
+
const loaded = /** @type {import("../../record/index.js").default | undefined} */ (instanceRelationship.getLoadedOrUndefined());
|
|
37
|
+
if (loaded)
|
|
38
|
+
satisfiedTargets.push(loaded);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
25
41
|
const primaryKeyValue = /** @type {string | number} */ (model.readColumn(primaryKey));
|
|
26
42
|
preloadCollections[primaryKeyValue] = undefined;
|
|
27
43
|
if (!modelsPrimaryKeyValues.includes(primaryKeyValue))
|
|
@@ -30,6 +46,8 @@ export default class VelociousDatabaseQueryPreloaderHasOne {
|
|
|
30
46
|
modelsByPrimaryKeyValue[primaryKeyValue] = [];
|
|
31
47
|
modelsByPrimaryKeyValue[primaryKeyValue].push(model);
|
|
32
48
|
}
|
|
49
|
+
if (modelsPrimaryKeyValues.length == 0)
|
|
50
|
+
return satisfiedTargets;
|
|
33
51
|
/** @type {Record<string, string | number | Array<string | number>>} */
|
|
34
52
|
const whereArgs = {};
|
|
35
53
|
whereArgs[foreignKey] = modelsPrimaryKeyValues;
|
|
@@ -37,13 +55,11 @@ export default class VelociousDatabaseQueryPreloaderHasOne {
|
|
|
37
55
|
const typeColumn = this.relationship.getPolymorphicTypeColumn();
|
|
38
56
|
whereArgs[typeColumn] = this.relationship.getModelClass().getModelName();
|
|
39
57
|
}
|
|
40
|
-
const targetModelClass = this.relationship.getTargetModelClass();
|
|
41
|
-
if (!targetModelClass)
|
|
42
|
-
throw new Error("No target model class could be gotten from relationship");
|
|
43
58
|
await ensureModelClassInitialized(targetModelClass, this.relationship.getConfiguration());
|
|
44
59
|
// Load target models to be preloaded on the given models
|
|
45
60
|
let query = targetModelClass.where(whereArgs);
|
|
46
61
|
query = this.relationship.applyScope(query);
|
|
62
|
+
query = this.selection.applyToQuery({ query, targetModelClass, mappingColumns: [foreignKey] });
|
|
47
63
|
const targetModels = await query.toArray();
|
|
48
64
|
for (const targetModel of targetModels) {
|
|
49
65
|
const foreignKeyValue = /** @type {string | number} */ (targetModel.readColumn(foreignKey));
|
|
@@ -53,12 +69,12 @@ export default class VelociousDatabaseQueryPreloaderHasOne {
|
|
|
53
69
|
for (const modelValue in preloadCollections) {
|
|
54
70
|
const preloadedModel = preloadCollections[modelValue];
|
|
55
71
|
for (const model of modelsByPrimaryKeyValue[modelValue]) {
|
|
56
|
-
const modelRelationship = model.getRelationshipByName(
|
|
72
|
+
const modelRelationship = model.getRelationshipByName(relationshipName);
|
|
57
73
|
modelRelationship.setPreloaded(true);
|
|
58
74
|
modelRelationship.setLoaded(preloadedModel);
|
|
59
75
|
}
|
|
60
76
|
}
|
|
61
|
-
return targetModels;
|
|
77
|
+
return [...satisfiedTargets, ...targetModels];
|
|
62
78
|
}
|
|
63
79
|
}
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLW9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9wcmVsb2FkZXIvaGFzLW9uZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTywyQkFBMkIsTUFBTSxxQ0FBcUMsQ0FBQTtBQUM3RSxPQUFPLGtCQUFrQixNQUFNLGdCQUFnQixDQUFBO0FBQy9DLE9BQU8sYUFBYSxNQUFNLG1DQUFtQyxDQUFBO0FBRTdELE1BQU0sQ0FBQyxPQUFPLE9BQU8scUNBQXFDO0lBQ3hEOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ3hELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUE7SUFDeEQsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHO1FBQ1AscUNBQXFDO1FBQ3JDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFBO1FBRWpDLHNGQUFzRjtRQUN0RixNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQTtRQUVsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFFaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFFaEUsSUFBSSxDQUFDLGdCQUFnQjtZ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TSxVQUFVLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVyRCxLQUFLLE1BQU0sS0FBSyxJQUFJLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLENBQUE7Z0JBRXZFLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDcEMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCBmcm9tIFwiLi9lbnN1cmUtbW9kZWwtY2xhc3MtaW5pdGlhbGl6ZWQuanNcIlxuaW1wb3J0IFByZWxvYWRlclNlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlQcmVsb2FkZXJIYXNPbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IGFyZ3MubW9kZWxzIC0gTW9kZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL3JlY29yZC9yZWxhdGlvbnNoaXBzL2hhcy1vbmUuanNcIikuZGVmYXVsdH0gYXJncy5yZWxhdGlvbnNoaXAgLSBSZWxhdGlvbnNoaXAuXG4gICAqIEBwYXJhbSB7UHJlbG9hZGVyU2VsZWN0aW9ufSBbYXJncy5zZWxlY3Rpb25dIC0gQ29sdW1uIHNlbGVjdGlvbiBhbmQgaWRlbXBvdGVuY3kgcnVsZXMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7bW9kZWxzLCByZWxhdGlvbnNoaXAsIHNlbGVjdGlvbiwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMubW9kZWxzID0gbW9kZWxzXG4gICAgdGhpcy5yZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiB8fCBuZXcgUHJlbG9hZGVyU2VsZWN0aW9uKClcbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICAvKiogQHR5cGUge0FycmF5PG51bWJlciB8IHN0cmluZz59ICovXG4gICAgY29uc3QgbW9kZWxzUHJpbWFyeUtleVZhbHVlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIgfCBzdHJpbmcsIEFycmF5PGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pj59ICovXG4gICAgY29uc3QgbW9kZWxzQnlQcmltYXJ5S2V5VmFsdWUgPSB7fVxuXG4gICAgY29uc3QgZm9yZWlnbktleSA9IHRoaXMucmVsYXRpb25zaGlwLmdldEZvcmVpZ25LZXkoKVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRQcmltYXJ5S2V5KClcbiAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpXG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb3VsZCBiZSBnb3R0ZW4gZnJvbSByZWxhdGlvbnNoaXBcIilcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciB8IHN0cmluZywgaW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQ+fSAqL1xuICAgIGNvbnN0IHByZWxvYWRDb2xsZWN0aW9ucyA9IHt9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3Qgc2F0aXNmaWVkVGFyZ2V0cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMubW9kZWxzKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZVJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTYXRpc2ZpZWQoe2luc3RhbmNlUmVsYXRpb25zaGlwLCB0YXJnZXRNb2RlbENsYXNzLCBtYXBwaW5nQ29sdW1uczogW2ZvcmVpZ25LZXldfSkpIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi8gKGluc3RhbmNlUmVsYXRpb25zaGlwLmdldExvYWRlZE9yVW5kZWZpbmVkKCkpXG5cbiAgICAgICAgaWYgKGxvYWRlZCkgc2F0aXNmaWVkVGFyZ2V0cy5wdXNoKGxvYWRlZClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpbWFyeUtleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuXG4gICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbcHJpbWFyeUtleVZhbHVlXSA9IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoIW1vZGVsc1ByaW1hcnlLZXlWYWx1ZXMuaW5jbHVkZXMocHJpbWFyeUtleVZhbHVlKSkgbW9kZWxzUHJpbWFyeUtleVZhbHVlcy5wdXNoKHByaW1hcnlLZXlWYWx1ZSlcbiAgICAgIGlmICghKHByaW1hcnlLZXlWYWx1ZSBpbiBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZSkpIG1vZGVsc0J5UHJpbWFyeUtleVZhbHVlW3ByaW1hcnlLZXlWYWx1ZV0gPSBbXVxuXG4gICAgICBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZVtwcmltYXJ5S2V5VmFsdWVdLnB1c2gobW9kZWwpXG4gICAgfVxuXG4gICAgaWYgKG1vZGVsc1ByaW1hcnlLZXlWYWx1ZXMubGVuZ3RoID09IDApIHJldHVybiBzYXRpc2ZpZWRUYXJnZXRzXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4+fSAqL1xuICAgIGNvbnN0IHdoZXJlQXJncyA9IHt9XG5cbiAgICB3aGVyZUFyZ3NbZm9yZWlnbktleV0gPSBtb2RlbHNQcmltYXJ5S2V5VmFsdWVzXG5cbiAgICBpZiAodGhpcy5yZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkge1xuICAgICAgY29uc3QgdHlwZUNvbHVtbiA9IHRoaXMucmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljVHlwZUNvbHVtbigpXG5cbiAgICAgIHdoZXJlQXJnc1t0eXBlQ29sdW1uXSA9IHRoaXMucmVsYXRpb25zaGlwLmdldE1vZGVsQ2xhc3MoKS5nZXRNb2RlbE5hbWUoKVxuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCh0YXJnZXRNb2RlbENsYXNzLCB0aGlzLnJlbGF0aW9uc2hpcC5nZXRDb25maWd1cmF0aW9uKCkpXG5cbiAgICAvLyBMb2FkIHRhcmdldCBtb2RlbHMgdG8gYmUgcHJlbG9hZGVkIG9uIHRoZSBnaXZlbiBtb2RlbHNcbiAgICBsZXQgcXVlcnkgPSB0YXJnZXRNb2RlbENsYXNzLndoZXJlKHdoZXJlQXJncylcblxuICAgIHF1ZXJ5ID0gdGhpcy5yZWxhdGlvbnNoaXAuYXBwbHlTY29wZShxdWVyeSlcbiAgICBxdWVyeSA9IHRoaXMuc2VsZWN0aW9uLmFwcGx5VG9RdWVyeSh7cXVlcnksIHRhcmdldE1vZGVsQ2xhc3MsIG1hcHBpbmdDb2x1bW5zOiBbZm9yZWlnbktleV19KVxuXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldE1vZGVsIG9mIHRhcmdldE1vZGVscykge1xuICAgICAgY29uc3QgZm9yZWlnbktleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovICh0YXJnZXRNb2RlbC5yZWFkQ29sdW1uKGZvcmVpZ25LZXkpKVxuXG4gICAgICBwcmVsb2FkQ29sbGVjdGlvbnNbZm9yZWlnbktleVZhbHVlXSA9IHRhcmdldE1vZGVsXG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSB0YXJnZXQgcHJlbG9hZGVkIG1vZGVscyBvbiB0aGUgZ2l2ZW4gbW9kZWxzXG4gICAgZm9yIChjb25zdCBtb2RlbFZhbHVlIGluIHByZWxvYWRDb2xsZWN0aW9ucykge1xuICAgICAgY29uc3QgcHJlbG9hZGVkTW9kZWwgPSBwcmVsb2FkQ29sbGVjdGlvbnNbbW9kZWxWYWx1ZV1cblxuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHNCeVByaW1hcnlLZXlWYWx1ZVttb2RlbFZhbHVlXSkge1xuICAgICAgICBjb25zdCBtb2RlbFJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICAgIG1vZGVsUmVsYXRpb25zaGlwLnNldFByZWxvYWRlZCh0cnVlKVxuICAgICAgICBtb2RlbFJlbGF0aW9uc2hpcC5zZXRMb2FkZWQocHJlbG9hZGVkTW9kZWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5zYXRpc2ZpZWRUYXJnZXRzLCAuLi50YXJnZXRNb2RlbHNdXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encapsulates the column selection and idempotency rules for preloading.
|
|
3
|
+
*
|
|
4
|
+
* Two per-target-model-name maps drive the behaviour, both keyed by the target
|
|
5
|
+
* model name (e.g. `"Account"`):
|
|
6
|
+
*
|
|
7
|
+
* - `preloadSelects` (from `.select({Account: ["id"]})`) narrows the columns
|
|
8
|
+
* loaded for that target to the listed attributes (plus the primary/foreign
|
|
9
|
+
* keys needed to map results back to their parents).
|
|
10
|
+
* - `preloadSelectsExtra` (from `.selectsExtra({Account: ["..."]})`) keeps the
|
|
11
|
+
* default `SELECT *` columns and loads the listed extra selects in addition.
|
|
12
|
+
*
|
|
13
|
+
* `force` re-loads relationships even when they are already preloaded.
|
|
14
|
+
*/
|
|
15
|
+
export default class VelociousDatabaseQueryPreloaderSelection {
|
|
16
|
+
/**
|
|
17
|
+
* @param {object} [args] - Options object.
|
|
18
|
+
* @param {Record<string, string[]>} [args.preloadSelects] - Narrowing selects keyed by target model name.
|
|
19
|
+
* @param {Record<string, string[]>} [args.preloadSelectsExtra] - Extra selects keyed by target model name.
|
|
20
|
+
* @param {boolean} [args.force] - Whether to re-load already-preloaded relationships.
|
|
21
|
+
*/
|
|
22
|
+
constructor({ preloadSelects, preloadSelectsExtra, force }?: {
|
|
23
|
+
preloadSelects?: Record<string, string[]> | undefined;
|
|
24
|
+
preloadSelectsExtra?: Record<string, string[]> | undefined;
|
|
25
|
+
force?: boolean | undefined;
|
|
26
|
+
});
|
|
27
|
+
preloadSelects: Record<string, string[]>;
|
|
28
|
+
preloadSelectsExtra: Record<string, string[]>;
|
|
29
|
+
force: boolean;
|
|
30
|
+
/** @returns {boolean} - Whether already-preloaded relationships should still be re-loaded. */
|
|
31
|
+
getForce(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* @param {typeof import("../../record/index.js").default} targetModelClass - Target model class.
|
|
34
|
+
* @returns {string[] | undefined} - Narrowing select attributes for the class, if any.
|
|
35
|
+
*/
|
|
36
|
+
_narrowingFor(targetModelClass: typeof import("../../record/index.js").default): string[] | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* @param {typeof import("../../record/index.js").default} targetModelClass - Target model class.
|
|
39
|
+
* @returns {string[] | undefined} - Extra select attributes/expressions for the class, if any.
|
|
40
|
+
*/
|
|
41
|
+
_extraFor(targetModelClass: typeof import("../../record/index.js").default): string[] | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Apply the configured select clauses to a target query.
|
|
44
|
+
* @template {import("../model-class-query.js").default} T
|
|
45
|
+
* @param {object} args - Options object.
|
|
46
|
+
* @param {T} args.query - Target query to apply selects to.
|
|
47
|
+
* @param {typeof import("../../record/index.js").default} args.targetModelClass - Target model class.
|
|
48
|
+
* @param {string[]} args.mappingColumns - Columns that must always be loaded so results can be mapped back to parents (primary/foreign keys).
|
|
49
|
+
* @returns {T} - The query, with selects applied when a selection is configured.
|
|
50
|
+
*/
|
|
51
|
+
applyToQuery<T extends import("../model-class-query.js").default>({ query, targetModelClass, mappingColumns }: {
|
|
52
|
+
query: T;
|
|
53
|
+
targetModelClass: typeof import("../../record/index.js").default;
|
|
54
|
+
mappingColumns: string[];
|
|
55
|
+
}): T;
|
|
56
|
+
/**
|
|
57
|
+
* Whether an already-preloaded relationship's loaded target(s) satisfy the
|
|
58
|
+
* configured selection, so the relationship can be skipped. Returns false
|
|
59
|
+
* when `force` is set, when the relationship hasn't been preloaded, or when a
|
|
60
|
+
* required column is missing from a loaded target.
|
|
61
|
+
* @param {object} args - Options object.
|
|
62
|
+
* @param {import("../../record/instance-relationships/base.js").default} args.instanceRelationship - The source model's instance relationship.
|
|
63
|
+
* @param {typeof import("../../record/index.js").default} args.targetModelClass - Target model class.
|
|
64
|
+
* @param {string[]} args.mappingColumns - Primary/foreign key columns required for mapping.
|
|
65
|
+
* @returns {boolean} - Whether the relationship is already satisfied.
|
|
66
|
+
*/
|
|
67
|
+
isSatisfied({ instanceRelationship, targetModelClass, mappingColumns }: {
|
|
68
|
+
instanceRelationship: import("../../record/instance-relationships/base.js").default;
|
|
69
|
+
targetModelClass: typeof import("../../record/index.js").default;
|
|
70
|
+
mappingColumns: string[];
|
|
71
|
+
}): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* The set of columns that must be present on a loaded target for it to count
|
|
74
|
+
* as satisfied. Returns null when satisfaction can't be verified (an extra
|
|
75
|
+
* select is a raw SQL expression whose resulting column can't be derived), in
|
|
76
|
+
* which case the relationship is always re-loaded.
|
|
77
|
+
* @param {object} args - Options object.
|
|
78
|
+
* @param {typeof import("../../record/index.js").default} args.targetModelClass - Target model class.
|
|
79
|
+
* @param {string[]} args.mappingColumns - Primary/foreign key columns required for mapping.
|
|
80
|
+
* @returns {string[] | null} - Required column names, or null when unverifiable.
|
|
81
|
+
*/
|
|
82
|
+
_requiredColumnsFor({ targetModelClass, mappingColumns }: {
|
|
83
|
+
targetModelClass: typeof import("../../record/index.js").default;
|
|
84
|
+
mappingColumns: string[];
|
|
85
|
+
}): string[] | null;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../../../src/database/query/preloader/selection.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH;IACE;;;;;OAKG;IACH,6DAJG;QAAwC,cAAc;QACd,mBAAmB;QACpC,KAAK;KAC9B,EAKA;IAHC,yCAAoC;IACpC,8CAA8C;IAC9C,eAAkB;IAGpB,8FAA8F;IAC9F,YADc,OAAO,CACW;IAEhC;;;OAGG;IACH,gCAHW,cAAc,uBAAuB,EAAE,OAAO,GAC5C,MAAM,EAAE,GAAG,SAAS,CAIhC;IAED;;;OAGG;IACH,4BAHW,cAAc,uBAAuB,EAAE,OAAO,GAC5C,MAAM,EAAE,GAAG,SAAS,CAIhC;IAED;;;;;;;;OAQG;IACH,aAPyD,CAAC,SAA7C,OAAQ,yBAAyB,EAAE,OAAQ,+CAErD;QAAgB,KAAK,EAAb,CAAC;QACoD,gBAAgB,EAArE,cAAc,uBAAuB,EAAE,OAAO;QAC/B,cAAc,EAA7B,MAAM,EAAE;KAChB,GAAU,CAAC,CAmBb;IAED;;;;;;;;;;OAUG;IACH,wEALG;QAA4E,oBAAoB,EAAxF,OAAO,6CAA6C,EAAE,OAAO;QACR,gBAAgB,EAArE,cAAc,uBAAuB,EAAE,OAAO;QAC/B,cAAc,EAA7B,MAAM,EAAE;KAChB,GAAU,OAAO,CAoBnB;IAED;;;;;;;;;OASG;IACH,0DAJG;QAA6D,gBAAgB,EAArE,cAAc,uBAAuB,EAAE,OAAO;QAC/B,cAAc,EAA7B,MAAM,EAAE;KAChB,GAAU,MAAM,EAAE,GAAG,IAAI,CAyB3B;CACF"}
|