angular-odata 0.130.0 → 0.131.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/angular-odata.mjs +2298 -2162
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
- package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
- package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
- package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
- package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
- package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
- package/lib/metadata/metadata.d.ts +2 -2
- package/lib/models/options.d.ts +2 -2
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +4 -3
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/resource.d.ts +5 -5
- package/lib/resources/types/action.d.ts +2 -2
- package/lib/resources/types/entity-set.d.ts +2 -2
- package/lib/resources/types/navigation-property.d.ts +2 -2
- package/lib/resources/types/property.d.ts +2 -2
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +2 -2
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +3 -3
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +3 -3
- package/lib/services/entity.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +76 -74
- package/lib/utils/odata.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -146
- package/esm2022/lib/api.mjs +0 -439
- package/esm2022/lib/cache/cache.mjs +0 -177
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -57
- package/esm2022/lib/client.mjs +0 -215
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -288
- package/esm2022/lib/index.mjs +0 -22
- package/esm2022/lib/loaders.mjs +0 -43
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -41
- package/esm2022/lib/metadata/parser.mjs +0 -564
- package/esm2022/lib/models/collection.mjs +0 -816
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -577
- package/esm2022/lib/models/options.mjs +0 -1227
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -91
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -66
- package/esm2022/lib/resources/path/handlers.mjs +0 -81
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -149
- package/esm2022/lib/resources/query/builder.mjs +0 -645
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
- package/esm2022/lib/resources/query/handlers.mjs +0 -423
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -140
- package/esm2022/lib/resources/request.mjs +0 -210
- package/esm2022/lib/resources/resource.mjs +0 -316
- package/esm2022/lib/resources/response.mjs +0 -180
- package/esm2022/lib/resources/types/action.mjs +0 -118
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -149
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -187
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -125
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -44
- package/esm2022/lib/schema/callable.mjs +0 -69
- package/esm2022/lib/schema/element.mjs +0 -70
- package/esm2022/lib/schema/entity-container.mjs +0 -13
- package/esm2022/lib/schema/entity-set.mjs +0 -11
- package/esm2022/lib/schema/enum-type.mjs +0 -69
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -123
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
- package/esm2022/lib/schema/schema.mjs +0 -52
- package/esm2022/lib/schema/singleton.mjs +0 -11
- package/esm2022/lib/schema/structured-type.mjs +0 -220
- package/esm2022/lib/services/base.mjs +0 -32
- package/esm2022/lib/services/entity-set.mjs +0 -161
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -39
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -55
- package/esm2022/lib/settings.mjs +0 -113
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
|
@@ -1,816 +0,0 @@
|
|
|
1
|
-
import { forkJoin, Observable, of, throwError } from 'rxjs';
|
|
2
|
-
import { defaultIfEmpty, finalize, map, switchMap } from 'rxjs/operators';
|
|
3
|
-
import { DEFAULT_VERSION } from '../constants';
|
|
4
|
-
import { ODataHelper } from '../helper';
|
|
5
|
-
import { ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
|
|
6
|
-
import { Types } from '../utils/types';
|
|
7
|
-
import { INCLUDE_DEEP, ODataModelEventEmitter, ODataModelEventType, ODataModelOptions, ODataModelState, } from './options';
|
|
8
|
-
import { ODataEntitiesAnnotations, ODataEntityAnnotations, } from '../annotations';
|
|
9
|
-
export class ODataCollection {
|
|
10
|
-
static model = null;
|
|
11
|
-
_parent = null;
|
|
12
|
-
_resource = null;
|
|
13
|
-
_resources = [];
|
|
14
|
-
_annotations;
|
|
15
|
-
_entries = [];
|
|
16
|
-
_model;
|
|
17
|
-
models() {
|
|
18
|
-
return this._entries
|
|
19
|
-
.filter((e) => e.state !== ODataModelState.Removed)
|
|
20
|
-
.map((e) => e.model);
|
|
21
|
-
}
|
|
22
|
-
get length() {
|
|
23
|
-
return this.models().length;
|
|
24
|
-
}
|
|
25
|
-
//Events
|
|
26
|
-
events$;
|
|
27
|
-
constructor(entities = [], { parent, resource, annots, model, reset = false, } = {}) {
|
|
28
|
-
const Klass = this.constructor;
|
|
29
|
-
if (!model && Klass.model !== null)
|
|
30
|
-
model = Klass.model;
|
|
31
|
-
if (!model)
|
|
32
|
-
throw new Error('Collection: Collection need model');
|
|
33
|
-
this._model = model;
|
|
34
|
-
// Events
|
|
35
|
-
this.events$ = new ODataModelEventEmitter({ collection: this });
|
|
36
|
-
this.events$.subscribe((e) => model.meta.events$.emit(e));
|
|
37
|
-
// Parent
|
|
38
|
-
if (parent !== undefined) {
|
|
39
|
-
this._parent = parent;
|
|
40
|
-
}
|
|
41
|
-
// Resource
|
|
42
|
-
if (this._parent === null && !resource)
|
|
43
|
-
resource = this._model.meta.collectionResourceFactory();
|
|
44
|
-
if (resource) {
|
|
45
|
-
this.attach(resource);
|
|
46
|
-
}
|
|
47
|
-
// Annotations
|
|
48
|
-
this._annotations =
|
|
49
|
-
annots ||
|
|
50
|
-
new ODataEntitiesAnnotations(ODataHelper[resource?.api?.options.version || DEFAULT_VERSION]);
|
|
51
|
-
entities = entities || [];
|
|
52
|
-
this.assign(entities, { reset });
|
|
53
|
-
}
|
|
54
|
-
isParentOf(child) {
|
|
55
|
-
return (child !== this &&
|
|
56
|
-
ODataModelOptions.chain(child).some((p) => p[0] === this));
|
|
57
|
-
}
|
|
58
|
-
resource() {
|
|
59
|
-
return ODataModelOptions.resource(this);
|
|
60
|
-
}
|
|
61
|
-
pushResource(resource) {
|
|
62
|
-
// Push current parent and resource
|
|
63
|
-
this._resources.push({ parent: this._parent, resource: this._resource });
|
|
64
|
-
// Replace parent and resource
|
|
65
|
-
this._parent = null;
|
|
66
|
-
this._resource = resource;
|
|
67
|
-
}
|
|
68
|
-
popResource() {
|
|
69
|
-
// Pop parent and resource
|
|
70
|
-
const pop = this._resources.pop();
|
|
71
|
-
if (pop !== undefined) {
|
|
72
|
-
const current = { parent: this._parent, resource: this._resource };
|
|
73
|
-
this._parent = pop.parent;
|
|
74
|
-
this._resource = pop.resource;
|
|
75
|
-
return current;
|
|
76
|
-
}
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
attach(resource) {
|
|
80
|
-
if (this._resource !== null &&
|
|
81
|
-
this._resource.outgoingType() !== resource.outgoingType() &&
|
|
82
|
-
!this._resource.isSubtypeOf(resource))
|
|
83
|
-
throw new Error(`attach: Can't reattach ${this._resource.outgoingType()} to ${resource.outgoingType()}`);
|
|
84
|
-
this._entries.forEach(({ model }) => {
|
|
85
|
-
const modelResource = this._model.meta.modelResourceFactory(resource.cloneQuery());
|
|
86
|
-
if (modelResource !== undefined)
|
|
87
|
-
model.attach(modelResource);
|
|
88
|
-
});
|
|
89
|
-
const current = this._resource;
|
|
90
|
-
if (current === null || !current.isEqualTo(resource)) {
|
|
91
|
-
this._resource = resource;
|
|
92
|
-
this.events$.trigger(ODataModelEventType.Attach, {
|
|
93
|
-
previous: current,
|
|
94
|
-
value: resource,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
withResource(resource, ctx) {
|
|
99
|
-
// Push
|
|
100
|
-
this.pushResource(resource);
|
|
101
|
-
// Execute
|
|
102
|
-
const result = ctx(this);
|
|
103
|
-
if (result instanceof Observable) {
|
|
104
|
-
return result.pipe(finalize(() => this.popResource()));
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// Pop
|
|
108
|
-
this.popResource();
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
asEntitySet(ctx) {
|
|
113
|
-
// Build new resource
|
|
114
|
-
const resource = this._model.meta.collectionResourceFactory(this._resource?.cloneQuery());
|
|
115
|
-
return this.withResource(resource, ctx);
|
|
116
|
-
}
|
|
117
|
-
annots() {
|
|
118
|
-
return this._annotations;
|
|
119
|
-
}
|
|
120
|
-
modelFactory(data, { reset = false } = {}) {
|
|
121
|
-
let Model = this._model;
|
|
122
|
-
const annots = new ODataEntityAnnotations(this._annotations.helper);
|
|
123
|
-
annots.update(data);
|
|
124
|
-
if (annots?.type !== undefined && Model.meta !== null) {
|
|
125
|
-
const schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.structuredType;
|
|
126
|
-
if (schema !== undefined && schema.model !== undefined)
|
|
127
|
-
// Change to child model
|
|
128
|
-
Model = schema.model;
|
|
129
|
-
}
|
|
130
|
-
return new Model(data, {
|
|
131
|
-
annots,
|
|
132
|
-
reset,
|
|
133
|
-
parent: [this, null],
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
toEntities({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_id = false, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
137
|
-
return this._entries
|
|
138
|
-
.filter(({ model, state }) => state !== ODataModelState.Removed && chain.every((c) => c !== model))
|
|
139
|
-
.map(({ model, state }) => {
|
|
140
|
-
var changesOnly = changes_only && state !== ODataModelState.Added;
|
|
141
|
-
return model.toEntity({
|
|
142
|
-
client_id,
|
|
143
|
-
include_navigation,
|
|
144
|
-
include_concurrency,
|
|
145
|
-
include_computed,
|
|
146
|
-
include_key,
|
|
147
|
-
include_id,
|
|
148
|
-
include_non_field,
|
|
149
|
-
field_mapping,
|
|
150
|
-
changes_only: changesOnly,
|
|
151
|
-
chain: [this, ...chain],
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
toJson() {
|
|
156
|
-
return this.toEntities(INCLUDE_DEEP);
|
|
157
|
-
}
|
|
158
|
-
hasChanged({ include_navigation } = {}) {
|
|
159
|
-
return (this._entries.some((e) => e.state !== ODataModelState.Unchanged) ||
|
|
160
|
-
this.models().some((m) => m.hasChanged({ include_navigation })));
|
|
161
|
-
}
|
|
162
|
-
clone() {
|
|
163
|
-
return new this.constructor(this.toEntities(INCLUDE_DEEP), {
|
|
164
|
-
resource: this.resource(),
|
|
165
|
-
annots: this.annots(),
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
_request(obs$, mapCallback) {
|
|
169
|
-
this.events$.trigger(ODataModelEventType.Request, {
|
|
170
|
-
options: { observable: obs$ },
|
|
171
|
-
});
|
|
172
|
-
return obs$.pipe(map((response) => mapCallback(response)), finalize(() => this.events$.trigger(ODataModelEventType.Sync)));
|
|
173
|
-
}
|
|
174
|
-
fetch({ add, merge, remove, withCount, ...options } = {}) {
|
|
175
|
-
const resource = this.resource();
|
|
176
|
-
if (!resource)
|
|
177
|
-
return throwError(() => new Error('fetch: Resource is null'));
|
|
178
|
-
const obs$ = resource instanceof ODataEntitySetResource
|
|
179
|
-
? resource.fetch({ withCount, ...options })
|
|
180
|
-
: resource.fetch({
|
|
181
|
-
responseType: 'entities',
|
|
182
|
-
withCount,
|
|
183
|
-
...options,
|
|
184
|
-
});
|
|
185
|
-
return this._request(obs$, ({ entities, annots }) => {
|
|
186
|
-
this._annotations = annots;
|
|
187
|
-
return entities !== null
|
|
188
|
-
? this.assign(entities, {
|
|
189
|
-
reset: true,
|
|
190
|
-
add: add ?? true,
|
|
191
|
-
merge: merge ?? true,
|
|
192
|
-
remove: remove ?? true,
|
|
193
|
-
})
|
|
194
|
-
: [];
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
fetchAll({ add, merge, remove, withCount, ...options } = {}) {
|
|
198
|
-
const resource = this.resource();
|
|
199
|
-
if (!resource)
|
|
200
|
-
return throwError(() => new Error('fetchAll: Resource is null'));
|
|
201
|
-
const obs$ = resource.fetchAll({ withCount, ...options });
|
|
202
|
-
return this._request(obs$, ({ entities, annots }) => {
|
|
203
|
-
this._annotations = annots;
|
|
204
|
-
return entities !== null
|
|
205
|
-
? this.assign(entities, {
|
|
206
|
-
reset: true,
|
|
207
|
-
add: add ?? true,
|
|
208
|
-
merge: merge ?? true,
|
|
209
|
-
remove: remove ?? true,
|
|
210
|
-
})
|
|
211
|
-
: [];
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
fetchMany(top, { add, merge, remove, withCount, ...options } = {}) {
|
|
215
|
-
const resource = this.resource();
|
|
216
|
-
if (!resource)
|
|
217
|
-
return throwError(() => new Error('fetchMany: Resource is null'));
|
|
218
|
-
resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
|
|
219
|
-
const obs$ = resource.fetchMany(top, { withCount, ...options });
|
|
220
|
-
return this._request(obs$, ({ entities, annots }) => {
|
|
221
|
-
this._annotations = annots;
|
|
222
|
-
return entities !== null
|
|
223
|
-
? this.assign(entities, {
|
|
224
|
-
reset: true,
|
|
225
|
-
add: add ?? true,
|
|
226
|
-
merge: merge ?? true,
|
|
227
|
-
remove: remove ?? false,
|
|
228
|
-
})
|
|
229
|
-
: [];
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
fetchOne({ add, merge, remove, withCount, ...options } = {}) {
|
|
233
|
-
const resource = this.resource();
|
|
234
|
-
if (!resource)
|
|
235
|
-
return throwError(() => new Error('fetchOne: Resource is null'));
|
|
236
|
-
resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
|
|
237
|
-
const obs$ = resource.fetchOne({ withCount, ...options });
|
|
238
|
-
return this._request(obs$, ({ entity, annots }) => {
|
|
239
|
-
this._annotations = annots;
|
|
240
|
-
return entity !== null
|
|
241
|
-
? this.assign([entity], {
|
|
242
|
-
reset: true,
|
|
243
|
-
add: add ?? true,
|
|
244
|
-
merge: merge ?? true,
|
|
245
|
-
remove: remove ?? false,
|
|
246
|
-
})[0]
|
|
247
|
-
: null;
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Save all models in the collection
|
|
252
|
-
* @param relModel The model is relationship
|
|
253
|
-
* @param method The method to use
|
|
254
|
-
* @param options HttpOptions
|
|
255
|
-
*/
|
|
256
|
-
save({ relModel = false, method, ...options } = {}) {
|
|
257
|
-
const resource = this.resource();
|
|
258
|
-
if (resource instanceof ODataPropertyResource)
|
|
259
|
-
return throwError(() => new Error('save: Resource is ODataPropertyResource'));
|
|
260
|
-
const toDestroyEntity = [];
|
|
261
|
-
const toRemoveReference = [];
|
|
262
|
-
const toDestroyContained = [];
|
|
263
|
-
const toCreateEntity = [];
|
|
264
|
-
const toAddReference = [];
|
|
265
|
-
const toCreateContained = [];
|
|
266
|
-
const toUpdateEntity = [];
|
|
267
|
-
const toUpdateContained = [];
|
|
268
|
-
this._entries.forEach(({ model, state }) => {
|
|
269
|
-
if (state === ODataModelState.Removed) {
|
|
270
|
-
if (relModel) {
|
|
271
|
-
toDestroyEntity.push(model);
|
|
272
|
-
}
|
|
273
|
-
else if (!model.isNew()) {
|
|
274
|
-
toRemoveReference.push(model);
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
toDestroyContained.push(model);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
else if (state === ODataModelState.Added) {
|
|
281
|
-
if (relModel) {
|
|
282
|
-
toCreateEntity.push(model);
|
|
283
|
-
}
|
|
284
|
-
else if (!model.isNew()) {
|
|
285
|
-
toAddReference.push(model);
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
toCreateContained.push(model);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
else if (model.hasChanged()) {
|
|
292
|
-
toUpdateEntity.push(model);
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
const obs$ = forkJoin([
|
|
296
|
-
...toDestroyEntity.map((m) => m.asEntity((e) => e.destroy(options))),
|
|
297
|
-
...toRemoveReference.map((m) => (this._model.meta.api.options.deleteRefBy === 'path'
|
|
298
|
-
? resource.key(m.key())
|
|
299
|
-
: resource)
|
|
300
|
-
.reference()
|
|
301
|
-
.remove(this._model.meta.api.options.deleteRefBy === 'id'
|
|
302
|
-
? m.asEntity((e) => e.resource())
|
|
303
|
-
: undefined, options)),
|
|
304
|
-
...toDestroyContained.map((m) => m.destroy(options)),
|
|
305
|
-
...toCreateEntity.map((m) => m.asEntity((e) => e.save({ method: 'create', ...options }))),
|
|
306
|
-
...toAddReference.map((m) => resource
|
|
307
|
-
.reference()
|
|
308
|
-
.add(m.asEntity((e) => e.resource()), options)),
|
|
309
|
-
...toCreateContained.map((m) => m.save({ method: 'create', ...options })),
|
|
310
|
-
...toUpdateEntity.map((m) => m.asEntity((e) => e.save({ method, ...options }))),
|
|
311
|
-
...toUpdateContained.map((m) => m.save({ method, ...options })),
|
|
312
|
-
]).pipe(defaultIfEmpty(null));
|
|
313
|
-
return this._request(obs$, () => {
|
|
314
|
-
this._entries = this._entries
|
|
315
|
-
.filter((entry) => entry.state !== ODataModelState.Removed)
|
|
316
|
-
.map((entry) => ({ ...entry, state: ODataModelState.Unchanged }));
|
|
317
|
-
return this.models();
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
_addServer(model, options) {
|
|
321
|
-
const resource = this.resource();
|
|
322
|
-
if (resource instanceof ODataNavigationPropertyResource) {
|
|
323
|
-
if (!model.isNew()) {
|
|
324
|
-
// Add Reference
|
|
325
|
-
return resource
|
|
326
|
-
.reference()
|
|
327
|
-
.add(model.asEntity((e) => e.resource()), options)
|
|
328
|
-
.pipe(map(() => model));
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
// Create Contained
|
|
332
|
-
return resource.create(model.toEntity(), options).pipe(map(({ entity }) => {
|
|
333
|
-
if (entity) {
|
|
334
|
-
model.assign(entity);
|
|
335
|
-
}
|
|
336
|
-
return model;
|
|
337
|
-
}));
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
else if (resource instanceof ODataEntitySetResource) {
|
|
341
|
-
return model.asEntity((e) => e.save({ method: 'create', ...options }));
|
|
342
|
-
}
|
|
343
|
-
else {
|
|
344
|
-
return of(model);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
_addModel(model, { silent = false, reset = false, reparent = false, merge = false, position, } = {}) {
|
|
348
|
-
let entry = this._findEntry(model);
|
|
349
|
-
if (entry !== undefined && entry.state !== ODataModelState.Removed) {
|
|
350
|
-
if (merge) {
|
|
351
|
-
entry.model.assign(model.toEntity(INCLUDE_DEEP));
|
|
352
|
-
}
|
|
353
|
-
return entry.model;
|
|
354
|
-
}
|
|
355
|
-
if (entry !== undefined && entry.state === ODataModelState.Removed) {
|
|
356
|
-
const index = this._entries.indexOf(entry);
|
|
357
|
-
this._entries.splice(index, 1);
|
|
358
|
-
}
|
|
359
|
-
// Create Entry
|
|
360
|
-
entry = {
|
|
361
|
-
state: reset ? ODataModelState.Unchanged : ODataModelState.Added,
|
|
362
|
-
model,
|
|
363
|
-
key: model.key(),
|
|
364
|
-
};
|
|
365
|
-
// Set Parent
|
|
366
|
-
if (reparent)
|
|
367
|
-
model._parent = [this, null];
|
|
368
|
-
// Subscribe
|
|
369
|
-
this._link(entry);
|
|
370
|
-
// If position is undefined and the collection is sorted, find the right position
|
|
371
|
-
if (position === undefined && this._sortBy !== null) {
|
|
372
|
-
for (let index = 0; index < this._entries.length; index++) {
|
|
373
|
-
if (this._compare(model, this._entries[index], this._sortBy, 0) < 0) {
|
|
374
|
-
position = index;
|
|
375
|
-
break;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
// Now add
|
|
380
|
-
if (position !== undefined)
|
|
381
|
-
this._entries.splice(position, 0, entry);
|
|
382
|
-
else
|
|
383
|
-
this._entries.push(entry);
|
|
384
|
-
if (!silent) {
|
|
385
|
-
model.events$.trigger(ODataModelEventType.Add, {
|
|
386
|
-
collection: this,
|
|
387
|
-
options: { index: position },
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
return entry.model;
|
|
391
|
-
}
|
|
392
|
-
add(model, { silent = false, reparent = false, server = true, merge = false, position, reset, } = {}) {
|
|
393
|
-
const _addModel = (m, reset) => this._addModel(m, { silent, position, merge, reparent, reset });
|
|
394
|
-
return server
|
|
395
|
-
? this._request(this._addServer(model), (model) => _addModel(model, reset ?? true))
|
|
396
|
-
: of(_addModel(model, reset ?? false));
|
|
397
|
-
}
|
|
398
|
-
_removeServer(model, options) {
|
|
399
|
-
let resource = this.resource();
|
|
400
|
-
if (resource instanceof ODataNavigationPropertyResource) {
|
|
401
|
-
if (!model.isNew()) {
|
|
402
|
-
// Remove Reference
|
|
403
|
-
const target = this._model.meta.api.options.deleteRefBy === 'id'
|
|
404
|
-
? model.asEntity((e) => e.resource())
|
|
405
|
-
: undefined;
|
|
406
|
-
if (this._model.meta.api.options.deleteRefBy === 'path') {
|
|
407
|
-
resource = resource.key(model.key());
|
|
408
|
-
}
|
|
409
|
-
return resource
|
|
410
|
-
.reference()
|
|
411
|
-
.remove(target, options)
|
|
412
|
-
.pipe(map(() => model));
|
|
413
|
-
}
|
|
414
|
-
else {
|
|
415
|
-
// Remove Contained
|
|
416
|
-
return resource.destroy(options).pipe(map(() => model));
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
else if (resource instanceof ODataEntitySetResource) {
|
|
420
|
-
return model.asEntity((e) => e.destroy(options));
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
423
|
-
return of(model);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
_removeModel(model, { silent = false, reset = false, } = {}) {
|
|
427
|
-
const entry = this._findEntry(model);
|
|
428
|
-
if (entry === undefined || entry.state === ODataModelState.Removed) {
|
|
429
|
-
return model;
|
|
430
|
-
}
|
|
431
|
-
// Now remove
|
|
432
|
-
const index = this._entries.indexOf(entry);
|
|
433
|
-
this._entries.splice(index, 1);
|
|
434
|
-
if (!(reset || entry.state === ODataModelState.Added)) {
|
|
435
|
-
// Move to end of array and mark as removed
|
|
436
|
-
entry.state = ODataModelState.Removed;
|
|
437
|
-
this._entries.push(entry);
|
|
438
|
-
}
|
|
439
|
-
// Trigger Event
|
|
440
|
-
if (!silent) {
|
|
441
|
-
model.events$.trigger(ODataModelEventType.Remove, {
|
|
442
|
-
collection: this,
|
|
443
|
-
options: { index: index },
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
this._unlink(entry);
|
|
447
|
-
return entry.model;
|
|
448
|
-
}
|
|
449
|
-
remove(model, { silent = false, server = true, reset, } = {}) {
|
|
450
|
-
const _removeModel = (m, reset) => this._removeModel(m, { silent, reset });
|
|
451
|
-
return server
|
|
452
|
-
? this._request(this._removeServer(model), (model) => _removeModel(model, reset ?? true))
|
|
453
|
-
: of(_removeModel(model, reset ?? false));
|
|
454
|
-
}
|
|
455
|
-
_moveModel(model, position) {
|
|
456
|
-
const entry = this._findEntry(model);
|
|
457
|
-
if (entry === undefined || entry.state === ODataModelState.Removed) {
|
|
458
|
-
return model;
|
|
459
|
-
}
|
|
460
|
-
// Now remove
|
|
461
|
-
const index = this._entries.indexOf(entry);
|
|
462
|
-
this._entries.splice(index, 1);
|
|
463
|
-
this._entries.splice(position, 0, entry);
|
|
464
|
-
return entry.model;
|
|
465
|
-
}
|
|
466
|
-
create(attrs = {}, { silent = false, server = true, } = {}) {
|
|
467
|
-
const model = this.modelFactory(attrs);
|
|
468
|
-
return (model.isValid() && server ? model.save() : of(model)).pipe(switchMap((model) => this.add(model, { silent, server })), map(() => model));
|
|
469
|
-
}
|
|
470
|
-
set(path, value, {}) {
|
|
471
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
472
|
-
if (pathArray.length === 0)
|
|
473
|
-
return undefined;
|
|
474
|
-
if (pathArray.length > 1) {
|
|
475
|
-
const model = this._entries[Number(pathArray[0])].model;
|
|
476
|
-
return model.set(pathArray.slice(1), value, {});
|
|
477
|
-
}
|
|
478
|
-
if (pathArray.length === 1 && ODataModelOptions.isModel(value)) {
|
|
479
|
-
const models = this.models();
|
|
480
|
-
const index = Number(pathArray[0]);
|
|
481
|
-
models[index] = value;
|
|
482
|
-
this.assign(models, { reparent: true });
|
|
483
|
-
return value;
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
get(path) {
|
|
487
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
488
|
-
if (pathArray.length === 0)
|
|
489
|
-
return undefined;
|
|
490
|
-
const value = this.models()[Number(pathArray[0])];
|
|
491
|
-
if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
|
|
492
|
-
return value.get(pathArray.slice(1));
|
|
493
|
-
}
|
|
494
|
-
return value;
|
|
495
|
-
}
|
|
496
|
-
has(path) {
|
|
497
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
498
|
-
if (pathArray.length === 0)
|
|
499
|
-
return false;
|
|
500
|
-
const value = this.models()[Number(pathArray[0])];
|
|
501
|
-
if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
|
|
502
|
-
return value.has(pathArray.slice(1));
|
|
503
|
-
}
|
|
504
|
-
return value !== undefined;
|
|
505
|
-
}
|
|
506
|
-
reset({ path, silent = false, } = {}) {
|
|
507
|
-
let toAdd = [];
|
|
508
|
-
let toChange = [];
|
|
509
|
-
let toRemove = [];
|
|
510
|
-
if (path !== undefined) {
|
|
511
|
-
// Reset by path
|
|
512
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
513
|
-
const index = Number(pathArray[0]);
|
|
514
|
-
if (!Number.isNaN(index)) {
|
|
515
|
-
const model = this.models()[index];
|
|
516
|
-
if (ODataModelOptions.isModel(model)) {
|
|
517
|
-
const entry = this._findEntry(model);
|
|
518
|
-
if (entry.state === ODataModelState.Unchanged &&
|
|
519
|
-
entry.model.hasChanged()) {
|
|
520
|
-
toChange = [entry];
|
|
521
|
-
}
|
|
522
|
-
path = pathArray.slice(1);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
else {
|
|
527
|
-
// Reset all
|
|
528
|
-
toAdd = this._entries.filter((e) => e.state === ODataModelState.Removed);
|
|
529
|
-
toChange = this._entries.filter((e) => e.state === ODataModelState.Unchanged && e.model.hasChanged());
|
|
530
|
-
toRemove = this._entries.filter((e) => e.state === ODataModelState.Added);
|
|
531
|
-
}
|
|
532
|
-
toRemove.forEach((entry) => {
|
|
533
|
-
this._removeModel(entry.model, { silent });
|
|
534
|
-
});
|
|
535
|
-
toAdd.forEach((entry) => {
|
|
536
|
-
this._addModel(entry.model, { silent });
|
|
537
|
-
});
|
|
538
|
-
toChange.forEach((entry) => {
|
|
539
|
-
entry.model.reset({ path, silent });
|
|
540
|
-
entry.state = ODataModelState.Unchanged;
|
|
541
|
-
});
|
|
542
|
-
if (!silent &&
|
|
543
|
-
(toAdd.length > 0 || toRemove.length > 0 || toChange.length > 0)) {
|
|
544
|
-
this.events$.trigger(ODataModelEventType.Reset, {
|
|
545
|
-
options: {
|
|
546
|
-
added: toAdd.map((e) => e.model),
|
|
547
|
-
removed: toRemove.map((e) => e.model),
|
|
548
|
-
changed: toChange.map((e) => e.model),
|
|
549
|
-
},
|
|
550
|
-
});
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
clear({ silent = false } = {}) {
|
|
554
|
-
const toRemove = this.models();
|
|
555
|
-
toRemove.forEach((m) => {
|
|
556
|
-
this._removeModel(m, { silent });
|
|
557
|
-
});
|
|
558
|
-
this._entries = [];
|
|
559
|
-
if (!silent) {
|
|
560
|
-
this.events$.trigger(ODataModelEventType.Update, {
|
|
561
|
-
options: { removed: toRemove },
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
assign(objects, { add = true, merge = true, remove = true, reset = false, reparent = false, silent = false, } = {}) {
|
|
566
|
-
const offset = remove ? 0 : this.length;
|
|
567
|
-
const models = [];
|
|
568
|
-
const toAdd = [];
|
|
569
|
-
const toMerge = [];
|
|
570
|
-
const toRemove = [];
|
|
571
|
-
objects.forEach((obj, index) => {
|
|
572
|
-
const model = ODataModelOptions.isModel(obj)
|
|
573
|
-
? obj
|
|
574
|
-
: this.modelFactory(obj, {
|
|
575
|
-
reset,
|
|
576
|
-
});
|
|
577
|
-
const position = index + offset;
|
|
578
|
-
// Try find entry
|
|
579
|
-
const entry = this._findEntry(model);
|
|
580
|
-
if (merge && entry !== undefined) {
|
|
581
|
-
if (entry.model !== model) {
|
|
582
|
-
entry.model.assign(model.toEntity({
|
|
583
|
-
client_id: true,
|
|
584
|
-
...INCLUDE_DEEP,
|
|
585
|
-
}), { add, merge, remove, reset, silent });
|
|
586
|
-
// Model Change?
|
|
587
|
-
if (entry.model.hasChanged())
|
|
588
|
-
toMerge.push(entry.model);
|
|
589
|
-
}
|
|
590
|
-
if (reset)
|
|
591
|
-
entry.state = ODataModelState.Unchanged;
|
|
592
|
-
if (!models.includes(entry.model)) {
|
|
593
|
-
models.push(entry.model);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
else if (add) {
|
|
597
|
-
// Add
|
|
598
|
-
toAdd.push(model);
|
|
599
|
-
this._addModel(model, { silent, reset, reparent, position });
|
|
600
|
-
models.push(model);
|
|
601
|
-
}
|
|
602
|
-
});
|
|
603
|
-
if (remove) {
|
|
604
|
-
[...this._entries].forEach((entry) => {
|
|
605
|
-
const model = entry.model;
|
|
606
|
-
if (!models.includes(model)) {
|
|
607
|
-
this._removeModel(model, { silent, reset });
|
|
608
|
-
toRemove.push(model);
|
|
609
|
-
}
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
if (this.models()
|
|
613
|
-
.slice(offset)
|
|
614
|
-
.some((m, i) => m !== models[i])) {
|
|
615
|
-
models.forEach((m, i) => this._moveModel(m, i));
|
|
616
|
-
this.events$.trigger(ODataModelEventType.Sort);
|
|
617
|
-
}
|
|
618
|
-
if (!silent &&
|
|
619
|
-
(toAdd.length > 0 || toRemove.length > 0 || toMerge.length > 0)) {
|
|
620
|
-
this.events$.trigger(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, {
|
|
621
|
-
options: {
|
|
622
|
-
added: toAdd,
|
|
623
|
-
removed: toRemove,
|
|
624
|
-
merged: toMerge,
|
|
625
|
-
},
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
return models;
|
|
629
|
-
}
|
|
630
|
-
query(ctx) {
|
|
631
|
-
const resource = this.resource();
|
|
632
|
-
if (resource) {
|
|
633
|
-
resource.query(ctx);
|
|
634
|
-
this.attach(resource);
|
|
635
|
-
}
|
|
636
|
-
return this;
|
|
637
|
-
}
|
|
638
|
-
callFunction(name, params, responseType, options = {}) {
|
|
639
|
-
const resource = this.resource();
|
|
640
|
-
if (!(resource instanceof ODataEntitySetResource))
|
|
641
|
-
return throwError(() => new Error("callFunction: Can't call function without ODataEntitySetResource"));
|
|
642
|
-
const func = resource.function(name).query((q) => q.restore(options));
|
|
643
|
-
switch (responseType) {
|
|
644
|
-
case 'property':
|
|
645
|
-
return this._request(func.callProperty(params, options), (resp) => resp);
|
|
646
|
-
case 'model':
|
|
647
|
-
return this._request(func.callModel(params, options), (resp) => resp);
|
|
648
|
-
case 'collection':
|
|
649
|
-
return this._request(func.callCollection(params, options), (resp) => resp);
|
|
650
|
-
default:
|
|
651
|
-
return this._request(func.call(params, { responseType, ...options }), (resp) => resp);
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
callAction(name, params, responseType, options = {}) {
|
|
655
|
-
const resource = this.resource();
|
|
656
|
-
if (!(resource instanceof ODataEntitySetResource)) {
|
|
657
|
-
return throwError(() => new Error(`callAction: Can't call action without ODataEntitySetResource`));
|
|
658
|
-
}
|
|
659
|
-
const action = resource.action(name).query((q) => q.restore(options));
|
|
660
|
-
switch (responseType) {
|
|
661
|
-
case 'property':
|
|
662
|
-
return this._request(action.callProperty(params, options), (resp) => resp);
|
|
663
|
-
case 'model':
|
|
664
|
-
return this._request(action.callModel(params, options), (resp) => resp);
|
|
665
|
-
case 'collection':
|
|
666
|
-
return this._request(action.callCollection(params, options), (resp) => resp);
|
|
667
|
-
default:
|
|
668
|
-
return this._request(action.call(params, { responseType, ...options }), (resp) => resp);
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
_unlink(entry) {
|
|
672
|
-
if (entry.subscription) {
|
|
673
|
-
entry.subscription.unsubscribe();
|
|
674
|
-
entry.subscription = undefined;
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
_link(entry) {
|
|
678
|
-
if (entry.subscription) {
|
|
679
|
-
throw new Error('Collection: Subscription already exists');
|
|
680
|
-
}
|
|
681
|
-
entry.subscription = entry.model.events$.subscribe((event) => {
|
|
682
|
-
if (event.canContinueWith(this)) {
|
|
683
|
-
if (event.model === entry.model) {
|
|
684
|
-
if (event.type === ODataModelEventType.Destroy) {
|
|
685
|
-
this._removeModel(entry.model, { reset: true });
|
|
686
|
-
}
|
|
687
|
-
else if (event.type === ODataModelEventType.Change &&
|
|
688
|
-
event.options?.key) {
|
|
689
|
-
entry.key = entry.model.key();
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
const index = event.options?.index ?? this.models().indexOf(entry.model);
|
|
693
|
-
this.events$.emit(event.push(this, index));
|
|
694
|
-
}
|
|
695
|
-
});
|
|
696
|
-
}
|
|
697
|
-
_findEntry(model) {
|
|
698
|
-
return this._entries.find((entry) => (entry.key !== undefined &&
|
|
699
|
-
model.key() !== undefined &&
|
|
700
|
-
Types.isEqual(entry.key, model.key())) ||
|
|
701
|
-
entry.model.equals(model));
|
|
702
|
-
}
|
|
703
|
-
// Collection functions
|
|
704
|
-
equals(other) {
|
|
705
|
-
return this === other;
|
|
706
|
-
}
|
|
707
|
-
get [Symbol.toStringTag]() {
|
|
708
|
-
return 'Collection';
|
|
709
|
-
}
|
|
710
|
-
[Symbol.iterator]() {
|
|
711
|
-
let pointer = 0;
|
|
712
|
-
const models = this.models();
|
|
713
|
-
return {
|
|
714
|
-
next() {
|
|
715
|
-
return {
|
|
716
|
-
done: pointer === models.length,
|
|
717
|
-
value: models[pointer++],
|
|
718
|
-
};
|
|
719
|
-
},
|
|
720
|
-
};
|
|
721
|
-
}
|
|
722
|
-
filter(predicate, thisArg) {
|
|
723
|
-
return this.models().filter(predicate, thisArg);
|
|
724
|
-
}
|
|
725
|
-
map(callbackfn, thisArg) {
|
|
726
|
-
return this.models().map(callbackfn, thisArg);
|
|
727
|
-
}
|
|
728
|
-
find(predicate) {
|
|
729
|
-
return this.models().find(predicate);
|
|
730
|
-
}
|
|
731
|
-
reduce(callbackfn, initialValue) {
|
|
732
|
-
return this.models().reduce(callbackfn, initialValue);
|
|
733
|
-
}
|
|
734
|
-
first() {
|
|
735
|
-
return this.models()[0];
|
|
736
|
-
}
|
|
737
|
-
last() {
|
|
738
|
-
const models = this.models();
|
|
739
|
-
return models[models.length - 1];
|
|
740
|
-
}
|
|
741
|
-
next(model) {
|
|
742
|
-
const index = this.indexOf(model);
|
|
743
|
-
if (index === -1 || index === this.length - 1) {
|
|
744
|
-
return undefined;
|
|
745
|
-
}
|
|
746
|
-
return this.get(index + 1);
|
|
747
|
-
}
|
|
748
|
-
prev(model) {
|
|
749
|
-
const index = this.indexOf(model);
|
|
750
|
-
if (index <= 0) {
|
|
751
|
-
return undefined;
|
|
752
|
-
}
|
|
753
|
-
return this.get(index - 1);
|
|
754
|
-
}
|
|
755
|
-
every(predicate) {
|
|
756
|
-
return this.models().every(predicate);
|
|
757
|
-
}
|
|
758
|
-
some(predicate) {
|
|
759
|
-
return this.models().some(predicate);
|
|
760
|
-
}
|
|
761
|
-
includes(model, start = 0) {
|
|
762
|
-
return this.some((m, i) => i >= start && m.equals(model));
|
|
763
|
-
}
|
|
764
|
-
indexOf(model) {
|
|
765
|
-
const models = this.models();
|
|
766
|
-
const m = models.find((m) => m.equals(model));
|
|
767
|
-
return !m ? -1 : models.indexOf(m);
|
|
768
|
-
}
|
|
769
|
-
forEach(predicate, thisArg) {
|
|
770
|
-
return this.models().forEach(predicate, thisArg);
|
|
771
|
-
}
|
|
772
|
-
isEmpty() {
|
|
773
|
-
// Local length == 0 and if exist remote count is 0 or undefined
|
|
774
|
-
return this.length === 0 && !this.annots().count;
|
|
775
|
-
}
|
|
776
|
-
//#region Sort
|
|
777
|
-
_compare(e1, e2, by, index) {
|
|
778
|
-
const m1 = ODataModelOptions.isModel(e1)
|
|
779
|
-
? e1
|
|
780
|
-
: e1.model;
|
|
781
|
-
const m2 = ODataModelOptions.isModel(e2)
|
|
782
|
-
? e2
|
|
783
|
-
: e2.model;
|
|
784
|
-
const value1 = m1.get(by[index].field);
|
|
785
|
-
const value2 = m2.get(by[index].field);
|
|
786
|
-
let result = 0;
|
|
787
|
-
if (value1 == null && value2 != null)
|
|
788
|
-
result = -1;
|
|
789
|
-
else if (value1 != null && value2 == null)
|
|
790
|
-
result = 1;
|
|
791
|
-
else if (value1 == null && value2 == null)
|
|
792
|
-
result = 0;
|
|
793
|
-
else if ((typeof value1 == 'string' || value1 instanceof String) && value1.localeCompare && value1 != value2)
|
|
794
|
-
result = value1.localeCompare(value2);
|
|
795
|
-
else if (value1 == value2)
|
|
796
|
-
return by.length - 1 > index ? this._compare(e1, e2, by, index + 1) : 0;
|
|
797
|
-
else if (by[index].comparator !== undefined)
|
|
798
|
-
result = by[index].comparator(value1, value2);
|
|
799
|
-
else {
|
|
800
|
-
result = value1 < value2 ? -1 : 1;
|
|
801
|
-
}
|
|
802
|
-
return (by[index].order ?? 1) * result;
|
|
803
|
-
}
|
|
804
|
-
_sortBy = null;
|
|
805
|
-
isSorted() {
|
|
806
|
-
return this._sortBy !== null;
|
|
807
|
-
}
|
|
808
|
-
sort(by, { silent } = {}) {
|
|
809
|
-
this._sortBy = by;
|
|
810
|
-
this._entries = this._entries.sort((e1, e2) => this._compare(e1, e2, by, 0));
|
|
811
|
-
if (!silent) {
|
|
812
|
-
this.events$.trigger(ODataModelEventType.Sort);
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUdMLHNCQUFzQixFQUV0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsWUFBWSxFQUlaLHNCQUFzQixFQUN0QixtQkFBbUIsRUFFbkIsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixzQkFBc0IsR0FDdkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLE9BQU8sZUFBZTtJQUcxQixNQUFNLENBQUMsS0FBSyxHQUE2QixJQUFJLENBQUM7SUFDOUMsT0FBTyxHQUtJLElBQUksQ0FBQztJQUNoQixTQUFTLEdBSUUsSUFBSSxDQUFDO0lBQ2hCLFVBQVUsR0FZSixFQUFFLENBQUM7SUFDVCxZQUFZLENBQStCO0lBQzNDLFFBQVEsR0FBNEIsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBb0I7SUFFMUIsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVE7YUFDakIsTUFBTSxDQUFDLENBQUMsQ0FB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QUFDO1lBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlZmF1bHRJZkVtcHR5LCBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgT0RhdGFBY3Rpb25PcHRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uT3B0aW9ucyxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEvc3RydWN0dXJlZC10eXBlJztcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFNb2RlbCB9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgSU5DTFVERV9ERUVQLFxuICBNb2RlbEZpZWxkT3B0aW9ucyxcbiAgT0RhdGFNb2RlbEVudHJ5LFxuICBPRGF0YU1vZGVsRXZlbnQsXG4gIE9EYXRhTW9kZWxFdmVudEVtaXR0ZXIsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgT0RhdGFNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxTdGF0ZSxcbn0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7XG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbn0gZnJvbSAnLi4vYW5ub3RhdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFDb2xsZWN0aW9uPFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PlxuICBpbXBsZW1lbnRzIEl0ZXJhYmxlPE0+XG57XG4gIHN0YXRpYyBtb2RlbDogdHlwZW9mIE9EYXRhTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgXVxuICAgIHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZXM6IHtcbiAgICBwYXJlbnQ6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgICAgXVxuICAgICAgfCBudWxsO1xuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGw7XG4gIH1bXSA9IFtdO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8VD47XG4gIF9lbnRyaWVzOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICBfbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsO1xuXG4gIG1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAubWFwKChlKSA9PiBlLm1vZGVsKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5sZW5ndGg7XG4gIH1cblxuICAvL0V2ZW50c1xuICBldmVudHMkOiBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+O1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdGllczogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSA9IFtdLFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgbW9kZWwsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtPRGF0YU1vZGVsPGFueT4sIE9EYXRhTW9kZWxGaWVsZDxhbnk+XTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGw7XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8VD47XG4gICAgICBtb2RlbD86IHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG4gICAgaWYgKCFtb2RlbCAmJiBLbGFzcy5tb2RlbCAhPT0gbnVsbCkgbW9kZWwgPSBLbGFzcy5tb2RlbDtcbiAgICBpZiAoIW1vZGVsKSB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb246IENvbGxlY3Rpb24gbmVlZCBtb2RlbCcpO1xuXG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcblxuICAgIC8vIEV2ZW50c1xuICAgIHRoaXMuZXZlbnRzJCA9IG5ldyBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+KHsgY29sbGVjdGlvbjogdGhpcyB9KTtcbiAgICB0aGlzLmV2ZW50cyQuc3Vic2NyaWJlKChlKSA9PiBtb2RlbCEubWV0YS5ldmVudHMkLmVtaXQoZSkpO1xuXG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VcbiAgICBpZiAodGhpcy5fcGFyZW50ID09PSBudWxsICYmICFyZXNvdXJjZSlcbiAgICAgIHJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KCkgYXNcbiAgICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuYXR0YWNoKFxuICAgICAgICByZXNvdXJjZSBhc1xuICAgICAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHRoaXMuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyB8fFxuICAgICAgbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyhcbiAgICAgICAgT0RhdGFIZWxwZXJbcmVzb3VyY2U/LmFwaT8ub3B0aW9ucy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTl0sXG4gICAgICApO1xuXG4gICAgZW50aXRpZXMgPSBlbnRpdGllcyB8fCBbXTtcbiAgICB0aGlzLmFzc2lnbihlbnRpdGllcywgeyByZXNldCB9KTtcbiAgfVxuXG4gIGlzUGFyZW50T2YoXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpLnNvbWUoKHApID0+IHBbMF0gPT09IHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIHJlc291cmNlKCk6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwge1xuICAgIHJldHVybiBPRGF0YU1vZGVsT3B0aW9ucy5yZXNvdXJjZTxUPih0aGlzKSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGw7XG4gIH1cblxuICBwdXNoUmVzb3VyY2UoXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbCxcbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGF0dGFjaChcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fcmVzb3VyY2UgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX3Jlc291cmNlLm91dGdvaW5nVHlwZSgpICE9PSByZXNvdXJjZS5vdXRnb2luZ1R5cGUoKSAmJlxuICAgICAgIXRoaXMuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGF0dGFjaDogQ2FuJ3QgcmVhdHRhY2ggJHt0aGlzLl9yZXNvdXJjZS5vdXRnb2luZ1R5cGUoKX0gdG8gJHtyZXNvdXJjZS5vdXRnb2luZ1R5cGUoKX1gLFxuICAgICAgKTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCB9KSA9PiB7XG4gICAgICBjb25zdCBtb2RlbFJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5tb2RlbFJlc291cmNlRmFjdG9yeShcbiAgICAgICAgcmVzb3VyY2UuY2xvbmVRdWVyeTxUPigpLFxuICAgICAgKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+O1xuICAgICAgaWYgKG1vZGVsUmVzb3VyY2UgIT09IHVuZGVmaW5lZCkgbW9kZWwuYXR0YWNoKG1vZGVsUmVzb3VyY2UpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX3Jlc291cmNlO1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8ICFjdXJyZW50LmlzRXF1YWxUbyhyZXNvdXJjZSkpIHtcbiAgICAgIHRoaXMuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkF0dGFjaCwge1xuICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgdmFsdWU6IHJlc291cmNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHdpdGhSZXNvdXJjZTxSPihcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBudWxsLFxuICAgIGN0eDogKGNvbGxlY3Rpb246IHRoaXMpID0+IFIsXG4gICk6IFIge1xuICAgIC8vIFB1c2hcbiAgICB0aGlzLnB1c2hSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgLy8gRXhlY3V0ZVxuICAgIGNvbnN0IHJlc3VsdCA9IGN0eCh0aGlzKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMucG9wUmVzb3VyY2UoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQb3BcbiAgICAgIHRoaXMucG9wUmVzb3VyY2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgYXNFbnRpdHlTZXQ8Uj4oY3R4OiAoY29sbGVjdGlvbjogdGhpcykgPT4gUik6IFIge1xuICAgIC8vIEJ1aWxkIG5ldyByZXNvdXJjZVxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgdGhpcy5fcmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKSxcbiAgICApIGFzXG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD47XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbW9kZWxGYWN0b3J5KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7IHJlc2V0ID0gZmFsc2UgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBNIHtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyh0aGlzLl9hbm5vdGF0aW9ucy5oZWxwZXIpO1xuICAgIGFubm90cy51cGRhdGUoZGF0YSk7XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gTW9kZWwubWV0YS5maW5kQ2hpbGRPcHRpb25zKChvKSA9PlxuICAgICAgICBvLmlzVHlwZU9mKGFubm90cy50eXBlIGFzIHN0cmluZyksXG4gICAgICApPy5zdHJ1Y3R1cmVkVHlwZTtcbiAgICAgIGlmIChzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiBzY2hlbWEubW9kZWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLy8gQ2hhbmdlIHRvIGNoaWxkIG1vZGVsXG4gICAgICAgIE1vZGVsID0gc2NoZW1hLm1vZGVsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSwge1xuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQsXG4gICAgICBwYXJlbnQ6IFt0aGlzLCBudWxsXSxcbiAgICB9KSBhcyBNO1xuICB9XG5cbiAgdG9FbnRpdGllcyh7XG4gICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgaW5jbHVkZV9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIGNoYWluID0gW10sXG4gIH06IHtcbiAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfaWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gIH0gPSB7fSk6IChQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoeyBtb2RlbCwgc3RhdGUgfSkgPT5cbiAgICAgICAgICBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQgJiYgY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHsgbW9kZWwsIHN0YXRlIH0pID0+IHtcbiAgICAgICAgdmFyIGNoYW5nZXNPbmx5ID0gY2hhbmdlc19vbmx5ICYmIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQ7XG4gICAgICAgIHJldHVybiBtb2RlbC50b0VudGl0eSh7XG4gICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICAgICAgaW5jbHVkZV9rZXksXG4gICAgICAgICAgaW5jbHVkZV9pZCxcbiAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgY2hhaW46IFt0aGlzLCAuLi5jaGFpbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdGllcyhJTkNMVURFX0RFRVApO1xuICB9XG5cbiAgaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2VudHJpZXMuc29tZSgoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCkgfHxcbiAgICAgIHRoaXMubW9kZWxzKCkuc29tZSgobSkgPT4gbS5oYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pKVxuICAgICk7XG4gIH1cblxuICBjbG9uZTxDIGV4dGVuZHMgT0RhdGFDb2xsZWN0aW9uPFQsIE0+PigpIHtcbiAgICByZXR1cm4gbmV3ICg8dHlwZW9mIE9EYXRhQ29sbGVjdGlvbj50aGlzLmNvbnN0cnVjdG9yKShcbiAgICAgIHRoaXMudG9FbnRpdGllcyhJTkNMVURFX0RFRVApLFxuICAgICAge1xuICAgICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSgpLFxuICAgICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCksXG4gICAgICB9LFxuICAgICkgYXMgQztcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3Q8VCwgUj4oXG4gICAgb2JzJDogT2JzZXJ2YWJsZTxUPixcbiAgICBtYXBDYWxsYmFjazogKHJlc3BvbnNlOiBUKSA9PiBSLFxuICApOiBPYnNlcnZhYmxlPFI+IHtcbiAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlJlcXVlc3QsIHtcbiAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiBtYXBDYWxsYmFjayhyZXNwb25zZSkpLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5TeW5jKSksXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICBhZGQsXG4gICAgbWVyZ2UsXG4gICAgcmVtb3ZlLFxuICAgIHdpdGhDb3VudCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBhZGQ/OiBib29sZWFuO1xuICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2g6IFJlc291cmNlIGlzIG51bGwnKSk7XG5cbiAgICBjb25zdCBvYnMkID1cbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICA/IHJlc291cmNlLmZldGNoKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pXG4gICAgICAgIDogcmVzb3VyY2UuZmV0Y2goe1xuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLFxuICAgICAgICAgICAgd2l0aENvdW50LFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICByZXR1cm4gZW50aXRpZXMgIT09IG51bGxcbiAgICAgICAgPyB0aGlzLmFzc2lnbihlbnRpdGllcywge1xuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgICAgICBhZGQ6IGFkZCA/PyB0cnVlLFxuICAgICAgICAgICAgbWVyZ2U6IG1lcmdlID8/IHRydWUsXG4gICAgICAgICAgICByZW1vdmU6IHJlbW92ZSA/PyB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgfSk7XG4gIH1cblxuICBmZXRjaEFsbCh7XG4gICAgYWRkLFxuICAgIG1lcmdlLFxuICAgIHJlbW92ZSxcbiAgICB3aXRoQ291bnQsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgYWRkPzogYm9vbGVhbjtcbiAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghcmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2ZldGNoQWxsOiBSZXNvdXJjZSBpcyBudWxsJykpO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoQWxsKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PiB7XG4gICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgIHJldHVybiBlbnRpdGllcyAhPT0gbnVsbFxuICAgICAgICA/IHRoaXMuYXNzaWduKGVudGl0aWVzLCB7XG4gICAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgICAgIGFkZDogYWRkID8/IHRydWUsXG4gICAgICAgICAgICBtZXJnZTogbWVyZ2UgPz8gdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZTogcmVtb3ZlID8/IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoTWFueShcbiAgICB0b3A6IG51bWJlcixcbiAgICB7XG4gICAgICBhZGQsXG4gICAgICBtZXJnZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIHdpdGhDb3VudCxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBhZGQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghcmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2ZldGNoTWFueTogUmVzb3VyY2UgaXMgbnVsbCcpKTtcblxuICAgIHJlc291cmNlLnF1ZXJ5KChxKSA9PlxuICAgICAgcmVtb3ZlIHx8IHRoaXMubGVuZ3RoID09IDAgPyBxLnNraXAoKS5jbGVhcigpIDogcS5za2lwKHRoaXMubGVuZ3RoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoTWFueSh0b3AsIHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PiB7XG4gICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgIHJldHVybiBlbnRpdGllcyAhPT0gbnVsbFxuICAgICAgICA/IHRoaXMuYXNzaWduKGVudGl0aWVzLCB7XG4gICAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgICAgIGFkZDogYWRkID8/IHRydWUsXG4gICAgICAgICAgICBtZXJnZTogbWVyZ2UgPz8gdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZTogcmVtb3ZlID8/IGZhbHNlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgfSk7XG4gIH1cblxuICBmZXRjaE9uZSh7XG4gICAgYWRkLFxuICAgIG1lcmdlLFxuICAgIHJlbW92ZSxcbiAgICB3aXRoQ291bnQsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgYWRkPzogYm9vbGVhbjtcbiAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdmZXRjaE9uZTogUmVzb3VyY2UgaXMgbnVsbCcpKTtcblxuICAgIHJlc291cmNlLnF1ZXJ5KChxKSA9PlxuICAgICAgcmVtb3ZlIHx8IHRoaXMubGVuZ3RoID09IDAgPyBxLnNraXAoKS5jbGVhcigpIDogcS5za2lwKHRoaXMubGVuZ3RoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoT25lKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICByZXR1cm4gZW50aXR5ICE9PSBudWxsXG4gICAgICAgID8gdGhpcy5hc3NpZ24oW2VudGl0eV0sIHtcbiAgICAgICAgICAgIHJlc2V0OiB0cnVlLFxuICAgICAgICAgICAgYWRkOiBhZGQgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1lcmdlOiBtZXJnZSA/PyB0cnVlLFxuICAgICAgICAgICAgcmVtb3ZlOiByZW1vdmUgPz8gZmFsc2UsXG4gICAgICAgICAgfSlbMF1cbiAgICAgICAgOiBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWxsIG1vZGVscyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gcmVsTW9kZWwgVGhlIG1vZGVsIGlzIHJlbGF0aW9uc2hpcFxuICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gdXNlXG4gICAqIEBwYXJhbSBvcHRpb25zIEh0dHBPcHRpb25zXG4gICAqL1xuICBzYXZlKHtcbiAgICByZWxNb2RlbCA9IGZhbHNlLFxuICAgIG1ldGhvZCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZWxNb2RlbD86IGJvb2xlYW47XG4gICAgbWV0aG9kPzogJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBSZXNvdXJjZSBpcyBPRGF0YVByb3BlcnR5UmVzb3VyY2UnKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCB0b0Rlc3Ryb3lFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvUmVtb3ZlUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBjb25zdCB0b0Rlc3Ryb3lDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvQ3JlYXRlRW50aXR5OiBNW10gPSBbXTtcbiAgICBjb25zdCB0b0FkZFJlZmVyZW5jZTogTVtdID0gW107XG4gICAgY29uc3QgdG9DcmVhdGVDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvVXBkYXRlRW50aXR5OiBNW10gPSBbXTtcbiAgICBjb25zdCB0b1VwZGF0ZUNvbnRhaW5lZDogTVtdID0gW107XG5cbiAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKHsgbW9kZWwsIHN0YXRlIH0pID0+IHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgICAgaWYgKHJlbE1vZGVsKSB7XG4gICAgICAgICAgdG9EZXN0cm95RW50aXR5LnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5pc05ldygpKSB7XG4gICAgICAgICAgdG9SZW1vdmVSZWZlcmVuY2UucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9EZXN0cm95Q29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpIHtcbiAgICAgICAgaWYgKHJlbE1vZGVsKSB7XG4gICAgICAgICAgdG9DcmVhdGVFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b0FkZFJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0NyZWF0ZUNvbnRhaW5lZC5wdXNoKG1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtb2RlbC5oYXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgdG9VcGRhdGVFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgb2JzJCA9IGZvcmtKb2luKFtcbiAgICAgIC4uLnRvRGVzdHJveUVudGl0eS5tYXAoKG0pID0+IG0uYXNFbnRpdHkoKGUpID0+IGUuZGVzdHJveShvcHRpb25zKSkpLFxuICAgICAgLi4udG9SZW1vdmVSZWZlcmVuY2UubWFwKChtKSA9PlxuICAgICAgICAodGhpcy5fbW9kZWwubWV0YS5hcGkub3B0aW9ucy5kZWxldGVSZWZCeSA9PT0gJ3BhdGgnXG4gICAgICAgICAgPyAocmVzb3VyY2UgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPikua2V5KG0ua2V5KCkpXG4gICAgICAgICAgOiAocmVzb3VyY2UgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPilcbiAgICAgICAgKVxuICAgICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAgIC5yZW1vdmUoXG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAnaWQnXG4gICAgICAgICAgICAgID8gKG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPilcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICksXG4gICAgICApLFxuICAgICAgLi4udG9EZXN0cm95Q29udGFpbmVkLm1hcCgobSkgPT4gbS5kZXN0cm95KG9wdGlvbnMpKSxcbiAgICAgIC4uLnRvQ3JlYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgbS5hc0VudGl0eSgoZSkgPT4gZS5zYXZlKHsgbWV0aG9kOiAnY3JlYXRlJywgLi4ub3B0aW9ucyB9KSksXG4gICAgICApLFxuICAgICAgLi4udG9BZGRSZWZlcmVuY2UubWFwKChtKSA9PlxuICAgICAgICAocmVzb3VyY2UgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPilcbiAgICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgICAuYWRkKFxuICAgICAgICAgICAgbS5hc0VudGl0eSgoZSkgPT4gZS5yZXNvdXJjZSgpKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIC4uLnRvQ3JlYXRlQ29udGFpbmVkLm1hcCgobSkgPT4gbS5zYXZlKHsgbWV0aG9kOiAnY3JlYXRlJywgLi4ub3B0aW9ucyB9KSksXG4gICAgICAuLi50b1VwZGF0ZUVudGl0eS5tYXAoKG0pID0+XG4gICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSksXG4gICAgICApLFxuICAgICAgLi4udG9VcGRhdGVDb250YWluZWQubWFwKChtKSA9PiBtLnNhdmUoeyBtZXRob2QsIC4uLm9wdGlvbnMgfSkpLFxuICAgIF0pLnBpcGUoZGVmYXVsdElmRW1wdHkobnVsbCkpO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICgpID0+IHtcbiAgICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiAoeyAuLi5lbnRyeSwgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgfSkpO1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRTZXJ2ZXIobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgLy8gQWRkIFJlZmVyZW5jZVxuICAgICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgICAuYWRkKFxuICAgICAgICAgICAgbW9kZWwuYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIENvbnRhaW5lZFxuICAgICAgICByZXR1cm4gcmVzb3VyY2UuY3JlYXRlKG1vZGVsLnRvRW50aXR5KCkgYXMgUGFydGlhbDxUPiwgb3B0aW9ucykucGlwZShcbiAgICAgICAgICBtYXAoKHsgZW50aXR5IH0pID0+IHtcbiAgICAgICAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgbW9kZWwuYXNzaWduKGVudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiBtb2RlbC5hc0VudGl0eSgoZSkgPT4gZS5zYXZlKHsgbWV0aG9kOiAnY3JlYXRlJywgLi4ub3B0aW9ucyB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZihtb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbixcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9LFxuICApOiBNIHtcbiAgICBsZXQgZW50cnkgPSB0aGlzLl9maW5kRW50cnkobW9kZWwpO1xuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIGVudHJ5Lm1vZGVsLmFzc2lnbihtb2RlbC50b0VudGl0eShJTkNMVURFX0RFRVApIGFzIFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICAgIH1cblxuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBFbnRyeVxuICAgIGVudHJ5ID0ge1xuICAgICAgc3RhdGU6IHJlc2V0ID8gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCA6IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCxcbiAgICAgIG1vZGVsLFxuICAgICAga2V5OiBtb2RlbC5rZXkoKSxcbiAgICB9O1xuICAgIC8vIFNldCBQYXJlbnRcbiAgICBpZiAocmVwYXJlbnQpIG1vZGVsLl9wYXJlbnQgPSBbdGhpcywgbnVsbF07XG5cbiAgICAvLyBTdWJzY3JpYmVcbiAgICB0aGlzLl9saW5rKGVudHJ5KTtcblxuICAgIC8vIElmIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIGNvbGxlY3Rpb24gaXMgc29ydGVkLCBmaW5kIHRoZSByaWdodCBwb3NpdGlvblxuICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3NvcnRCeSAhPT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2VudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21wYXJlKG1vZGVsLCB0aGlzLl9lbnRyaWVzW2luZGV4XSwgdGhpcy5fc29ydEJ5LCAwKSA8IDApIHtcbiAgICAgICAgICBwb3NpdGlvbiA9IGluZGV4O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm93IGFkZFxuICAgIGlmIChwb3NpdGlvbiAhPT0gdW5kZWZpbmVkKSB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuICAgIGVsc2UgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBtb2RlbC5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5BZGQsIHtcbiAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgb3B0aW9uczogeyBpbmRleDogcG9zaXRpb24gfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgfVxuXG4gIGFkZChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzZXJ2ZXIgPSB0cnVlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcmVzZXQsXG4gICAgfToge1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNlcnZlcj86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IF9hZGRNb2RlbCA9IChtOiBNLCByZXNldDogYm9vbGVhbikgPT5cbiAgICAgIHRoaXMuX2FkZE1vZGVsKG0sIHsgc2lsZW50LCBwb3NpdGlvbiwgbWVyZ2UsIHJlcGFyZW50LCByZXNldCB9KTtcbiAgICByZXR1cm4gc2VydmVyXG4gICAgICA/IHRoaXMuX3JlcXVlc3QodGhpcy5fYWRkU2VydmVyKG1vZGVsKSwgKG1vZGVsKSA9PlxuICAgICAgICAgIF9hZGRNb2RlbChtb2RlbCwgcmVzZXQgPz8gdHJ1ZSksXG4gICAgICAgIClcbiAgICAgIDogb2YoX2FkZE1vZGVsKG1vZGVsLCByZXNldCA/PyBmYWxzZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlU2VydmVyKG1vZGVsOiBNLCBvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAvLyBSZW1vdmUgUmVmZXJlbmNlXG4gICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgdGhpcy5fbW9kZWwubWV0YS5hcGkub3B0aW9ucy5kZWxldGVSZWZCeSA9PT0gJ2lkJ1xuICAgICAgICAgICAgPyAobW9kZWwuYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5fbW9kZWwubWV0YS5hcGkub3B0aW9ucy5kZWxldGVSZWZCeSA9PT0gJ3BhdGgnKSB7XG4gICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5rZXkobW9kZWwua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAgIC5yZW1vdmUodGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIENvbnRhaW5lZFxuICAgICAgICByZXR1cm4gcmVzb3VyY2UuZGVzdHJveShvcHRpb25zKS5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSB7XG4gICAgICByZXR1cm4gbW9kZWwuYXNFbnRpdHkoKGUpID0+IGUuZGVzdHJveShvcHRpb25zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZihtb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogTSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkobW9kZWwpO1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cblxuICAgIC8vIE5vdyByZW1vdmVcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICghKHJlc2V0IHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpKSB7XG4gICAgICAvLyBNb3ZlIHRvIGVuZCBvZiBhcnJheSBhbmQgbWFyayBhcyByZW1vdmVkXG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkO1xuICAgICAgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIEV2ZW50XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIG1vZGVsLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlJlbW92ZSwge1xuICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IGluZGV4OiBpbmRleCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICByZW1vdmUoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICBzZXJ2ZXIgPSB0cnVlLFxuICAgICAgcmVzZXQsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBjb25zdCBfcmVtb3ZlTW9kZWwgPSAobTogTSwgcmVzZXQ6IGJvb2xlYW4pID0+XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChtLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgcmV0dXJuIHNlcnZlclxuICAgICAgPyB0aGlzLl9yZXF1ZXN0KHRoaXMuX3JlbW92ZVNlcnZlcihtb2RlbCksIChtb2RlbCkgPT5cbiAgICAgICAgICBfcmVtb3ZlTW9kZWwobW9kZWwsIHJlc2V0ID8/IHRydWUpLFxuICAgICAgICApXG4gICAgICA6IG9mKF9yZW1vdmVNb2RlbChtb2RlbCwgcmVzZXQgPz8gZmFsc2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgX21vdmVNb2RlbChtb2RlbDogTSwgcG9zaXRpb246IG51bWJlcik6IE0ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KG1vZGVsKTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBOb3cgcmVtb3ZlXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuXG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgY3JlYXRlKFxuICAgIGF0dHJzOiBUID0ge30gYXMgVCxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRmFjdG9yeShhdHRycyk7XG4gICAgcmV0dXJuIChtb2RlbC5pc1ZhbGlkKCkgJiYgc2VydmVyID8gbW9kZWwuc2F2ZSgpIDogb2YobW9kZWwpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChtb2RlbCkgPT4gdGhpcy5hZGQobW9kZWwsIHsgc2lsZW50LCBzZXJ2ZXIgfSkpLFxuICAgICAgbWFwKCgpID0+IG1vZGVsKSxcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55LCB7fToge30gJiBNb2RlbEZpZWxkT3B0aW9ucykge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9lbnRyaWVzW051bWJlcihwYXRoQXJyYXlbMF0pXS5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBtb2RlbHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICB0aGlzLmFzc2lnbihtb2RlbHMsIHsgcmVwYXJlbnQ6IHRydWUgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IG51bWJlcik6IE0gfCB1bmRlZmluZWQ7XG4gIGdldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGFueTtcbiAgZ2V0KHBhdGg6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWxzKClbTnVtYmVyKHBhdGhBcnJheVswXSldO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDogbnVtYmVyIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1vZGVscygpW051bWJlcihwYXRoQXJyYXlbMF0pXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5oYXMocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzogc3RyaW5nIHwgc3RyaW5nW107IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgbGV0IHRvQWRkOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICAgIGxldCB0b0NoYW5nZTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG5cbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCBieSBwYXRoXG4gICAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICAgKSBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihpbmRleCkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscygpW2luZGV4XTtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkobW9kZWwpIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPjtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCAmJlxuICAgICAgICAgICAgZW50cnkubW9kZWwuaGFzQ2hhbmdlZCgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0b0NoYW5nZSA9IFtlbnRyeV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGggPSBwYXRoQXJyYXkuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzZXQgYWxsXG4gICAgICB0b0FkZCA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCk7XG4gICAgICB0b0NoYW5nZSA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKFxuICAgICAgICAoZSkgPT4gZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCAmJiBlLm1vZGVsLmhhc0NoYW5nZWQoKSxcbiAgICAgICk7XG4gICAgICB0b1JlbW92ZSA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpO1xuICAgIH1cblxuICAgIHRvUmVtb3ZlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChlbnRyeS5tb2RlbCwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKGVudHJ5Lm1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0b0NoYW5nZS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgZW50cnkubW9kZWwucmVzZXQoeyBwYXRoLCBzaWxlbnQgfSk7XG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQ7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIXNpbGVudCAmJlxuICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHwgdG9SZW1vdmUubGVuZ3RoID4gMCB8fCB0b0NoYW5nZS5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCwge1xuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYWRkZWQ6IHRvQWRkLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgICAgcmVtb3ZlZDogdG9SZW1vdmUubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICBjaGFuZ2VkOiB0b0NoYW5nZS5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoeyBzaWxlbnQgPSBmYWxzZSB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgY29uc3QgdG9SZW1vdmU6IE1bXSA9IHRoaXMubW9kZWxzKCk7XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwobSwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fZW50cmllcyA9IFtdO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSwge1xuICAgICAgICBvcHRpb25zOiB7IHJlbW92ZWQ6IHRvUmVtb3ZlIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgb2JqZWN0czogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSB8IE1bXSxcbiAgICB7XG4gICAgICBhZGQgPSB0cnVlLFxuICAgICAgbWVyZ2UgPSB0cnVlLFxuICAgICAgcmVtb3ZlID0gdHJ1ZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgYWRkPzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gcmVtb3ZlID8gMCA6IHRoaXMubGVuZ3RoO1xuXG4gICAgY29uc3QgbW9kZWxzOiBNW10gPSBbXTtcbiAgICBjb25zdCB0b0FkZDogTVtdID0gW107XG4gICAgY29uc3QgdG9NZXJnZTogTVtdID0gW107XG4gICAgY29uc3QgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG9iailcbiAgICAgICAgPyAob2JqIGFzIE0pXG4gICAgICAgIDogKHRoaXMubW9kZWxGYWN0b3J5KG9iaiBhcyBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sIHtcbiAgICAgICAgICAgIHJlc2V0LFxuICAgICAgICAgIH0pIGFzIE0pO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBpbmRleCArIG9mZnNldDtcbiAgICAgIC8vIFRyeSBmaW5kIGVudHJ5XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeShtb2RlbCk7XG5cbiAgICAgIGlmIChtZXJnZSAmJiBlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChlbnRyeS5tb2RlbCAhPT0gbW9kZWwpIHtcbiAgICAgICAgICBlbnRyeS5tb2RlbC5hc3NpZ24oXG4gICAgICAgICAgICBtb2RlbC50b0VudGl0eSh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZDogdHJ1ZSxcbiAgICAgICAgICAgICAgLi4uSU5DTFVERV9ERUVQLFxuICAgICAgICAgICAgfSkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAgICAgICAgICB7IGFkZCwgbWVyZ2UsIHJlbW92ZSwgcmVzZXQsIHNpbGVudCB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gTW9kZWwgQ2hhbmdlP1xuICAgICAgICAgIGlmIChlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKCkpIHRvTWVyZ2UucHVzaChlbnRyeS5tb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc2V0KSBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQ7XG4gICAgICAgIGlmICghbW9kZWxzLmluY2x1ZGVzKGVudHJ5Lm1vZGVsKSkge1xuICAgICAgICAgIG1vZGVscy5wdXNoKGVudHJ5Lm1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhZGQpIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIHRvQWRkLnB1c2gobW9kZWwpO1xuICAgICAgICB0aGlzLl9hZGRNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0LCByZXBhcmVudCwgcG9zaXRpb24gfSk7XG4gICAgICAgIG1vZGVscy5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIFsuLi50aGlzLl9lbnRyaWVzXS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IGVudHJ5Lm1vZGVsO1xuICAgICAgICBpZiAoIW1vZGVscy5pbmNsdWRlcyhtb2RlbCkpIHtcbiAgICAgICAgICB0aGlzLl9yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0IH0pO1xuICAgICAgICAgIHRvUmVtb3ZlLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm1vZGVscygpXG4gICAgICAgIC5zbGljZShvZmZzZXQpXG4gICAgICAgIC5zb21lKChtLCBpKSA9PiBtICE9PSBtb2RlbHNbaV0pXG4gICAgKSB7XG4gICAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4gdGhpcy5fbW92ZU1vZGVsKG0sIGkpKTtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuU29ydCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIXNpbGVudCAmJlxuICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHwgdG9SZW1vdmUubGVuZ3RoID4gMCB8fCB0b01lcmdlLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihcbiAgICAgICAgcmVzZXQgPyBPRGF0YU1vZGVsRXZlbnRUeXBlLlJlc2V0IDogT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBhZGRlZDogdG9BZGQsXG4gICAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZSxcbiAgICAgICAgICAgIG1lcmdlZDogdG9NZXJnZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIHF1ZXJ5KFxuICAgIGN0eDogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWQsXG4gICkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgcmVzb3VyY2UucXVlcnkoY3R4KTtcbiAgICAgIHRoaXMuYXR0YWNoKHJlc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjYWxsRnVuY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICBvcHRpb25zOiBPRGF0YUZ1bmN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImNhbGxGdW5jdGlvbjogQ2FuJ3QgY2FsbCBmdW5jdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VcIixcbiAgICAgICAgICApLFxuICAgICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5yZXN0b3JlKG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBmdW5jLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIG9wdGlvbnM6IE9EYXRhQWN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBjYWxsQWN0aW9uOiBDYW4ndCBjYWxsIGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VgLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5hY3Rpb248UCwgUj4obmFtZSkucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgYWN0aW9uLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyksIChyZXNwKSA9PiByZXNwKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdW5saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb246IFN1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBlbnRyeS5zdWJzY3JpcHRpb24gPSBlbnRyeS5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PFQ+KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5jYW5Db250aW51ZVdpdGgodGhpcykpIHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IGVudHJ5Lm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gT0RhdGFNb2RlbEV2ZW50VHlwZS5EZXN0cm95KSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgZXZlbnQudHlwZSA9PT0gT0RhdGFNb2RlbEV2ZW50VHlwZS5DaGFuZ2UgJiZcbiAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucz8ua2V5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZW50cnkua2V5ID0gZW50cnkubW9kZWwua2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5kZXggPVxuICAgICAgICAgICAgZXZlbnQub3B0aW9ucz8uaW5kZXggPz8gdGhpcy5tb2RlbHMoKS5pbmRleE9mKGVudHJ5Lm1vZGVsKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChldmVudC5wdXNoKHRoaXMsIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRFbnRyeShtb2RlbDogT0RhdGFNb2RlbDxUPikge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzLmZpbmQoXG4gICAgICAoZW50cnkpID0+XG4gICAgICAgIChlbnRyeS5rZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIG1vZGVsLmtleSgpICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBUeXBlcy5pc0VxdWFsKGVudHJ5LmtleSwgbW9kZWwua2V5KCkpKSB8fFxuICAgICAgICBlbnRyeS5tb2RlbC5lcXVhbHMobW9kZWwpLFxuICAgICk7XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uIGZ1bmN0aW9uc1xuICBlcXVhbHMob3RoZXI6IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzID09PSBvdGhlcjtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0NvbGxlY3Rpb24nO1xuICB9XG5cbiAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBwb2ludGVyID0gMDtcbiAgICBjb25zdCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCk6IEl0ZXJhdG9yUmVzdWx0PE0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkb25lOiBwb2ludGVyID09PSBtb2RlbHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbHNbcG9pbnRlcisrXSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSBhcyBJdGVyYXRvcjxNPjtcbiAgfVxuXG4gIGZpbHRlcihcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gdW5rbm93bixcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBNW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpO1xuICB9XG5cbiAgbWFwPFU+KFxuICAgIGNhbGxiYWNrZm46ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gVSxcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBVW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLm1hcChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcbiAgfVxuXG4gIGZpbmQoXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIG9iajogTVtdKSA9PiB1bmtub3duLFxuICApOiBNIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICByZWR1Y2U8VT4oXG4gICAgY2FsbGJhY2tmbjogKFxuICAgICAgcHJldmlvdXNWYWx1ZTogVSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogTSxcbiAgICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICAgICAgYXJyYXk6IE1bXSxcbiAgICApID0+IFUsXG4gICAgaW5pdGlhbFZhbHVlOiBVLFxuICApOiBVIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5yZWR1Y2UoY2FsbGJhY2tmbiwgaW5pdGlhbFZhbHVlKTtcbiAgfVxuXG4gIGZpcnN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpWzBdO1xuICB9XG5cbiAgbGFzdCgpOiBNIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiBtb2RlbHNbbW9kZWxzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgbmV4dChtb2RlbDogTSk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleE9mKG1vZGVsKTtcbiAgICBpZiAoaW5kZXggPT09IC0xIHx8IGluZGV4ID09PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldChpbmRleCArIDEpO1xuICB9XG5cbiAgcHJldihtb2RlbDogTSk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleE9mKG1vZGVsKTtcbiAgICBpZiAoaW5kZXggPD0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4IC0gMSk7XG4gIH1cblxuICBldmVyeShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZXZlcnkocHJlZGljYXRlKTtcbiAgfVxuXG4gIHNvbWUocHJlZGljYXRlOiAobTogTSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnNvbWUocHJlZGljYXRlKTtcbiAgfVxuXG4gIGluY2x1ZGVzKG1vZGVsOiBNLCBzdGFydDogbnVtYmVyID0gMCkge1xuICAgIHJldHVybiB0aGlzLnNvbWUoKG0sIGkpID0+IGkgPj0gc3RhcnQgJiYgbS5lcXVhbHMobW9kZWwpKTtcbiAgfVxuXG4gIGluZGV4T2YobW9kZWw6IE0pOiBudW1iZXIge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgY29uc3QgbSA9IG1vZGVscy5maW5kKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICAgIHJldHVybiAhbSA/IC0xIDogbW9kZWxzLmluZGV4T2YobSk7XG4gIH1cblxuICBmb3JFYWNoKFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBNLCBpbmRleDogbnVtYmVyLCBhcnJheTogTVtdKSA9PiB2b2lkLFxuICAgIHRoaXNBcmc/OiBhbnksXG4gICk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZvckVhY2gocHJlZGljYXRlLCB0aGlzQXJnKTtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7XG4gICAgLy8gTG9jYWwgbGVuZ3RoID09IDAgYW5kIGlmIGV4aXN0IHJlbW90ZSBjb3VudCBpcyAwIG9yIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5hbm5vdHMoKS5jb3VudDtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBTb3J0XG4gIHByaXZhdGUgX2NvbXBhcmUoXG4gICAgZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xOyBjb21wYXJhdG9yPzogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIgfVtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgbTEgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUxKVxuICAgICAgPyAoZTEgYXMgTSlcbiAgICAgIDogKGUxIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgY29uc3QgbTIgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUyKVxuICAgICAgPyAoZTIgYXMgTSlcbiAgICAgIDogKGUyIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgY29uc3QgdmFsdWUxID0gbTEuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IHZhbHVlMiA9IG0yLmdldChieVtpbmRleF0uZmllbGQgYXMgc3RyaW5nKTtcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xuXG4gICAgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiAhPSBudWxsKSByZXN1bHQgPSAtMTtcbiAgICBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbCkgcmVzdWx0ID0gMTtcbiAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbCkgcmVzdWx0ID0gMDtcbiAgICBlbHNlIGlmICgodHlwZW9mIHZhbHVlMSA9PSAnc3RyaW5nJyB8fCB2YWx1ZTEgaW5zdGFuY2VvZiBTdHJpbmcpICYmIHZhbHVlMS5sb2NhbGVDb21wYXJlICYmIHZhbHVlMSAhPSB2YWx1ZTIpXG4gICAgICByZXN1bHQgPSB2YWx1ZTEubG9jYWxlQ29tcGFyZSh2YWx1ZTIpO1xuICAgIGVsc2UgaWYgKHZhbHVlMSA9PSB2YWx1ZTIpXG4gICAgICByZXR1cm4gYnkubGVuZ3RoIC0gMSA+IGluZGV4ID8gdGhpcy5fY29tcGFyZShlMSwgZTIsIGJ5LCBpbmRleCArIDEpIDogMDtcbiAgICBlbHNlIGlmIChieVtpbmRleF0hLmNvbXBhcmF0b3IgIT09IHVuZGVmaW5lZClcbiAgICAgIHJlc3VsdCA9IGJ5W2luZGV4XS5jb21wYXJhdG9yISh2YWx1ZTEgYXMgVCwgdmFsdWUyIGFzIFQpO1xuICAgIGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdmFsdWUxIDwgdmFsdWUyID8gLTEgOiAxO1xuICAgIH1cblxuICAgIHJldHVybiAoYnlbaW5kZXhdLm9yZGVyID8/IDEpICogcmVzdWx0O1xuICB9XG5cbiAgX3NvcnRCeTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdIHwgbnVsbCA9IG51bGw7XG4gIGlzU29ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3J0QnkgIT09IG51bGw7XG4gIH1cblxuICBzb3J0KFxuICAgIGJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMTsgY29tcGFyYXRvcj86IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyIH1bXSxcbiAgICB7IHNpbGVudCB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLl9zb3J0QnkgPSBieTtcbiAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllcy5zb3J0KFxuICAgICAgKGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4sIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pID0+XG4gICAgICAgIHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgMCksXG4gICAgKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5Tb3J0KTtcbiAgICB9XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=
|