angular-odata 0.80.0 → 0.99.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/README.md +69 -34
- package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
- package/esm2020/lib/api.mjs +303 -0
- package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +3 -3
- package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
- package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +1 -1
- package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +2 -2
- package/esm2020/lib/client.mjs +271 -0
- package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +8 -3
- package/esm2020/lib/helper.mjs +268 -0
- package/esm2020/lib/index.mjs +19 -0
- package/esm2020/lib/models/collection.mjs +741 -0
- package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
- package/esm2020/lib/models/model.mjs +453 -0
- package/esm2020/lib/models/options.mjs +945 -0
- package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +7 -7
- package/esm2020/lib/options.mjs +32 -0
- package/esm2020/lib/resources/index.mjs +7 -0
- package/esm2020/lib/resources/path/handlers.mjs +69 -0
- package/esm2020/lib/resources/path/index.mjs +3 -0
- package/esm2020/lib/resources/path/segments.mjs +124 -0
- package/esm2020/lib/resources/query/builder.mjs +590 -0
- package/esm2020/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2020/lib/resources/query/expressions/compute.mjs +38 -0
- package/esm2020/lib/resources/query/expressions/expand.mjs +57 -0
- package/esm2020/lib/resources/query/expressions/filter.mjs +154 -0
- package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
- package/esm2020/lib/resources/query/expressions/orderby.mjs +54 -0
- package/esm2020/lib/resources/query/expressions/search.mjs +113 -0
- package/esm2020/lib/resources/query/expressions/select.mjs +32 -0
- package/esm2020/lib/resources/query/expressions/syntax.mjs +371 -0
- package/esm2020/lib/resources/query/handlers.mjs +188 -0
- package/esm2020/lib/resources/query/index.mjs +4 -0
- package/esm2020/lib/resources/query/options.mjs +103 -0
- package/esm2020/lib/resources/request.mjs +167 -0
- package/esm2020/lib/resources/resource.mjs +326 -0
- package/esm2020/lib/resources/responses/annotations.mjs +119 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
- package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
- package/esm2020/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +0 -0
- package/{esm2015/lib/resources/responses/response.js → esm2020/lib/resources/responses/response.mjs} +0 -0
- package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +0 -0
- package/esm2020/lib/resources/types/action.mjs +101 -0
- package/esm2020/lib/resources/types/batch.mjs +309 -0
- package/esm2020/lib/resources/types/count.mjs +27 -0
- package/esm2020/lib/resources/types/entity-set.mjs +94 -0
- package/esm2020/lib/resources/types/entity.mjs +106 -0
- package/esm2020/lib/resources/types/function.mjs +137 -0
- package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
- package/esm2020/lib/resources/types/media.mjs +41 -0
- package/esm2020/lib/resources/types/metadata.mjs +30 -0
- package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
- package/esm2020/lib/resources/types/options.mjs +2 -0
- package/esm2020/lib/resources/types/property.mjs +183 -0
- package/esm2020/lib/resources/types/reference.mjs +85 -0
- package/esm2020/lib/resources/types/singleton.mjs +126 -0
- package/esm2020/lib/resources/types/value.mjs +41 -0
- package/esm2020/lib/schema/annotation.mjs +37 -0
- package/esm2020/lib/schema/callable.mjs +62 -0
- package/esm2020/lib/schema/element.mjs +51 -0
- package/esm2020/lib/schema/entity-container.mjs +9 -0
- package/esm2020/lib/schema/entity-set.mjs +9 -0
- package/esm2020/lib/schema/enum-type.mjs +71 -0
- package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
- package/esm2020/lib/schema/parsers/callable.mjs +113 -0
- package/esm2020/lib/schema/parsers/edm.mjs +95 -0
- package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
- package/esm2020/lib/schema/parsers/index.mjs +5 -0
- package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
- package/esm2020/lib/schema/schema.mjs +61 -0
- package/esm2020/lib/schema/structured-type.mjs +198 -0
- package/esm2020/lib/services/base.mjs +29 -0
- package/esm2020/lib/services/entity-set.mjs +143 -0
- package/esm2020/lib/services/entity.mjs +12 -0
- package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
- package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
- package/esm2020/lib/services/singleton.mjs +48 -0
- package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
- package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
- package/esm2020/lib/types.mjs +37 -0
- package/esm2020/lib/utils/arraybuffers.mjs +46 -0
- package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
- package/esm2020/lib/utils/durations.mjs +40 -0
- package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
- package/esm2020/lib/utils/http.mjs +93 -0
- package/esm2020/lib/utils/index.mjs +10 -0
- package/esm2020/lib/utils/objects.mjs +195 -0
- package/esm2020/lib/utils/odata.mjs +22 -0
- package/esm2020/lib/utils/strings.mjs +20 -0
- package/esm2020/lib/utils/types.mjs +134 -0
- package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{angular-odata.js → angular-odata.mjs} +4508 -3427
- package/fesm2015/angular-odata.mjs.map +1 -0
- package/fesm2020/angular-odata.mjs +10510 -0
- package/fesm2020/angular-odata.mjs.map +1 -0
- package/lib/api.d.ts +14 -14
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/storage.d.ts +1 -1
- package/lib/client.d.ts +60 -9
- package/lib/constants.d.ts +5 -2
- package/lib/index.d.ts +0 -1
- package/lib/models/collection.d.ts +30 -42
- package/lib/models/model.d.ts +37 -30
- package/lib/models/options.d.ts +30 -38
- package/lib/module.d.ts +1 -1
- package/lib/options.d.ts +47 -0
- package/lib/resources/index.d.ts +2 -3
- package/lib/resources/path/handlers.d.ts +27 -0
- package/lib/resources/path/index.d.ts +2 -0
- package/lib/resources/{path-segments.d.ts → path/segments.d.ts} +4 -16
- package/lib/resources/{builder.d.ts → query/builder.d.ts} +12 -7
- package/lib/resources/query/expressions/base.d.ts +19 -0
- package/lib/resources/query/expressions/compute.d.ts +26 -0
- package/lib/resources/query/expressions/expand.d.ts +40 -0
- package/lib/resources/query/expressions/filter.d.ts +58 -0
- package/lib/resources/query/expressions/index.d.ts +6 -0
- package/lib/resources/query/expressions/orderby.d.ts +37 -0
- package/lib/resources/query/expressions/search.d.ts +47 -0
- package/lib/resources/query/expressions/select.d.ts +21 -0
- package/lib/resources/query/expressions/syntax.d.ts +177 -0
- package/lib/resources/query/handlers.d.ts +104 -0
- package/lib/resources/query/index.d.ts +3 -0
- package/lib/resources/query/options.d.ts +38 -0
- package/lib/resources/request.d.ts +4 -3
- package/lib/resources/resource.d.ts +42 -48
- package/lib/resources/types/action.d.ts +14 -61
- package/lib/resources/types/batch.d.ts +16 -3
- package/lib/resources/types/count.d.ts +9 -17
- package/lib/resources/types/entity-set.d.ts +12 -51
- package/lib/resources/types/entity.d.ts +13 -31
- package/lib/resources/types/function.d.ts +13 -60
- package/lib/resources/types/media.d.ts +9 -8
- package/lib/resources/types/metadata.d.ts +3 -5
- package/lib/resources/types/navigation-property.d.ts +74 -65
- package/lib/resources/types/options.d.ts +1 -1
- package/lib/resources/types/property.d.ts +49 -57
- package/lib/resources/types/reference.d.ts +65 -9
- package/lib/resources/types/singleton.d.ts +53 -31
- package/lib/resources/types/value.d.ts +16 -7
- package/lib/schema/annotation.d.ts +18 -0
- package/lib/schema/callable.d.ts +4 -20
- package/lib/schema/element.d.ts +39 -0
- package/lib/schema/entity-container.d.ts +2 -12
- package/lib/schema/entity-set.d.ts +2 -18
- package/lib/schema/enum-type.d.ts +19 -25
- package/lib/schema/index.d.ts +1 -0
- package/lib/{parsers → schema/parsers}/callable.d.ts +2 -2
- package/lib/schema/parsers/edm.d.ts +4 -0
- package/lib/{parsers → schema/parsers}/enum-type.d.ts +12 -11
- package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
- package/lib/{parsers → schema/parsers}/structured-type.d.ts +12 -12
- package/lib/schema/schema.d.ts +3 -10
- package/lib/schema/structured-type.d.ts +65 -27
- package/lib/services/base.d.ts +2 -2
- package/lib/services/entity-set.d.ts +5 -2
- package/lib/services/entity.d.ts +4 -1
- package/lib/services/singleton.d.ts +5 -2
- package/lib/settings.d.ts +5 -5
- package/lib/types.d.ts +1 -0
- package/lib/utils/arraybuffers.d.ts +4 -0
- package/lib/{parsers/edm.d.ts → utils/durations.d.ts} +3 -3
- package/lib/utils/http.d.ts +1 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/objects.d.ts +1 -0
- package/lib/utils/strings.d.ts +1 -0
- package/lib/utils/types.d.ts +2 -0
- package/package.json +21 -8
- package/bundles/angular-odata.umd.js +0 -11048
- package/bundles/angular-odata.umd.js.map +0 -1
- package/esm2015/lib/api.js +0 -297
- package/esm2015/lib/client.js +0 -221
- package/esm2015/lib/helper.js +0 -271
- package/esm2015/lib/index.js +0 -21
- package/esm2015/lib/models/collection.js +0 -687
- package/esm2015/lib/models/model.js +0 -423
- package/esm2015/lib/models/options.js +0 -909
- package/esm2015/lib/options.js +0 -31
- package/esm2015/lib/parsers/callable.js +0 -107
- package/esm2015/lib/parsers/edm.js +0 -192
- package/esm2015/lib/parsers/enum-type.js +0 -102
- package/esm2015/lib/parsers/index.js +0 -5
- package/esm2015/lib/parsers/structured-type.js +0 -389
- package/esm2015/lib/resources/builder.js +0 -537
- package/esm2015/lib/resources/index.js +0 -8
- package/esm2015/lib/resources/path-segments.js +0 -156
- package/esm2015/lib/resources/query-options.js +0 -157
- package/esm2015/lib/resources/request.js +0 -149
- package/esm2015/lib/resources/resource.js +0 -337
- package/esm2015/lib/resources/responses/annotations.js +0 -121
- package/esm2015/lib/resources/responses/metadata.js +0 -548
- package/esm2015/lib/resources/types/action.js +0 -180
- package/esm2015/lib/resources/types/batch.js +0 -288
- package/esm2015/lib/resources/types/count.js +0 -55
- package/esm2015/lib/resources/types/entity-set.js +0 -169
- package/esm2015/lib/resources/types/entity.js +0 -170
- package/esm2015/lib/resources/types/function.js +0 -205
- package/esm2015/lib/resources/types/media.js +0 -47
- package/esm2015/lib/resources/types/metadata.js +0 -36
- package/esm2015/lib/resources/types/navigation-property.js +0 -232
- package/esm2015/lib/resources/types/options.js +0 -2
- package/esm2015/lib/resources/types/property.js +0 -195
- package/esm2015/lib/resources/types/reference.js +0 -50
- package/esm2015/lib/resources/types/singleton.js +0 -159
- package/esm2015/lib/resources/types/value.js +0 -30
- package/esm2015/lib/schema/annotation.js +0 -7
- package/esm2015/lib/schema/callable.js +0 -82
- package/esm2015/lib/schema/entity-container.js +0 -22
- package/esm2015/lib/schema/entity-set.js +0 -33
- package/esm2015/lib/schema/enum-type.js +0 -101
- package/esm2015/lib/schema/schema.js +0 -60
- package/esm2015/lib/schema/structured-type.js +0 -148
- package/esm2015/lib/services/base.js +0 -23
- package/esm2015/lib/services/entity-set.js +0 -143
- package/esm2015/lib/services/entity.js +0 -10
- package/esm2015/lib/services/singleton.js +0 -46
- package/esm2015/lib/types.js +0 -37
- package/esm2015/lib/utils/http.js +0 -89
- package/esm2015/lib/utils/index.js +0 -9
- package/esm2015/lib/utils/objects.js +0 -139
- package/esm2015/lib/utils/odata.js +0 -21
- package/esm2015/lib/utils/strings.js +0 -13
- package/esm2015/lib/utils/types.js +0 -103
- package/fesm2015/angular-odata.js.map +0 -1
- package/lib/resources/query-options.d.ts +0 -57
|
@@ -1,909 +0,0 @@
|
|
|
1
|
-
import { __rest } from "tslib";
|
|
2
|
-
import { finalize } from 'rxjs/operators';
|
|
3
|
-
import { COMPUTED, DEFAULT_VERSION, OPTIMISTIC_CONCURRENCY, } from '../constants';
|
|
4
|
-
import { ODataHelper } from '../helper';
|
|
5
|
-
import { ODataParserOptions } from '../options';
|
|
6
|
-
import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPathSegments, ODataPropertyResource, ODataQueryOptions, } from '../resources';
|
|
7
|
-
import { Objects, Types } from '../utils';
|
|
8
|
-
export const CID = '_cid';
|
|
9
|
-
export class ODataModelEvent {
|
|
10
|
-
constructor(name, { model, collection, previous, value, track, options, } = {}) {
|
|
11
|
-
this.bubbling = true;
|
|
12
|
-
this.name = name;
|
|
13
|
-
this.model = model;
|
|
14
|
-
this.collection = collection;
|
|
15
|
-
this.previous = previous;
|
|
16
|
-
this.value = value;
|
|
17
|
-
this.options = options;
|
|
18
|
-
this.chain = [
|
|
19
|
-
[
|
|
20
|
-
this.collection ||
|
|
21
|
-
this.model,
|
|
22
|
-
track || null,
|
|
23
|
-
],
|
|
24
|
-
];
|
|
25
|
-
}
|
|
26
|
-
stopPropagation() {
|
|
27
|
-
this.bubbling = false;
|
|
28
|
-
}
|
|
29
|
-
push(model, track) {
|
|
30
|
-
this.chain.splice(0, 0, [model, track]);
|
|
31
|
-
}
|
|
32
|
-
visited(model) {
|
|
33
|
-
return this.chain.some((c) => c[0] === model);
|
|
34
|
-
}
|
|
35
|
-
get path() {
|
|
36
|
-
return this.chain
|
|
37
|
-
.map(([, track], index) => typeof track === 'number'
|
|
38
|
-
? `[${track}]`
|
|
39
|
-
: typeof track === 'string'
|
|
40
|
-
? index === 0
|
|
41
|
-
? track
|
|
42
|
-
: `.${track}`
|
|
43
|
-
: '')
|
|
44
|
-
.join('');
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export const BUBBLING = [
|
|
48
|
-
'change',
|
|
49
|
-
'reset',
|
|
50
|
-
'update',
|
|
51
|
-
'destroy',
|
|
52
|
-
'add',
|
|
53
|
-
'remove',
|
|
54
|
-
];
|
|
55
|
-
export const INCLUDE_SHALLOW = {
|
|
56
|
-
include_concurrency: true,
|
|
57
|
-
include_computed: true,
|
|
58
|
-
include_key: true,
|
|
59
|
-
};
|
|
60
|
-
export const INCLUDE_DEEP = Object.assign({ include_navigation: true, include_non_field: true }, INCLUDE_SHALLOW);
|
|
61
|
-
export var ODataModelState;
|
|
62
|
-
(function (ODataModelState) {
|
|
63
|
-
ODataModelState[ODataModelState["Added"] = 0] = "Added";
|
|
64
|
-
ODataModelState[ODataModelState["Removed"] = 1] = "Removed";
|
|
65
|
-
ODataModelState[ODataModelState["Changed"] = 2] = "Changed";
|
|
66
|
-
ODataModelState[ODataModelState["Unchanged"] = 3] = "Unchanged";
|
|
67
|
-
})(ODataModelState || (ODataModelState = {}));
|
|
68
|
-
export function Model({ cid = CID } = {}) {
|
|
69
|
-
return (constructor) => {
|
|
70
|
-
const Klass = constructor;
|
|
71
|
-
if (!Klass.hasOwnProperty('options'))
|
|
72
|
-
Klass.options = { fields: {} };
|
|
73
|
-
Klass.options.cid = cid;
|
|
74
|
-
return constructor;
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
export function ModelField(_a = {}) {
|
|
78
|
-
var { name } = _a, options = __rest(_a, ["name"]);
|
|
79
|
-
return (target, key) => {
|
|
80
|
-
const Klass = target.constructor;
|
|
81
|
-
if (!Klass.hasOwnProperty('options'))
|
|
82
|
-
Klass.options = { fields: {} };
|
|
83
|
-
options.field = name || key;
|
|
84
|
-
Klass.options.fields[key] = options;
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
export class ODataModelField {
|
|
88
|
-
constructor(options, _a) {
|
|
89
|
-
var { name, field, parser } = _a, opts = __rest(_a, ["name", "field", "parser"]);
|
|
90
|
-
this.options = options;
|
|
91
|
-
this.name = name;
|
|
92
|
-
this.field = field;
|
|
93
|
-
this.parser = parser;
|
|
94
|
-
this.default = opts.default || this.parser.default;
|
|
95
|
-
this.required = Boolean(opts.required);
|
|
96
|
-
this.concurrency = Boolean(opts.concurrency);
|
|
97
|
-
this.maxLength = opts.maxLength;
|
|
98
|
-
this.minLength = opts.minLength;
|
|
99
|
-
this.min = opts.min;
|
|
100
|
-
this.max = opts.max;
|
|
101
|
-
this.pattern = opts.pattern;
|
|
102
|
-
}
|
|
103
|
-
get api() {
|
|
104
|
-
return this.options.api;
|
|
105
|
-
}
|
|
106
|
-
get type() {
|
|
107
|
-
return this.parser.type;
|
|
108
|
-
}
|
|
109
|
-
get navigation() {
|
|
110
|
-
return Boolean(this.parser.navigation);
|
|
111
|
-
}
|
|
112
|
-
get collection() {
|
|
113
|
-
return Boolean(this.parser.collection);
|
|
114
|
-
}
|
|
115
|
-
get computed() {
|
|
116
|
-
var _a;
|
|
117
|
-
return Boolean((_a = this.parser.findAnnotation((a) => a.term === COMPUTED)) === null || _a === void 0 ? void 0 : _a.bool);
|
|
118
|
-
}
|
|
119
|
-
configure({ findOptionsForType, concurrency, }) {
|
|
120
|
-
this.meta = findOptionsForType(this.parser.type);
|
|
121
|
-
if (concurrency)
|
|
122
|
-
this.concurrency = concurrency;
|
|
123
|
-
}
|
|
124
|
-
isKey() {
|
|
125
|
-
return this.parser.isKey();
|
|
126
|
-
}
|
|
127
|
-
hasReferentials() {
|
|
128
|
-
return this.parser.hasReferentials();
|
|
129
|
-
}
|
|
130
|
-
get referentials() {
|
|
131
|
-
return this.parser.referentials;
|
|
132
|
-
}
|
|
133
|
-
isStructuredType() {
|
|
134
|
-
return this.parser.isStructuredType();
|
|
135
|
-
}
|
|
136
|
-
structured() {
|
|
137
|
-
return this.api.findStructuredTypeForType(this.parser.type);
|
|
138
|
-
}
|
|
139
|
-
isEnumType() {
|
|
140
|
-
return this.parser.isEnumType();
|
|
141
|
-
}
|
|
142
|
-
enum() {
|
|
143
|
-
return this.api.findEnumTypeForType(this.parser.type);
|
|
144
|
-
}
|
|
145
|
-
validate(value, { method, navigation = false, } = {}) {
|
|
146
|
-
var _a;
|
|
147
|
-
/*
|
|
148
|
-
if ('isValid' in value && typeof value.isValid === 'function') {
|
|
149
|
-
return !value.isValid({ method, navigation }) ? value._errors : undefined;
|
|
150
|
-
} else if ('models' in value && typeof value.models === 'function') {
|
|
151
|
-
*/
|
|
152
|
-
if (ODataModelOptions.isModel(value)) {
|
|
153
|
-
return !value.isValid({ method, navigation }) ? value._errors : undefined;
|
|
154
|
-
}
|
|
155
|
-
else if (ODataModelOptions.isCollection(value)) {
|
|
156
|
-
return value
|
|
157
|
-
.models()
|
|
158
|
-
.some((m) => !m.isValid({ method, navigation }))
|
|
159
|
-
? value.models().map((m) => m._errors)
|
|
160
|
-
: undefined;
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
let errors = ((_a = this.parser) === null || _a === void 0 ? void 0 : _a.validate(value, { method, navigation })) || [];
|
|
164
|
-
if (this.required &&
|
|
165
|
-
(value === null || (value === undefined && method !== 'modify')) // Is null or undefined without patch?
|
|
166
|
-
) {
|
|
167
|
-
errors.push(`required`);
|
|
168
|
-
}
|
|
169
|
-
if (this.maxLength !== undefined &&
|
|
170
|
-
typeof value === 'string' &&
|
|
171
|
-
value.length > this.maxLength) {
|
|
172
|
-
errors.push(`maxlength`);
|
|
173
|
-
}
|
|
174
|
-
if (this.minLength !== undefined &&
|
|
175
|
-
typeof value === 'string' &&
|
|
176
|
-
value.length < this.minLength) {
|
|
177
|
-
errors.push(`minlength`);
|
|
178
|
-
}
|
|
179
|
-
if (this.min !== undefined &&
|
|
180
|
-
typeof value === 'number' &&
|
|
181
|
-
value < this.min) {
|
|
182
|
-
errors.push(`min`);
|
|
183
|
-
}
|
|
184
|
-
if (this.max !== undefined &&
|
|
185
|
-
typeof value === 'number' &&
|
|
186
|
-
value > this.max) {
|
|
187
|
-
errors.push(`max`);
|
|
188
|
-
}
|
|
189
|
-
if (this.pattern !== undefined &&
|
|
190
|
-
typeof value === 'string' &&
|
|
191
|
-
!this.pattern.test(value)) {
|
|
192
|
-
errors.push(`pattern`);
|
|
193
|
-
}
|
|
194
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
defaults() {
|
|
198
|
-
return this.isStructuredType() && this.meta !== undefined
|
|
199
|
-
? this.meta.defaults()
|
|
200
|
-
: this.default;
|
|
201
|
-
}
|
|
202
|
-
deserialize(value, options) {
|
|
203
|
-
const parserOptions = options !== undefined
|
|
204
|
-
? new ODataParserOptions(options)
|
|
205
|
-
: this.api.options;
|
|
206
|
-
return this.parser.deserialize(value, parserOptions);
|
|
207
|
-
}
|
|
208
|
-
serialize(value, options) {
|
|
209
|
-
const parserOptions = options !== undefined
|
|
210
|
-
? new ODataParserOptions(options)
|
|
211
|
-
: this.api.options;
|
|
212
|
-
return this.parser.serialize(value, parserOptions);
|
|
213
|
-
}
|
|
214
|
-
encode(value, options) {
|
|
215
|
-
const parserOptions = options !== undefined
|
|
216
|
-
? new ODataParserOptions(options)
|
|
217
|
-
: this.api.options;
|
|
218
|
-
return this.parser.encode(value, parserOptions);
|
|
219
|
-
}
|
|
220
|
-
resourceFactory(resource) {
|
|
221
|
-
if (!(resource instanceof ODataEntityResource ||
|
|
222
|
-
resource instanceof ODataNavigationPropertyResource ||
|
|
223
|
-
resource instanceof ODataPropertyResource))
|
|
224
|
-
throw new Error("Can't build resource for non compatible base type");
|
|
225
|
-
return this.navigation
|
|
226
|
-
? resource.navigationProperty(this.parser.name)
|
|
227
|
-
: resource.property(this.parser.name);
|
|
228
|
-
}
|
|
229
|
-
annotationsFactory(annots) {
|
|
230
|
-
return this.parser.collection
|
|
231
|
-
? new ODataEntitiesAnnotations(annots.helper, annots.property(this.parser.name) || {})
|
|
232
|
-
: new ODataEntityAnnotations(annots.helper, annots.property(this.parser.name) || {});
|
|
233
|
-
}
|
|
234
|
-
schemaFactory(schema) {
|
|
235
|
-
return schema.api.findStructuredTypeForType(this.parser.type);
|
|
236
|
-
}
|
|
237
|
-
modelCollectionFactory({ parent, value, reset, }) {
|
|
238
|
-
const schema = this.schemaFactory(parent.schema());
|
|
239
|
-
const annots = this.annotationsFactory(parent.annots());
|
|
240
|
-
const Model = schema === null || schema === void 0 ? void 0 : schema.model;
|
|
241
|
-
const Collection = schema === null || schema === void 0 ? void 0 : schema.collection;
|
|
242
|
-
if (Model === undefined || Collection === undefined)
|
|
243
|
-
throw Error(`No model for ${this.name}`);
|
|
244
|
-
return this.parser.collection
|
|
245
|
-
? new Collection((value || []), {
|
|
246
|
-
annots: annots,
|
|
247
|
-
parent: [parent, this],
|
|
248
|
-
reset,
|
|
249
|
-
})
|
|
250
|
-
: new Model((value || {}), {
|
|
251
|
-
annots: annots,
|
|
252
|
-
parent: [parent, this],
|
|
253
|
-
reset,
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
export class ODataModelOptions {
|
|
258
|
-
constructor(options, schema) {
|
|
259
|
-
this.children = [];
|
|
260
|
-
this.name = schema.name;
|
|
261
|
-
this.base = schema.base;
|
|
262
|
-
this.open = schema.open;
|
|
263
|
-
this.schema = schema;
|
|
264
|
-
this.cid = options.cid || CID;
|
|
265
|
-
const schemaFields = this.schema.fields({ include_navigation: true });
|
|
266
|
-
this._fields = Object.entries(options.fields).map(([name, options]) => {
|
|
267
|
-
const { field } = options, opts = __rest(options, ["field"]);
|
|
268
|
-
if (field === undefined || name === undefined)
|
|
269
|
-
throw new Error('Model Properties need name and field');
|
|
270
|
-
const parser = schemaFields.find((f) => f.name === field);
|
|
271
|
-
if (parser === undefined)
|
|
272
|
-
throw new Error(`No parser for ${field} with name = ${name}`);
|
|
273
|
-
return new ODataModelField(this, Object.assign({ name, field, parser }, opts));
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
get api() {
|
|
277
|
-
return this.schema.api;
|
|
278
|
-
}
|
|
279
|
-
type() {
|
|
280
|
-
return this.schema.type();
|
|
281
|
-
}
|
|
282
|
-
isTypeOf(type) {
|
|
283
|
-
return this.schema.isTypeOf(type);
|
|
284
|
-
}
|
|
285
|
-
findChildOptions(predicate) {
|
|
286
|
-
if (predicate(this))
|
|
287
|
-
return this;
|
|
288
|
-
let match;
|
|
289
|
-
for (let ch of this.children) {
|
|
290
|
-
match = ch.findChildOptions(predicate);
|
|
291
|
-
if (match !== undefined)
|
|
292
|
-
break;
|
|
293
|
-
}
|
|
294
|
-
return match;
|
|
295
|
-
}
|
|
296
|
-
configure({ findOptionsForType, }) {
|
|
297
|
-
var _a;
|
|
298
|
-
if (this.base) {
|
|
299
|
-
const parent = findOptionsForType(this.base);
|
|
300
|
-
parent.children.push(this);
|
|
301
|
-
this.parent = parent;
|
|
302
|
-
}
|
|
303
|
-
this.entitySet = this.api.findEntitySetForEntityType(this.type());
|
|
304
|
-
let concurrencyFields = [];
|
|
305
|
-
if (this.entitySet !== undefined) {
|
|
306
|
-
concurrencyFields =
|
|
307
|
-
((_a = this.entitySet.findAnnotation((a) => a.term === OPTIMISTIC_CONCURRENCY)) === null || _a === void 0 ? void 0 : _a.properties) || [];
|
|
308
|
-
}
|
|
309
|
-
this._fields.forEach((field) => {
|
|
310
|
-
let concurrency = concurrencyFields.indexOf(field.field) !== -1;
|
|
311
|
-
field.configure({
|
|
312
|
-
findOptionsForType,
|
|
313
|
-
concurrency,
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
fields({ include_navigation = false, include_parents = true, } = {}) {
|
|
318
|
-
return [
|
|
319
|
-
...(include_parents && this.parent !== undefined
|
|
320
|
-
? this.parent.fields({ include_navigation, include_parents })
|
|
321
|
-
: []),
|
|
322
|
-
...this._fields.filter((field) => include_navigation || !field.navigation),
|
|
323
|
-
];
|
|
324
|
-
}
|
|
325
|
-
field(name) {
|
|
326
|
-
return this.fields({
|
|
327
|
-
include_parents: true,
|
|
328
|
-
include_navigation: true,
|
|
329
|
-
}).find((modelField) => modelField.name === name || modelField.field === name);
|
|
330
|
-
}
|
|
331
|
-
attach(self, resource) {
|
|
332
|
-
if (self._resource !== undefined &&
|
|
333
|
-
resource.type() !== self._resource.type() &&
|
|
334
|
-
!resource.isSubtypeOf(self._resource))
|
|
335
|
-
throw new Error(`Can't reattach ${resource.type()} to ${self._resource.type()}`);
|
|
336
|
-
const current = self._resource;
|
|
337
|
-
if (current === undefined || !current.isEqualTo(resource)) {
|
|
338
|
-
self._resource = resource;
|
|
339
|
-
self.events$.emit(new ODataModelEvent('attach', {
|
|
340
|
-
model: self,
|
|
341
|
-
previous: current,
|
|
342
|
-
value: resource,
|
|
343
|
-
}));
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
//# region Resource
|
|
347
|
-
static chain(child) {
|
|
348
|
-
const chain = [];
|
|
349
|
-
let tuple = [child, null];
|
|
350
|
-
while (tuple !== null) {
|
|
351
|
-
const parent = tuple;
|
|
352
|
-
if (chain.some((p) => p[0] === parent[0]))
|
|
353
|
-
break;
|
|
354
|
-
chain.splice(0, 0, parent);
|
|
355
|
-
tuple = tuple[0]._parent;
|
|
356
|
-
}
|
|
357
|
-
return chain;
|
|
358
|
-
}
|
|
359
|
-
static resource(child) {
|
|
360
|
-
var _a;
|
|
361
|
-
let resource = undefined;
|
|
362
|
-
for (let [model, field] of ODataModelOptions.chain(child)) {
|
|
363
|
-
resource =
|
|
364
|
-
resource ||
|
|
365
|
-
//model._resource ||
|
|
366
|
-
(ODataModelOptions.isModel(model)
|
|
367
|
-
? model._meta.modelResourceFactory()
|
|
368
|
-
: model._model.meta.collectionResourceFactory());
|
|
369
|
-
if (resource === undefined)
|
|
370
|
-
break;
|
|
371
|
-
if (ODataModelOptions.isModel(model)) {
|
|
372
|
-
let key = model.key({
|
|
373
|
-
field_mapping: true,
|
|
374
|
-
});
|
|
375
|
-
if (key !== undefined)
|
|
376
|
-
resource =
|
|
377
|
-
resource instanceof ODataEntitySetResource
|
|
378
|
-
? resource.entity(key)
|
|
379
|
-
: resource.key(key);
|
|
380
|
-
}
|
|
381
|
-
if (field === null) {
|
|
382
|
-
const query = (_a = model._resource) === null || _a === void 0 ? void 0 : _a.cloneQuery().toQueryArguments();
|
|
383
|
-
if (query !== undefined)
|
|
384
|
-
resource.query.apply(query);
|
|
385
|
-
continue;
|
|
386
|
-
}
|
|
387
|
-
resource = field.resourceFactory(resource);
|
|
388
|
-
}
|
|
389
|
-
if (resource === undefined)
|
|
390
|
-
throw new Error(`resource: Can't build resource for ${child}`);
|
|
391
|
-
return resource;
|
|
392
|
-
}
|
|
393
|
-
collectionResourceFactory({ baseResource, } = {}) {
|
|
394
|
-
if (this.entitySet !== undefined)
|
|
395
|
-
return ODataEntitySetResource.factory(this.api, this.entitySet.name, this.type(), new ODataPathSegments(), (baseResource === null || baseResource === void 0 ? void 0 : baseResource.cloneQuery()) || new ODataQueryOptions());
|
|
396
|
-
if (baseResource === undefined)
|
|
397
|
-
throw new Error("collectionResourceFactory: Can't build resource");
|
|
398
|
-
return baseResource.clone();
|
|
399
|
-
}
|
|
400
|
-
modelResourceFactory({ baseResource, } = {}) {
|
|
401
|
-
const resource = this.collectionResourceFactory({ baseResource });
|
|
402
|
-
if (resource instanceof ODataEntitySetResource)
|
|
403
|
-
return resource.entity();
|
|
404
|
-
return resource;
|
|
405
|
-
}
|
|
406
|
-
entityResource(self) {
|
|
407
|
-
let resource = this.modelResourceFactory({
|
|
408
|
-
baseResource: self._resource,
|
|
409
|
-
fromSet: true,
|
|
410
|
-
});
|
|
411
|
-
const key = self.key({ field_mapping: true });
|
|
412
|
-
if (key !== undefined)
|
|
413
|
-
return resource.key(key);
|
|
414
|
-
return resource;
|
|
415
|
-
}
|
|
416
|
-
//#endregion
|
|
417
|
-
bind(self, { parent, resource, annots, } = {}) {
|
|
418
|
-
// Parent
|
|
419
|
-
if (parent !== undefined) {
|
|
420
|
-
self._parent = parent;
|
|
421
|
-
}
|
|
422
|
-
else if (resource !== undefined) {
|
|
423
|
-
// Resource
|
|
424
|
-
this.attach(self, resource);
|
|
425
|
-
}
|
|
426
|
-
// Annotations
|
|
427
|
-
self._annotations =
|
|
428
|
-
annots || new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
|
|
429
|
-
const fields = this.fields({
|
|
430
|
-
include_navigation: true,
|
|
431
|
-
include_parents: true,
|
|
432
|
-
});
|
|
433
|
-
for (let field of fields) {
|
|
434
|
-
Object.defineProperty(self, field.name, {
|
|
435
|
-
configurable: true,
|
|
436
|
-
get: () => this._get(self, field),
|
|
437
|
-
set: (value) => this._set(self, field, value),
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
query(self, resource, func) {
|
|
442
|
-
func(resource.query);
|
|
443
|
-
this.attach(self, resource);
|
|
444
|
-
}
|
|
445
|
-
resolveKey(value, { field_mapping = false, resolve = true, } = {}) {
|
|
446
|
-
const keyTypes = this.schema.keys({ include_parents: true });
|
|
447
|
-
const key = {};
|
|
448
|
-
for (var kt of keyTypes) {
|
|
449
|
-
let v = value;
|
|
450
|
-
let options = this;
|
|
451
|
-
let field;
|
|
452
|
-
for (let name of kt.name.split('/')) {
|
|
453
|
-
if (options === undefined)
|
|
454
|
-
break;
|
|
455
|
-
field = options
|
|
456
|
-
.fields({ include_parents: true })
|
|
457
|
-
.find((field) => field.field === name);
|
|
458
|
-
if (field !== undefined) {
|
|
459
|
-
v =
|
|
460
|
-
Types.isPlainObject(v) || ODataModelOptions.isModel(v)
|
|
461
|
-
? v[field.name]
|
|
462
|
-
: v;
|
|
463
|
-
options = field.meta;
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
if (field === undefined)
|
|
467
|
-
return undefined;
|
|
468
|
-
let name = field_mapping ? field.field : field.name;
|
|
469
|
-
if (kt.alias !== undefined)
|
|
470
|
-
name = kt.alias;
|
|
471
|
-
key[name] = v;
|
|
472
|
-
}
|
|
473
|
-
if (Types.isEmpty(key))
|
|
474
|
-
return undefined;
|
|
475
|
-
return resolve ? Objects.resolveKey(key) : key;
|
|
476
|
-
}
|
|
477
|
-
resolveReferential(value, field, { field_mapping = false, resolve = true, } = {}) {
|
|
478
|
-
const referential = {};
|
|
479
|
-
for (var ref of field.referentials) {
|
|
480
|
-
let from = this.fields({ include_parents: true }).find((p) => p.field === ref.referencedProperty);
|
|
481
|
-
let to = field.options
|
|
482
|
-
.fields({ include_parents: true })
|
|
483
|
-
.find((field) => field.field === ref.property);
|
|
484
|
-
if (from !== undefined && to !== undefined) {
|
|
485
|
-
let name = field_mapping ? to.field : to.name;
|
|
486
|
-
referential[name] = value && value[from.name];
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
if (Types.isEmpty(referential))
|
|
490
|
-
return undefined;
|
|
491
|
-
return resolve
|
|
492
|
-
? Objects.resolveKey(referential, { single: false })
|
|
493
|
-
: referential;
|
|
494
|
-
}
|
|
495
|
-
resolveReferenced(value, field, { field_mapping = false, resolve = true, } = {}) {
|
|
496
|
-
const referenced = {};
|
|
497
|
-
for (var ref of field.referentials) {
|
|
498
|
-
let from = this.fields({ include_parents: true }).find((field) => field.field === ref.property);
|
|
499
|
-
let to = field.meta
|
|
500
|
-
.fields({ include_parents: true })
|
|
501
|
-
.find((field) => field.field === ref.referencedProperty);
|
|
502
|
-
if (from !== undefined && to !== undefined) {
|
|
503
|
-
let name = field_mapping ? to.field : to.name;
|
|
504
|
-
referenced[name] = value && self[from.name];
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
if (Types.isEmpty(referenced))
|
|
508
|
-
return undefined;
|
|
509
|
-
return resolve
|
|
510
|
-
? Objects.resolveKey(referenced, { single: false })
|
|
511
|
-
: referenced;
|
|
512
|
-
}
|
|
513
|
-
validate(self, { method, navigation = false, } = {}) {
|
|
514
|
-
const errors = this.fields({
|
|
515
|
-
include_parents: true,
|
|
516
|
-
include_navigation: navigation,
|
|
517
|
-
}).reduce((acc, field) => {
|
|
518
|
-
let value = self[field.name];
|
|
519
|
-
let errs = field.validate(value, { method });
|
|
520
|
-
return errs !== undefined
|
|
521
|
-
? Object.assign(acc, { [field.name]: errs })
|
|
522
|
-
: acc;
|
|
523
|
-
}, {});
|
|
524
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
525
|
-
}
|
|
526
|
-
defaults() {
|
|
527
|
-
const defs = this.fields().reduce((acc, field) => {
|
|
528
|
-
let value = field.defaults();
|
|
529
|
-
return value !== undefined
|
|
530
|
-
? Object.assign(acc, { [field.name]: value })
|
|
531
|
-
: acc;
|
|
532
|
-
}, {});
|
|
533
|
-
return !Types.isEmpty(defs) ? defs : undefined;
|
|
534
|
-
}
|
|
535
|
-
hasChanged(self, { include_navigation = false } = {}) {
|
|
536
|
-
return (!Types.isEmpty(self._changes) ||
|
|
537
|
-
Object.values(self._relations)
|
|
538
|
-
.filter(({ field }) => !field.navigation || include_navigation)
|
|
539
|
-
.some(({ field, state, model }) => (!include_navigation || field.navigation) &&
|
|
540
|
-
(state === ODataModelState.Changed ||
|
|
541
|
-
(model != undefined && model.hasChanged({ include_navigation })))));
|
|
542
|
-
}
|
|
543
|
-
asEntity(self, func) {
|
|
544
|
-
const parent = self._parent;
|
|
545
|
-
self._parent = null;
|
|
546
|
-
return func(self).pipe(finalize(() => (self._parent = parent)));
|
|
547
|
-
}
|
|
548
|
-
toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
549
|
-
let attrs = self.attributes({
|
|
550
|
-
changes_only,
|
|
551
|
-
field_mapping,
|
|
552
|
-
include_concurrency,
|
|
553
|
-
include_computed,
|
|
554
|
-
include_non_field,
|
|
555
|
-
});
|
|
556
|
-
let relations = Object.entries(self._relations)
|
|
557
|
-
.filter(
|
|
558
|
-
// Chain
|
|
559
|
-
([, { model }]) => chain.every((c) => c !== model))
|
|
560
|
-
.filter(
|
|
561
|
-
// Changes only
|
|
562
|
-
([, { model, state }]) => !changes_only ||
|
|
563
|
-
(changes_only &&
|
|
564
|
-
(state === ODataModelState.Changed ||
|
|
565
|
-
(model != undefined && model.hasChanged({ include_navigation })))))
|
|
566
|
-
.filter(([, { field, model }]) =>
|
|
567
|
-
// Navigation
|
|
568
|
-
(include_navigation && field.navigation && model !== null) ||
|
|
569
|
-
!field.navigation)
|
|
570
|
-
.map(([k, { model, field, state }]) => {
|
|
571
|
-
let changesOnly = changes_only &&
|
|
572
|
-
state !== ODataModelState.Changed &&
|
|
573
|
-
!!field.navigation;
|
|
574
|
-
let includeKey = include_key && !!field.navigation;
|
|
575
|
-
if (ODataModelOptions.isModel(model)) {
|
|
576
|
-
return [
|
|
577
|
-
k,
|
|
578
|
-
model.toEntity({
|
|
579
|
-
client_id,
|
|
580
|
-
include_navigation,
|
|
581
|
-
include_concurrency,
|
|
582
|
-
include_non_field,
|
|
583
|
-
field_mapping,
|
|
584
|
-
changes_only: changesOnly,
|
|
585
|
-
include_key: includeKey,
|
|
586
|
-
chain: [self, ...chain],
|
|
587
|
-
}),
|
|
588
|
-
];
|
|
589
|
-
}
|
|
590
|
-
else if (ODataModelOptions.isCollection(model)) {
|
|
591
|
-
return [
|
|
592
|
-
k,
|
|
593
|
-
model.toEntities({
|
|
594
|
-
client_id,
|
|
595
|
-
include_navigation,
|
|
596
|
-
include_concurrency,
|
|
597
|
-
include_non_field,
|
|
598
|
-
field_mapping,
|
|
599
|
-
changes_only: changesOnly,
|
|
600
|
-
include_key: includeKey,
|
|
601
|
-
chain: [self, ...chain],
|
|
602
|
-
}),
|
|
603
|
-
];
|
|
604
|
-
}
|
|
605
|
-
return [k, model];
|
|
606
|
-
})
|
|
607
|
-
.reduce((acc, [k, v]) => {
|
|
608
|
-
var _a;
|
|
609
|
-
const name = field_mapping
|
|
610
|
-
? ((_a = this.fields().find((field) => field.name === k)) === null || _a === void 0 ? void 0 : _a.field) || k
|
|
611
|
-
: k;
|
|
612
|
-
return Object.assign(acc, { [name]: v });
|
|
613
|
-
}, {});
|
|
614
|
-
// Create entity
|
|
615
|
-
let entity = Object.assign(Object.assign({}, attrs), relations);
|
|
616
|
-
// Add client_id
|
|
617
|
-
if (client_id) {
|
|
618
|
-
entity[this.cid] = self[this.cid];
|
|
619
|
-
}
|
|
620
|
-
// Add key
|
|
621
|
-
if (include_key) {
|
|
622
|
-
entity = Object.assign(Object.assign({}, entity), this.resolveKey(self, { field_mapping, resolve: false }));
|
|
623
|
-
}
|
|
624
|
-
// Add type
|
|
625
|
-
if (self._parent !== null &&
|
|
626
|
-
((ODataModelOptions.isModel(self._parent[0]) &&
|
|
627
|
-
self._parent[1].meta !== self._meta) ||
|
|
628
|
-
(ODataModelOptions.isCollection(self._parent[0]) &&
|
|
629
|
-
self._parent[0]._model
|
|
630
|
-
.meta !== self._meta))) {
|
|
631
|
-
this.api.options.helper.type(entity, this.schema.type());
|
|
632
|
-
}
|
|
633
|
-
return entity;
|
|
634
|
-
}
|
|
635
|
-
attributes(self, { changes_only = false, include_concurrency = false, include_computed = false, include_non_field = false, field_mapping = false, } = {}) {
|
|
636
|
-
// Attributes by fields (attributes for the model type)
|
|
637
|
-
const fieldAttrs = this.fields().reduce((acc, f) => {
|
|
638
|
-
const isChanged = f.name in self._changes;
|
|
639
|
-
const name = field_mapping ? f.field : f.name;
|
|
640
|
-
const value = isChanged
|
|
641
|
-
? self._changes[f.name]
|
|
642
|
-
: self._attributes[f.name];
|
|
643
|
-
if (f.concurrency && include_concurrency) {
|
|
644
|
-
return Object.assign(acc, { [name]: value });
|
|
645
|
-
}
|
|
646
|
-
else if (f.computed && include_computed) {
|
|
647
|
-
return Object.assign(acc, { [name]: value });
|
|
648
|
-
}
|
|
649
|
-
else if (changes_only && isChanged) {
|
|
650
|
-
return Object.assign(acc, { [name]: value });
|
|
651
|
-
}
|
|
652
|
-
else if (!changes_only && !f.concurrency && !f.computed) {
|
|
653
|
-
return Object.assign(acc, { [name]: value });
|
|
654
|
-
}
|
|
655
|
-
else {
|
|
656
|
-
return acc;
|
|
657
|
-
}
|
|
658
|
-
}, {});
|
|
659
|
-
if (!include_non_field)
|
|
660
|
-
return fieldAttrs;
|
|
661
|
-
const names = Object.keys(fieldAttrs);
|
|
662
|
-
// Attributes from object (attributes for object)
|
|
663
|
-
const nonFieldAttrs = Object.entries(self)
|
|
664
|
-
.filter(([k]) => names.indexOf(k) === -1 && !k.startsWith('_') && !k.endsWith('$'))
|
|
665
|
-
.reduce((acc, [k, v]) => Object.assign(acc, { [k]: v }), {});
|
|
666
|
-
return Object.assign(Object.assign({}, fieldAttrs), nonFieldAttrs);
|
|
667
|
-
}
|
|
668
|
-
reset(self, { name, silent = false } = {}) {
|
|
669
|
-
if (!Types.isEmpty(name) && name in self._changes) {
|
|
670
|
-
const value = self._attributes[name];
|
|
671
|
-
const previous = self._changes[name];
|
|
672
|
-
delete self._changes[name];
|
|
673
|
-
if (!silent) {
|
|
674
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
675
|
-
model: self,
|
|
676
|
-
track: name,
|
|
677
|
-
value,
|
|
678
|
-
previous,
|
|
679
|
-
}));
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
else if (Types.isEmpty(name)) {
|
|
683
|
-
const entries = Object.entries(self._changes);
|
|
684
|
-
self._changes = {};
|
|
685
|
-
if (!silent) {
|
|
686
|
-
entries.forEach((entry) => {
|
|
687
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
688
|
-
track: entry[0],
|
|
689
|
-
model: self,
|
|
690
|
-
value: self._attributes[entry[0]],
|
|
691
|
-
previous: entry[1],
|
|
692
|
-
}));
|
|
693
|
-
});
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
assign(self, entity, { reset = false, silent = false, } = {}) {
|
|
698
|
-
self._resetting = reset;
|
|
699
|
-
self._silent = silent;
|
|
700
|
-
const changes = [];
|
|
701
|
-
// Apply entity
|
|
702
|
-
const model = self;
|
|
703
|
-
Object.entries(entity)
|
|
704
|
-
.filter(([, value]) => value !== undefined) // Filter undefined
|
|
705
|
-
.forEach(([key, value]) => {
|
|
706
|
-
const field = this.fields({
|
|
707
|
-
include_parents: true,
|
|
708
|
-
include_navigation: true,
|
|
709
|
-
}).find((field) => (self._resetting && field.field === key) || field.name === key);
|
|
710
|
-
if (field !== undefined) {
|
|
711
|
-
// Delegated to private setter
|
|
712
|
-
if (this._set(self, field, value)) {
|
|
713
|
-
changes.push(field.name);
|
|
714
|
-
if (ODataModelOptions.isCollection(value) ||
|
|
715
|
-
ODataModelOptions.isModel(value))
|
|
716
|
-
// Set Parent
|
|
717
|
-
value._parent = [self, field];
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
else {
|
|
721
|
-
// Basic assignment
|
|
722
|
-
const current = model[key];
|
|
723
|
-
model[key] = value;
|
|
724
|
-
if (current !== value)
|
|
725
|
-
changes.push(key);
|
|
726
|
-
}
|
|
727
|
-
});
|
|
728
|
-
if (!self._silent && changes.length > 0) {
|
|
729
|
-
self.events$.emit(new ODataModelEvent(self._resetting ? 'reset' : 'update', {
|
|
730
|
-
model: self,
|
|
731
|
-
options: { changes },
|
|
732
|
-
}));
|
|
733
|
-
}
|
|
734
|
-
self._resetting = false;
|
|
735
|
-
self._silent = false;
|
|
736
|
-
}
|
|
737
|
-
static isModel(obj) {
|
|
738
|
-
return {}.toString.call(obj) === '[object Model]';
|
|
739
|
-
}
|
|
740
|
-
static isCollection(obj) {
|
|
741
|
-
return {}.toString.call(obj) === '[object Collection]';
|
|
742
|
-
}
|
|
743
|
-
updateCollection(self, field, collection, value) {
|
|
744
|
-
if (ODataModelOptions.isCollection(value) &&
|
|
745
|
-
collection.equals(value)) {
|
|
746
|
-
return false;
|
|
747
|
-
}
|
|
748
|
-
if (ODataModelOptions.isCollection(value)) {
|
|
749
|
-
value = value.toEntities(INCLUDE_DEEP);
|
|
750
|
-
}
|
|
751
|
-
collection._annotations = field.annotationsFactory(self.annots());
|
|
752
|
-
collection.assign(value, {
|
|
753
|
-
reset: self._resetting,
|
|
754
|
-
silent: self._silent,
|
|
755
|
-
});
|
|
756
|
-
return collection.hasChanged();
|
|
757
|
-
}
|
|
758
|
-
updateModel(self, field, model, value) {
|
|
759
|
-
if (ODataModelOptions.isModel(value) &&
|
|
760
|
-
model.equals(value)) {
|
|
761
|
-
return false;
|
|
762
|
-
}
|
|
763
|
-
if (ODataModelOptions.isModel(value)) {
|
|
764
|
-
value = value.toEntity(INCLUDE_DEEP);
|
|
765
|
-
}
|
|
766
|
-
model._annotations = field.annotationsFactory(self.annots());
|
|
767
|
-
model.assign(value, {
|
|
768
|
-
reset: self._resetting,
|
|
769
|
-
silent: self._silent,
|
|
770
|
-
});
|
|
771
|
-
return model.hasChanged();
|
|
772
|
-
}
|
|
773
|
-
_get(self, field) {
|
|
774
|
-
var _a;
|
|
775
|
-
if (field.isStructuredType()) {
|
|
776
|
-
return (_a = self._relations[field.name]) === null || _a === void 0 ? void 0 : _a.model;
|
|
777
|
-
}
|
|
778
|
-
else {
|
|
779
|
-
return this.attributes(self, {
|
|
780
|
-
include_concurrency: true,
|
|
781
|
-
include_computed: true,
|
|
782
|
-
})[field.name];
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
_setStructured(self, field, value) {
|
|
786
|
-
var _a;
|
|
787
|
-
let changed = false;
|
|
788
|
-
// Ensures that the relation exists
|
|
789
|
-
if (!(field.name in self._relations)) {
|
|
790
|
-
self._relations[field.name] = {
|
|
791
|
-
state: ODataModelState.Unchanged,
|
|
792
|
-
field: field,
|
|
793
|
-
};
|
|
794
|
-
}
|
|
795
|
-
const relation = self._relations[field.name];
|
|
796
|
-
const currentModel = relation.model;
|
|
797
|
-
if (value === null) {
|
|
798
|
-
relation.model = value;
|
|
799
|
-
changed = currentModel !== value;
|
|
800
|
-
this._unsubscribe(self, relation);
|
|
801
|
-
}
|
|
802
|
-
else if (ODataModelOptions.isCollection(currentModel)) {
|
|
803
|
-
changed = this.updateCollection(self, field, currentModel, value);
|
|
804
|
-
}
|
|
805
|
-
else if (ODataModelOptions.isModel(currentModel)) {
|
|
806
|
-
changed = this.updateModel(self, field, currentModel, value);
|
|
807
|
-
}
|
|
808
|
-
else {
|
|
809
|
-
relation.model =
|
|
810
|
-
ODataModelOptions.isCollection(value) ||
|
|
811
|
-
ODataModelOptions.isModel(value)
|
|
812
|
-
? value
|
|
813
|
-
: field.modelCollectionFactory({
|
|
814
|
-
parent: self,
|
|
815
|
-
value: value,
|
|
816
|
-
reset: self._resetting,
|
|
817
|
-
});
|
|
818
|
-
changed = true;
|
|
819
|
-
this._subscribe(self, relation);
|
|
820
|
-
}
|
|
821
|
-
if (!ODataModelOptions.isCollection(relation.model)) {
|
|
822
|
-
var ref = (_a = field.meta) === null || _a === void 0 ? void 0 : _a.resolveReferential(relation.model, field);
|
|
823
|
-
if (ref !== undefined) {
|
|
824
|
-
Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
relation.state =
|
|
828
|
-
self._resetting || !changed
|
|
829
|
-
? ODataModelState.Unchanged
|
|
830
|
-
: ODataModelState.Changed;
|
|
831
|
-
if (!self._silent && changed) {
|
|
832
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
833
|
-
track: field.name,
|
|
834
|
-
model: self,
|
|
835
|
-
value: relation.model,
|
|
836
|
-
previous: currentModel,
|
|
837
|
-
}));
|
|
838
|
-
}
|
|
839
|
-
return changed;
|
|
840
|
-
}
|
|
841
|
-
_setValue(self, field, value, key) {
|
|
842
|
-
let changed = false;
|
|
843
|
-
const attrs = this.attributes(self, {
|
|
844
|
-
include_concurrency: true,
|
|
845
|
-
include_computed: true,
|
|
846
|
-
});
|
|
847
|
-
const currentValue = attrs[field];
|
|
848
|
-
changed = !Types.isEqual(currentValue, value);
|
|
849
|
-
if (self._resetting) {
|
|
850
|
-
delete self._changes[field];
|
|
851
|
-
self._attributes[field] = value;
|
|
852
|
-
}
|
|
853
|
-
else if (Types.isEqual(value, self._attributes[field])) {
|
|
854
|
-
delete self._changes[field];
|
|
855
|
-
}
|
|
856
|
-
else if (changed) {
|
|
857
|
-
self._changes[field] = value;
|
|
858
|
-
}
|
|
859
|
-
if (!self._silent && changed) {
|
|
860
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
861
|
-
track: field,
|
|
862
|
-
model: self,
|
|
863
|
-
value,
|
|
864
|
-
previous: currentValue,
|
|
865
|
-
options: { key },
|
|
866
|
-
}));
|
|
867
|
-
}
|
|
868
|
-
return changed;
|
|
869
|
-
}
|
|
870
|
-
_set(self, field, value) {
|
|
871
|
-
return field.isStructuredType()
|
|
872
|
-
? this._setStructured(self, field, value)
|
|
873
|
-
: this._setValue(self, field.name, value, field.isKey());
|
|
874
|
-
}
|
|
875
|
-
_unsubscribe(self, relation) {
|
|
876
|
-
if (relation.subscription) {
|
|
877
|
-
relation.subscription.unsubscribe();
|
|
878
|
-
delete relation.subscription;
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
_subscribe(self, relation) {
|
|
882
|
-
if (relation.subscription) {
|
|
883
|
-
throw new Error('Subscription already exists');
|
|
884
|
-
}
|
|
885
|
-
if (relation.model == null) {
|
|
886
|
-
throw new Error('Subscription model is null');
|
|
887
|
-
}
|
|
888
|
-
relation.subscription = relation.model.events$.subscribe((event) => {
|
|
889
|
-
var _a;
|
|
890
|
-
if (BUBBLING.indexOf(event.name) !== -1 &&
|
|
891
|
-
event.bubbling &&
|
|
892
|
-
!event.visited(self)) {
|
|
893
|
-
if (event.model === relation.model) {
|
|
894
|
-
if (event.name === 'change' &&
|
|
895
|
-
relation.field.navigation &&
|
|
896
|
-
((_a = event.options) === null || _a === void 0 ? void 0 : _a.key)) {
|
|
897
|
-
var ref = relation.model.referential(relation.field);
|
|
898
|
-
if (ref !== undefined) {
|
|
899
|
-
Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
event.push(self, relation.field.name);
|
|
904
|
-
self.events$.emit(event);
|
|
905
|
-
}
|
|
906
|
-
});
|
|
907
|
-
}
|
|
908
|
-
}
|
|
909
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVoRCxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLCtCQUErQixFQUMvQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGlCQUFpQixHQU9sQixNQUFNLGNBQWMsQ0FBQztBQUd0QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUkxQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBc0IxQixNQUFNLE9BQU8sZUFBZTtJQVkxQixZQUNFLElBQXlCLEVBQ3pCLEVBQ0UsS0FBSyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLE1BUUwsRUFBRTtRQTFCUixhQUFRLEdBQVksSUFBSSxDQUFDO1FBNEJ2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJ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Q0FBQyxFQUFFLEVBQUUsQ0FDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FDbEMsQ0FBQzt5QkFDSDtxQkFDRjtpQkFDRjtnQkFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQjtRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ09NUFVURUQsXG4gIERFRkFVTFRfVkVSU0lPTixcbiAgT1BUSU1JU1RJQ19DT05DVVJSRU5DWSxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IE9EYXRhUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyIH0gZnJvbSAnLi4vcGFyc2Vycyc7XG5pbXBvcnQge1xuICBFeHBhbmQsXG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFQYXRoU2VnbWVudHMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnMsXG4gIEVudGl0eUtleSxcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbiAgT3B0aW9uSGFuZGxlcixcbiAgT0RhdGFRdWVyeUFyZ3VtZW50cyxcbiAgU2VsZWN0LFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlTZXQsIE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBDSUQgPSAnX2NpZCc7XG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsUmVzb3VyY2U8VD4gPVxuICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcbmV4cG9ydCB0eXBlIE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+ID1cbiAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEV2ZW50VHlwZSA9XG4gIHwgJ2NoYW5nZSdcbiAgfCAncmVzZXQnXG4gIHwgJ3VwZGF0ZSdcbiAgfCAnZGVzdHJveSdcbiAgfCAnYWRkJ1xuICB8ICdyZW1vdmUnXG4gIHwgJ2ludmFsaWQnXG4gIHwgJ3JlcXVlc3QnXG4gIHwgJ3N5bmMnXG4gIHwgJ2F0dGFjaCc7XG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbEV2ZW50PFQ+IHtcbiAgbmFtZTogT0RhdGFNb2RlbEV2ZW50VHlwZTtcbiAgYnViYmxpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gIGNoYWluOiBbXG4gICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIF1bXTtcbiAgdmFsdWU/OiBhbnk7XG4gIHByZXZpb3VzPzogYW55O1xuICBvcHRpb25zPzogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBPRGF0YU1vZGVsRXZlbnRUeXBlLFxuICAgIHtcbiAgICAgIG1vZGVsLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHByZXZpb3VzLFxuICAgICAgdmFsdWUsXG4gICAgICB0cmFjayxcbiAgICAgIG9wdGlvbnMsXG4gICAgfToge1xuICAgICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgICAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcbiAgICAgIHRyYWNrPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgcHJldmlvdXM/OiBhbnk7XG4gICAgICB2YWx1ZT86IGFueTtcbiAgICAgIG9wdGlvbnM/OiBhbnk7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY2hhaW4gPSBbXG4gICAgICBbXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiB8fFxuICAgICAgICAgICh0aGlzLm1vZGVsIGFzXG4gICAgICAgICAgICB8IE9EYXRhTW9kZWw8YW55PlxuICAgICAgICAgICAgfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KSxcbiAgICAgICAgdHJhY2sgfHwgbnVsbCxcbiAgICAgIF0sXG4gICAgXTtcbiAgfVxuICBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5idWJibGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHVzaChcbiAgICBtb2RlbDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICB0cmFjazogc3RyaW5nIHwgbnVtYmVyXG4gICkge1xuICAgIHRoaXMuY2hhaW4uc3BsaWNlKDAsIDAsIFttb2RlbCwgdHJhY2tdKTtcbiAgfVxuXG4gIHZpc2l0ZWQobW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pIHtcbiAgICByZXR1cm4gdGhpcy5jaGFpbi5zb21lKChjKSA9PiBjWzBdID09PSBtb2RlbCk7XG4gIH1cbiAgZ2V0IHBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhaW5cbiAgICAgIC5tYXAoKFssIHRyYWNrXSwgaW5kZXgpID0+XG4gICAgICAgIHR5cGVvZiB0cmFjayA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IGBbJHt0cmFja31dYFxuICAgICAgICAgIDogdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gaW5kZXggPT09IDBcbiAgICAgICAgICAgID8gdHJhY2tcbiAgICAgICAgICAgIDogYC4ke3RyYWNrfWBcbiAgICAgICAgICA6ICcnXG4gICAgICApXG4gICAgICAuam9pbignJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEJVQkJMSU5HID0gW1xuICAnY2hhbmdlJyxcbiAgJ3Jlc2V0JyxcbiAgJ3VwZGF0ZScsXG4gICdkZXN0cm95JyxcbiAgJ2FkZCcsXG4gICdyZW1vdmUnLFxuXTtcblxuZXhwb3J0IGNvbnN0IElOQ0xVREVfU0hBTExPVyA9IHtcbiAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgaW5jbHVkZV9jb21wdXRlZDogdHJ1ZSxcbiAgaW5jbHVkZV9rZXk6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgSU5DTFVERV9ERUVQID0ge1xuICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gIGluY2x1ZGVfbm9uX2ZpZWxkOiB0cnVlLFxuICAuLi5JTkNMVURFX1NIQUxMT1csXG59O1xuXG5leHBvcnQgZW51bSBPRGF0YU1vZGVsU3RhdGUge1xuICBBZGRlZCxcbiAgUmVtb3ZlZCxcbiAgQ2hhbmdlZCxcbiAgVW5jaGFuZ2VkLFxufVxuXG5leHBvcnQgdHlwZSBNb2RlbE9wdGlvbnMgPSB7XG4gIGNpZD86IHN0cmluZztcbiAgZmllbGRzOiB7IFtuYW1lOiBzdHJpbmddOiBNb2RlbEZpZWxkT3B0aW9ucyB9O1xufTtcblxuZXhwb3J0IHR5cGUgTW9kZWxGaWVsZE9wdGlvbnMgPSB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGNvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBtaW5MZW5ndGg/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBwYXR0ZXJuPzogUmVnRXhwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsKHsgY2lkID0gQ0lEIH06IHsgY2lkPzogc3RyaW5nIH0gPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyB7IG5ldyAoLi4uYXJnczogYW55W10pOiB7fSB9Pihjb25zdHJ1Y3RvcjogVCkgPT4ge1xuICAgIGNvbnN0IEtsYXNzID0gPGFueT5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIEtsYXNzLm9wdGlvbnMuY2lkID0gY2lkO1xuICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsRmllbGQoe1xuICBuYW1lLFxuICAuLi5vcHRpb25zXG59OiB7IG5hbWU/OiBzdHJpbmcgfSAmIE1vZGVsRmllbGRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIG9wdGlvbnMuZmllbGQgPSBuYW1lIHx8IGtleTtcbiAgICBLbGFzcy5vcHRpb25zLmZpZWxkc1trZXldID0gb3B0aW9ucztcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPiA9IE1vZGVsRmllbGRPcHRpb25zICYge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxGaWVsZDxGPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj47XG4gIG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIG1ldGE/OiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZDogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PixcbiAgICB7IG5hbWUsIGZpZWxkLCBwYXJzZXIsIC4uLm9wdHMgfTogT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPlxuICApIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5maWVsZCA9IGZpZWxkO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIHRoaXMuZGVmYXVsdCA9IG9wdHMuZGVmYXVsdCB8fCB0aGlzLnBhcnNlci5kZWZhdWx0O1xuICAgIHRoaXMucmVxdWlyZWQgPSBCb29sZWFuKG9wdHMucmVxdWlyZWQpO1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBCb29sZWFuKG9wdHMuY29uY3VycmVuY3kpO1xuICAgIHRoaXMubWF4TGVuZ3RoID0gb3B0cy5tYXhMZW5ndGg7XG4gICAgdGhpcy5taW5MZW5ndGggPSBvcHRzLm1pbkxlbmd0aDtcbiAgICB0aGlzLm1pbiA9IG9wdHMubWluO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXg7XG4gICAgdGhpcy5wYXR0ZXJuID0gb3B0cy5wYXR0ZXJuO1xuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwaTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci50eXBlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb24oKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXJzZXIubmF2aWdhdGlvbik7XG4gIH1cblxuICBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcnNlci5jb2xsZWN0aW9uKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHRoaXMucGFyc2VyLmZpbmRBbm5vdGF0aW9uKChhKSA9PiBhLnRlcm0gPT09IENPTVBVVEVEKT8uYm9vbFxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmUoe1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgICBjb25jdXJyZW5jeSxcbiAgfToge1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25jdXJyZW5jeTogYm9vbGVhbjtcbiAgfSkge1xuICAgIHRoaXMubWV0YSA9IGZpbmRPcHRpb25zRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgICBpZiAoY29uY3VycmVuY3kpIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgfVxuXG4gIGlzS2V5KCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc0tleSgpO1xuICB9XG5cbiAgaGFzUmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5oYXNSZWZlcmVudGlhbHMoKTtcbiAgfVxuXG4gIGdldCByZWZlcmVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnJlZmVyZW50aWFscztcbiAgfVxuXG4gIGlzU3RydWN0dXJlZFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzU3RydWN0dXJlZFR5cGUoKTtcbiAgfVxuXG4gIHN0cnVjdHVyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8Rj4odGhpcy5wYXJzZXIudHlwZSk7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc0VudW1UeXBlKCk7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIHJldHVybiB0aGlzLmFwaS5maW5kRW51bVR5cGVGb3JUeXBlPEY+KHRoaXMucGFyc2VyLnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8qXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICF2YWx1ZS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pID8gdmFsdWUuX2Vycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKCdtb2RlbHMnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5tb2RlbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICovXG4gICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gIXZhbHVlLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgPyB2YWx1ZS5fZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAuc29tZSgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiAhbS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKVxuICAgICAgICA/IHZhbHVlLm1vZGVscygpLm1hcCgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiBtLl9lcnJvcnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXJyb3JzID0gdGhpcy5wYXJzZXI/LnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZXF1aXJlZCAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYG1pbmxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPCB0aGlzLm1pblxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtaW5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gdGhpcy5tYXhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgbWF4YCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGF0dGVybiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgIXRoaXMucGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0cygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJiB0aGlzLm1ldGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLm1ldGEuZGVmYXVsdHMoKVxuICAgICAgOiB0aGlzLmRlZmF1bHQ7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogT3B0aW9ucyk6IEYge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSh2YWx1ZTogRiwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICBlbmNvZGUodmFsdWU6IEYsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLmFwaS5vcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgcmVzb3VyY2VGYWN0b3J5PFQsIEY+KFxuICAgIHJlc291cmNlOiBPRGF0YU1vZGVsUmVzb3VyY2U8VD5cbiAgKTogT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxGPiB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxGPiB7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlIHx8XG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGJ1aWxkIHJlc291cmNlIGZvciBub24gY29tcGF0aWJsZSBiYXNlIHR5cGVcIik7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblxuICAgICAgPyAocmVzb3VyY2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikubmF2aWdhdGlvblByb3BlcnR5PEY+KFxuICAgICAgICAgIHRoaXMucGFyc2VyLm5hbWVcbiAgICAgICAgKVxuICAgICAgOiAocmVzb3VyY2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikucHJvcGVydHk8Rj4odGhpcy5wYXJzZXIubmFtZSk7XG4gIH1cblxuICBhbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgYW5ub3RzOiBPRGF0YUVudGl0eUFubm90YXRpb25zXG4gICk6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMgfCBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5jb2xsZWN0aW9uXG4gICAgICA/IG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgICAgYW5ub3RzLmhlbHBlcixcbiAgICAgICAgICBhbm5vdHMucHJvcGVydHkodGhpcy5wYXJzZXIubmFtZSkgfHwge31cbiAgICAgICAgKVxuICAgICAgOiBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhcbiAgICAgICAgICBhbm5vdHMuaGVscGVyLFxuICAgICAgICAgIGFubm90cy5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lKSB8fCB7fVxuICAgICAgICApO1xuICB9XG5cbiAgc2NoZW1hRmFjdG9yeTxULCBGPihcbiAgICBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD5cbiAgKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxGPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHNjaGVtYS5hcGkuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgfVxuXG4gIG1vZGVsQ29sbGVjdGlvbkZhY3Rvcnk8VCwgRj4oe1xuICAgIHBhcmVudCxcbiAgICB2YWx1ZSxcbiAgICByZXNldCxcbiAgfToge1xuICAgIHBhcmVudDogT0RhdGFNb2RlbDxhbnk+O1xuICAgIHZhbHVlPzogRiB8IEZbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYUZhY3Rvcnk8VCwgRj4ocGFyZW50LnNjaGVtYSgpKTtcbiAgICBjb25zdCBhbm5vdHMgPSB0aGlzLmFubm90YXRpb25zRmFjdG9yeShwYXJlbnQuYW5ub3RzKCkpO1xuXG4gICAgY29uc3QgTW9kZWwgPSBzY2hlbWE/Lm1vZGVsO1xuICAgIGNvbnN0IENvbGxlY3Rpb24gPSBzY2hlbWE/LmNvbGxlY3Rpb247XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQgfHwgQ29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgRXJyb3IoYE5vIG1vZGVsIGZvciAke3RoaXMubmFtZX1gKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuY29sbGVjdGlvblxuICAgICAgPyAobmV3IENvbGxlY3Rpb24oKHZhbHVlIHx8IFtdKSBhcyAoRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9KVtdLCB7XG4gICAgICAgICAgYW5ub3RzOiBhbm5vdHMgYXMgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICAgICAgICAgIHBhcmVudDogW3BhcmVudCwgdGhpc10sXG4gICAgICAgICAgcmVzZXQsXG4gICAgICAgIH0pIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PilcbiAgICAgIDogKG5ldyBNb2RlbCgodmFsdWUgfHwge30pIGFzIEYgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgICAgIGFubm90czogYW5ub3RzIGFzIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gICAgICAgICAgcGFyZW50OiBbcGFyZW50LCB0aGlzXSxcbiAgICAgICAgICByZXNldCxcbiAgICAgICAgfSkgYXMgT0RhdGFNb2RlbDxGPik7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbFJlbGF0aW9uPFQ+ID0ge1xuICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlO1xuICBtb2RlbD86IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4gfCBudWxsO1xuICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPFQ+O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEVudHJ5PFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PiA9IHtcbiAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZTtcbiAgbW9kZWw6IE07XG4gIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbE9wdGlvbnM8VD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNpZDogc3RyaW5nO1xuICBiYXNlPzogc3RyaW5nO1xuICBvcGVuPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZmllbGRzOiBPRGF0YU1vZGVsRmllbGQ8YW55PltdO1xuICBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIGVudGl0eVNldD86IE9EYXRhRW50aXR5U2V0O1xuICAvLyBIaWVyYXJjaHlcbiAgcGFyZW50PzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgY2hpbGRyZW46IE9EYXRhTW9kZWxPcHRpb25zPGFueT5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsT3B0aW9ucywgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSB7XG4gICAgdGhpcy5uYW1lID0gc2NoZW1hLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gc2NoZW1hLmJhc2U7XG4gICAgdGhpcy5vcGVuID0gc2NoZW1hLm9wZW47XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5jaWQgPSBvcHRpb25zLmNpZCB8fCBDSUQ7XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gdGhpcy5zY2hlbWEuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlIH0pO1xuICAgIHRoaXMuX2ZpZWxkcyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZmllbGRzKS5tYXAoKFtuYW1lLCBvcHRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgeyBmaWVsZCwgLi4ub3B0cyB9ID0gb3B0aW9ucztcbiAgICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBQcm9wZXJ0aWVzIG5lZWQgbmFtZSBhbmQgZmllbGQnKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHNjaGVtYUZpZWxkcy5maW5kKChmOiBhbnkpID0+IGYubmFtZSA9PT0gZmllbGQpO1xuICAgICAgaWYgKHBhcnNlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBhcnNlciBmb3IgJHtmaWVsZH0gd2l0aCBuYW1lID0gJHtuYW1lfWApO1xuICAgICAgcmV0dXJuIG5ldyBPRGF0YU1vZGVsRmllbGQ8VD4odGhpcywgeyBuYW1lLCBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEuYXBpO1xuICB9XG5cbiAgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEudHlwZSgpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmlzVHlwZU9mKHR5cGUpO1xuICB9XG5cbiAgZmluZENoaWxkT3B0aW9ucyhcbiAgICBwcmVkaWNhdGU6IChvcHRpb25zOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+KSA9PiBib29sZWFuXG4gICk6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcmVkaWNhdGUodGhpcykpIHJldHVybiB0aGlzO1xuICAgIGxldCBtYXRjaDogT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBtYXRjaCA9IGNoLmZpbmRDaGlsZE9wdGlvbnMocHJlZGljYXRlKTtcbiAgICAgIGlmIChtYXRjaCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gIH06IHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gIH0pIHtcbiAgICBpZiAodGhpcy5iYXNlKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBmaW5kT3B0aW9uc0ZvclR5cGUodGhpcy5iYXNlKSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgdGhpcy5lbnRpdHlTZXQgPSB0aGlzLmFwaS5maW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZSh0aGlzLnR5cGUoKSk7XG4gICAgbGV0IGNvbmN1cnJlbmN5RmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLmVudGl0eVNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25jdXJyZW5jeUZpZWxkcyA9XG4gICAgICAgIHRoaXMuZW50aXR5U2V0LmZpbmRBbm5vdGF0aW9uKChhKSA9PiBhLnRlcm0gPT09IE9QVElNSVNUSUNfQ09OQ1VSUkVOQ1kpXG4gICAgICAgICAgPy5wcm9wZXJ0aWVzIHx8IFtdO1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGxldCBjb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5RmllbGRzLmluZGV4T2YoZmllbGQuZmllbGQpICE9PSAtMTtcbiAgICAgIGZpZWxkLmNvbmZpZ3VyZSh7XG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpZWxkcyh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9wYXJlbnRzID0gdHJ1ZSxcbiAgfToge1xuICAgIGluY2x1ZGVfcGFyZW50cz86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogT0RhdGFNb2RlbEZpZWxkPGFueT5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihpbmNsdWRlX3BhcmVudHMgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucGFyZW50LmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbiwgaW5jbHVkZV9wYXJlbnRzIH0pXG4gICAgICAgIDogW10pLFxuICAgICAgLi4udGhpcy5fZmllbGRzLmZpbHRlcihcbiAgICAgICAgKGZpZWxkKSA9PiBpbmNsdWRlX25hdmlnYXRpb24gfHwgIWZpZWxkLm5hdmlnYXRpb25cbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGZpZWxkKG5hbWU6IGtleW9mIFQgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgIH0pLmZpbmQoXG4gICAgICAobW9kZWxGaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+XG4gICAgICAgIG1vZGVsRmllbGQubmFtZSA9PT0gbmFtZSB8fCBtb2RlbEZpZWxkLmZpZWxkID09PSBuYW1lXG4gICAgKTtcbiAgfVxuXG4gIGF0dGFjaChzZWxmOiBPRGF0YU1vZGVsPFQ+LCByZXNvdXJjZTogT0RhdGFNb2RlbFJlc291cmNlPFQ+KSB7XG4gICAgaWYgKFxuICAgICAgc2VsZi5fcmVzb3VyY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcmVzb3VyY2UudHlwZSgpICE9PSBzZWxmLl9yZXNvdXJjZS50eXBlKCkgJiZcbiAgICAgICFyZXNvdXJjZS5pc1N1YnR5cGVPZihzZWxmLl9yZXNvdXJjZSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW4ndCByZWF0dGFjaCAke3Jlc291cmNlLnR5cGUoKX0gdG8gJHtzZWxmLl9yZXNvdXJjZS50eXBlKCl9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxmLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8ICFjdXJyZW50LmlzRXF1YWxUbyhyZXNvdXJjZSkpIHtcbiAgICAgIHNlbGYuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnYXR0YWNoJywge1xuICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8jIHJlZ2lvbiBSZXNvdXJjZVxuICBzdGF0aWMgY2hhaW4oXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgKTogW1xuICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gIF1bXSB7XG4gICAgY29uc3QgY2hhaW4gPSBbXSBhcyBhbnlbXTtcbiAgICBsZXQgdHVwbGU6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgICBdXG4gICAgICB8IG51bGwgPSBbY2hpbGQsIG51bGxdO1xuICAgIHdoaWxlICh0dXBsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyZW50ID0gdHVwbGUgYXMgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICBpZiAoY2hhaW4uc29tZSgocCkgPT4gcFswXSA9PT0gcGFyZW50WzBdKSkgYnJlYWs7XG4gICAgICBjaGFpbi5zcGxpY2UoMCwgMCwgcGFyZW50KTtcbiAgICAgIHR1cGxlID0gdHVwbGVbMF0uX3BhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYWluO1xuICB9XG5cbiAgc3RhdGljIHJlc291cmNlPFQ+KFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+XG4gICk6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPiB8IE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhTW9kZWxSZXNvdXJjZTxhbnk+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvblJlc291cmNlPGFueT5cbiAgICAgIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IFttb2RlbCwgZmllbGRdIG9mIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKSkge1xuICAgICAgcmVzb3VyY2UgPVxuICAgICAgICByZXNvdXJjZSB8fFxuICAgICAgICAvL21vZGVsLl9yZXNvdXJjZSB8fFxuICAgICAgICAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbClcbiAgICAgICAgICA/IChtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLl9tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KClcbiAgICAgICAgICA6IChcbiAgICAgICAgICAgICAgbW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICAgICAgICAgICAgKS5fbW9kZWwubWV0YS5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KCkpO1xuICAgICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgIGxldCBrZXkgPSAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS5rZXkoe1xuICAgICAgICAgIGZpZWxkX21hcHBpbmc6IHRydWUsXG4gICAgICAgIH0pIGFzIEVudGl0eUtleTxhbnk+O1xuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgcmVzb3VyY2UgPVxuICAgICAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlXG4gICAgICAgICAgICAgID8gcmVzb3VyY2UuZW50aXR5KGtleSlcbiAgICAgICAgICAgICAgOiByZXNvdXJjZS5rZXkoa2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG1vZGVsLl9yZXNvdXJjZT8uY2xvbmVRdWVyeSgpLnRvUXVlcnlBcmd1bWVudHMoKTtcbiAgICAgICAgaWYgKHF1ZXJ5ICE9PSB1bmRlZmluZWQpIHJlc291cmNlLnF1ZXJ5LmFwcGx5KHF1ZXJ5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXNvdXJjZSA9IChmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PikucmVzb3VyY2VGYWN0b3J5PGFueSwgYW55PihcbiAgICAgICAgcmVzb3VyY2UgYXMgT0RhdGFNb2RlbFJlc291cmNlPGFueT5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXNvdXJjZTogQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yICR7Y2hpbGR9YCk7XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSh7XG4gICAgYmFzZVJlc291cmNlLFxuICB9OiB7IGJhc2VSZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD4gfSA9IHt9KTogT0RhdGFDb2xsZWN0aW9uUmVzb3VyY2U8VD4ge1xuICAgIGlmICh0aGlzLmVudGl0eVNldCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UuZmFjdG9yeTxUPihcbiAgICAgICAgdGhpcy5hcGksXG4gICAgICAgIHRoaXMuZW50aXR5U2V0Lm5hbWUsXG4gICAgICAgIHRoaXMudHlwZSgpLFxuICAgICAgICBuZXcgT0RhdGFQYXRoU2VnbWVudHMoKSxcbiAgICAgICAgYmFzZVJlc291cmNlPy5jbG9uZVF1ZXJ5KCkgfHwgbmV3IE9EYXRhUXVlcnlPcHRpb25zKClcbiAgICAgICk7XG4gICAgaWYgKGJhc2VSZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ2FuJ3QgYnVpbGQgcmVzb3VyY2VcIik7XG4gICAgcmV0dXJuIGJhc2VSZXNvdXJjZS5jbG9uZSgpIGFzIE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+O1xuICB9XG5cbiAgbW9kZWxSZXNvdXJjZUZhY3Rvcnkoe1xuICAgIGJhc2VSZXNvdXJjZSxcbiAgfToge1xuICAgIGZyb21TZXQ/OiBib29sZWFuO1xuICAgIGJhc2VSZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD47XG4gIH0gPSB7fSk6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoeyBiYXNlUmVzb3VyY2UgfSk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkgcmV0dXJuIHJlc291cmNlLmVudGl0eSgpO1xuICAgIHJldHVybiByZXNvdXJjZSBhcyBPRGF0YU1vZGVsUmVzb3VyY2U8VD47XG4gIH1cblxuICBlbnRpdHlSZXNvdXJjZShzZWxmOiBPRGF0YU1vZGVsPFQ+KTogT0RhdGFNb2RlbFJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KHtcbiAgICAgIGJhc2VSZXNvdXJjZTogc2VsZi5fcmVzb3VyY2UsXG4gICAgICBmcm9tU2V0OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGtleSA9IHNlbGYua2V5KHsgZmllbGRfbWFwcGluZzogdHJ1ZSB9KSBhcyBFbnRpdHlLZXk8VD47XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcmVzb3VyY2Uua2V5KGtleSk7XG4gICAgcmV0dXJuIHJlc291cmNlIGFzIE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBiaW5kKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50O1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzb3VyY2VcbiAgICAgIHRoaXMuYXR0YWNoKHNlbGYsIHJlc291cmNlKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHNlbGYuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyB8fCBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhPRGF0YUhlbHBlcltERUZBVUxUX1ZFUlNJT05dKTtcblxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBmaWVsZC5uYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXQoc2VsZiwgZmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4pLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogYW55KSA9PlxuICAgICAgICAgIHRoaXMuX3NldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiwgdmFsdWUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcXVlcnkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZXNvdXJjZTogT0RhdGFNb2RlbFJlc291cmNlPFQ+LFxuICAgIGZ1bmM6IChxOiB7XG4gICAgICBzZWxlY3Qob3B0cz86IFNlbGVjdDxUPik6IE9wdGlvbkhhbmRsZXI8U2VsZWN0PFQ+PjtcbiAgICAgIGV4cGFuZChvcHRzPzogRXhwYW5kPFQ+KTogT3B0aW9uSGFuZGxlcjxFeHBhbmQ8VD4+O1xuICAgICAgZm9ybWF0KG9wdHM/OiBzdHJpbmcpOiBPcHRpb25IYW5kbGVyPHN0cmluZz47XG4gICAgICBhcHBseShxdWVyeTogT0RhdGFRdWVyeUFyZ3VtZW50czxUPik6IHZvaWQ7XG4gICAgfSkgPT4gdm9pZFxuICApIHtcbiAgICBmdW5jKHJlc291cmNlLnF1ZXJ5KTtcbiAgICB0aGlzLmF0dGFjaChzZWxmLCByZXNvdXJjZSk7XG4gIH1cblxuICByZXNvbHZlS2V5KFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5VHlwZXMgPSB0aGlzLnNjaGVtYS5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGtleTogYW55ID0ge307XG4gICAgZm9yICh2YXIga3Qgb2Yga2V5VHlwZXMpIHtcbiAgICAgIGxldCB2ID0gdmFsdWUgYXMgYW55O1xuICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICBsZXQgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChsZXQgbmFtZSBvZiBrdC5uYW1lLnNwbGl0KCcvJykpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgIGZpZWxkID0gb3B0aW9uc1xuICAgICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgICAuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdiA9XG4gICAgICAgICAgICBUeXBlcy5pc1BsYWluT2JqZWN0KHYpIHx8IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodilcbiAgICAgICAgICAgICAgPyB2W2ZpZWxkLm5hbWVdXG4gICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICBvcHRpb25zID0gZmllbGQubWV0YSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGZpZWxkLmZpZWxkIDogZmllbGQubmFtZTtcbiAgICAgIGlmIChrdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSBuYW1lID0ga3QuYWxpYXM7XG4gICAgICBrZXlbbmFtZV0gPSB2O1xuICAgIH1cbiAgICBpZiAoVHlwZXMuaXNFbXB0eShrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlID8gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSkgOiBrZXk7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbnRpYWwoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsLFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZmVyZW50aWFsOiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pLmZpbmQoXG4gICAgICAgIChwOiBhbnkpID0+IHAuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHlcbiAgICAgICk7XG4gICAgICBsZXQgdG8gPSBmaWVsZC5vcHRpb25zXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IHJlZi5wcm9wZXJ0eSk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gdG8uZmllbGQgOiB0by5uYW1lO1xuICAgICAgICByZWZlcmVudGlhbFtuYW1lXSA9IHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KHJlZmVyZW50aWFsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbnRpYWwsIHsgc2luZ2xlOiBmYWxzZSB9KVxuICAgICAgOiByZWZlcmVudGlhbDtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVuY2VkKFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWZlcmVuY2VkOiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pLmZpbmQoXG4gICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSByZWYucHJvcGVydHlcbiAgICAgICk7XG4gICAgICBsZXQgdG8gPSAoZmllbGQubWV0YSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+KVxuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5maW5kKFxuICAgICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+XG4gICAgICAgICAgICBmaWVsZC5maWVsZCA9PT0gcmVmLnJlZmVyZW5jZWRQcm9wZXJ0eVxuICAgICAgICApO1xuICAgICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbmNlZFtuYW1lXSA9IHZhbHVlICYmIChzZWxmIGFzIGFueSlbZnJvbS5uYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFR5cGVzLmlzRW1wdHkocmVmZXJlbmNlZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVcbiAgICAgID8gT2JqZWN0cy5yZXNvbHZlS2V5KHJlZmVyZW5jZWQsIHsgc2luZ2xlOiBmYWxzZSB9KVxuICAgICAgOiByZWZlcmVuY2VkO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcbiAgICB9KS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IChzZWxmIGFzIGFueSlbZmllbGQubmFtZV07XG4gICAgICBsZXQgZXJycyA9IGZpZWxkLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCB9KTtcbiAgICAgIHJldHVybiBlcnJzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IGVycnMgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWZzID0gdGhpcy5maWVsZHMoKS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRzKCk7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtmaWVsZC5uYW1lXTogdmFsdWUgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShkZWZzKSA/IGRlZnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYXNDaGFuZ2VkKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhVHlwZXMuaXNFbXB0eShzZWxmLl9jaGFuZ2VzKSB8fFxuICAgICAgT2JqZWN0LnZhbHVlcyhzZWxmLl9yZWxhdGlvbnMpXG4gICAgICAgIC5maWx0ZXIoKHsgZmllbGQgfSkgPT4gIWZpZWxkLm5hdmlnYXRpb24gfHwgaW5jbHVkZV9uYXZpZ2F0aW9uKVxuICAgICAgICAuc29tZShcbiAgICAgICAgICAoeyBmaWVsZCwgc3RhdGUsIG1vZGVsIH0pID0+XG4gICAgICAgICAgICAoIWluY2x1ZGVfbmF2aWdhdGlvbiB8fCBmaWVsZC5uYXZpZ2F0aW9uKSAmJlxuICAgICAgICAgICAgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCB8fFxuICAgICAgICAgICAgICAobW9kZWwgIT0gdW5kZWZpbmVkICYmIG1vZGVsLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzRW50aXR5PFIsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PihcbiAgICBzZWxmOiBNLFxuICAgIGZ1bmM6IChtb2RlbDogTSkgPT4gT2JzZXJ2YWJsZTxSPlxuICApOiBPYnNlcnZhYmxlPFI+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG4gICAgc2VsZi5fcGFyZW50ID0gbnVsbDtcbiAgICByZXR1cm4gZnVuYyhzZWxmKS5waXBlKGZpbmFsaXplKCgpID0+IChzZWxmLl9wYXJlbnQgPSBwYXJlbnQpKSk7XG4gIH1cblxuICB0b0VudGl0eShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICBjaGFpbiA9IFtdLFxuICAgIH06IHtcbiAgICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gICAgfSA9IHt9XG4gICk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgbGV0IGF0dHJzID0gc2VsZi5hdHRyaWJ1dGVzKHtcbiAgICAgIGNoYW5nZXNfb25seSxcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlbGF0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHNlbGYuX3JlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYWluXG4gICAgICAgIChbLCB7IG1vZGVsIH1dKSA9PiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gbW9kZWwpXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAvLyBDaGFuZ2VzIG9ubHlcbiAgICAgICAgKFssIHsgbW9kZWwsIHN0YXRlIH1dKSA9PlxuICAgICAgICAgICFjaGFuZ2VzX29ubHkgfHxcbiAgICAgICAgICAoY2hhbmdlc19vbmx5ICYmXG4gICAgICAgICAgICAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkIHx8XG4gICAgICAgICAgICAgIChtb2RlbCAhPSB1bmRlZmluZWQgJiYgbW9kZWwuaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSkpKVxuICAgICAgKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFssIHsgZmllbGQsIG1vZGVsIH1dKSA9PlxuICAgICAgICAgIC8vIE5hdmlnYXRpb25cbiAgICAgICAgICAoaW5jbHVkZV9uYXZpZ2F0aW9uICYmIGZpZWxkLm5hdmlnYXRpb24gJiYgbW9kZWwgIT09IG51bGwpIHx8XG4gICAgICAgICAgIWZpZWxkLm5hdmlnYXRpb25cbiAgICAgIClcbiAgICAgIC5tYXAoKFtrLCB7IG1vZGVsLCBmaWVsZCwgc3RhdGUgfV0pID0+IHtcbiAgICAgICAgbGV0IGNoYW5nZXNPbmx5ID1cbiAgICAgICAgICBjaGFuZ2VzX29ubHkgJiZcbiAgICAgICAgICBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQgJiZcbiAgICAgICAgICAhIWZpZWxkLm5hdmlnYXRpb247XG4gICAgICAgIGxldCBpbmNsdWRlS2V5ID0gaW5jbHVkZV9rZXkgJiYgISFmaWVsZC5uYXZpZ2F0aW9uO1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgayxcbiAgICAgICAgICAgIChtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNPbmx5LFxuICAgICAgICAgICAgICBpbmNsdWRlX2tleTogaW5jbHVkZUtleSxcbiAgICAgICAgICAgICAgY2hhaW46IFtzZWxmLCAuLi5jaGFpbl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihtb2RlbCkpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgayxcbiAgICAgICAgICAgIChtb2RlbCBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS50b0VudGl0aWVzKHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNPbmx5LFxuICAgICAgICAgICAgICBpbmNsdWRlX2tleTogaW5jbHVkZUtleSxcbiAgICAgICAgICAgICAgY2hhaW46IFtzZWxmLCAuLi5jaGFpbl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbaywgbW9kZWxdO1xuICAgICAgfSlcbiAgICAgIC5yZWR1Y2UoKGFjYywgW2ssIHZdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmaWVsZF9tYXBwaW5nXG4gICAgICAgICAgPyB0aGlzLmZpZWxkcygpLmZpbmQoXG4gICAgICAgICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLm5hbWUgPT09IGtcbiAgICAgICAgICAgICk/LmZpZWxkIHx8IGtcbiAgICAgICAgICA6IGs7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHYgfSk7XG4gICAgICB9LCB7fSk7XG5cbiAgICAvLyBDcmVhdGUgZW50aXR5XG4gICAgbGV0IGVudGl0eSA9IHsgLi4uYXR0cnMsIC4uLnJlbGF0aW9ucyB9O1xuXG4gICAgLy8gQWRkIGNsaWVudF9pZFxuICAgIGlmIChjbGllbnRfaWQpIHtcbiAgICAgICg8YW55PmVudGl0eSlbdGhpcy5jaWRdID0gKDxhbnk+c2VsZilbdGhpcy5jaWRdO1xuICAgIH1cblxuICAgIC8vIEFkZCBrZXlcbiAgICBpZiAoaW5jbHVkZV9rZXkpIHtcbiAgICAgIGVudGl0eSA9IHtcbiAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAuLi4odGhpcy5yZXNvbHZlS2V5KHNlbGYsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZTogZmFsc2UgfSkgYXMge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdHlwZVxuICAgIGlmIChcbiAgICAgIHNlbGYuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgKChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHNlbGYuX3BhcmVudFswXSkgJiZcbiAgICAgICAgKHNlbGYuX3BhcmVudFsxXSBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PikubWV0YSAhPT0gc2VsZi5fbWV0YSkgfHxcbiAgICAgICAgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihzZWxmLl9wYXJlbnRbMF0pICYmXG4gICAgICAgICAgKHNlbGYuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS5fbW9kZWxcbiAgICAgICAgICAgIC5tZXRhICE9PSBzZWxmLl9tZXRhKSlcbiAgICApIHtcbiAgICAgIHRoaXMuYXBpLm9wdGlvbnMuaGVscGVyLnR5cGUoZW50aXR5LCB0aGlzLnNjaGVtYS50eXBlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICBhdHRyaWJ1dGVzKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICAvLyBBdHRyaWJ1dGVzIGJ5IGZpZWxkcyAoYXR0cmlidXRlcyBmb3IgdGhlIG1vZGVsIHR5cGUpXG4gICAgY29uc3QgZmllbGRBdHRycyA9IHRoaXMuZmllbGRzKCkucmVkdWNlKChhY2MsIGYpID0+IHtcbiAgICAgIGNvbnN0IGlzQ2hhbmdlZCA9IGYubmFtZSBpbiBzZWxmLl9jaGFuZ2VzO1xuICAgICAgY29uc3QgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyBmLmZpZWxkIDogZi5uYW1lO1xuICAgICAgY29uc3QgdmFsdWUgPSBpc0NoYW5nZWRcbiAgICAgICAgPyBzZWxmLl9jaGFuZ2VzW2YubmFtZV1cbiAgICAgICAgOiBzZWxmLl9hdHRyaWJ1dGVzW2YubmFtZV07XG4gICAgICBpZiAoZi5jb25jdXJyZW5jeSAmJiBpbmNsdWRlX2NvbmN1cnJlbmN5KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIGlmIChmLmNvbXB1dGVkICYmIGluY2x1ZGVfY29tcHV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNfb25seSAmJiBpc0NoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFjaGFuZ2VzX29ubHkgJiYgIWYuY29uY3VycmVuY3kgJiYgIWYuY29tcHV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgIH0sIHt9KTtcbiAgICBpZiAoIWluY2x1ZGVfbm9uX2ZpZWxkKSByZXR1cm4gZmllbGRBdHRycztcbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKGZpZWxkQXR0cnMpO1xuICAgIC8vIEF0dHJpYnV0ZXMgZnJvbSBvYmplY3QgKGF0dHJpYnV0ZXMgZm9yIG9iamVjdClcbiAgICBjb25zdCBub25GaWVsZEF0dHJzID0gT2JqZWN0LmVudHJpZXMoc2VsZilcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChba10pID0+XG4gICAgICAgICAgbmFtZXMuaW5kZXhPZihrKSA9PT0gLTEgJiYgIWsuc3RhcnRzV2l0aCgnXycpICYmICFrLmVuZHNXaXRoKCckJylcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjYywgW2ssIHZdKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBba106IHYgfSksIHt9KTtcbiAgICByZXR1cm4geyAuLi5maWVsZEF0dHJzLCAuLi5ub25GaWVsZEF0dHJzIH07XG4gIH1cblxuICByZXNldChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHsgbmFtZSwgc2lsZW50ID0gZmFsc2UgfTogeyBuYW1lPzogc3RyaW5nOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICBpZiAoIVR5cGVzLmlzRW1wdHkobmFtZSkgJiYgKG5hbWUgYXMgc3RyaW5nKSBpbiBzZWxmLl9jaGFuZ2VzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHNlbGYuX2F0dHJpYnV0ZXNbbmFtZSBhcyBzdHJpbmddO1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBzZWxmLl9jaGFuZ2VzW25hbWUgYXMgc3RyaW5nXTtcbiAgICAgIGRlbGV0ZSBzZWxmLl9jaGFuZ2VzW25hbWUgYXMgc3RyaW5nXTtcbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgICAgdHJhY2s6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHByZXZpb3VzLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChUeXBlcy5pc0VtcHR5KG5hbWUpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoc2VsZi5fY2hhbmdlcyk7XG4gICAgICBzZWxmLl9jaGFuZ2VzID0ge307XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgICAgICAgIHRyYWNrOiBlbnRyeVswXSxcbiAgICAgICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgICAgIHZhbHVlOiBzZWxmLl9hdHRyaWJ1dGVzW2VudHJ5WzBdXSxcbiAgICAgICAgICAgICAgcHJldmlvdXM6IGVudHJ5WzFdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBlbnRpdHk6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfTogeyByZXNldD86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIHNlbGYuX3Jlc2V0dGluZyA9IHJlc2V0O1xuICAgIHNlbGYuX3NpbGVudCA9IHNpbGVudDtcblxuICAgIGNvbnN0IGNoYW5nZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBBcHBseSBlbnRpdHlcbiAgICBjb25zdCBtb2RlbCA9IHNlbGYgYXMgYW55O1xuICAgIE9iamVjdC5lbnRyaWVzKGVudGl0eSlcbiAgICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkgLy8gRmlsdGVyIHVuZGVmaW5lZFxuICAgICAgLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzKHtcbiAgICAgICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgICB9KS5maW5kKFxuICAgICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+XG4gICAgICAgICAgICAoc2VsZi5fcmVzZXR0aW5nICYmIGZpZWxkLmZpZWxkID09PSBrZXkpIHx8IGZpZWxkLm5hbWUgPT09IGtleVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gRGVsZWdhdGVkIHRvIHByaXZhdGUgc2V0dGVyXG4gICAgICAgICAgaWYgKHRoaXMuX3NldChzZWxmLCBmaWVsZCwgdmFsdWUpKSB7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goZmllbGQubmFtZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLy8gU2V0IFBhcmVudFxuICAgICAgICAgICAgICB2YWx1ZS5fcGFyZW50ID0gW3NlbGYsIGZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQmFzaWMgYXNzaWdubWVudFxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBtb2RlbFtrZXldO1xuICAgICAgICAgIG1vZGVsW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gdmFsdWUpIGNoYW5nZXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGlmICghc2VsZi5fc2lsZW50ICYmIGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoc2VsZi5fcmVzZXR0aW5nID8gJ3Jlc2V0JyA6ICd1cGRhdGUnLCB7XG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgb3B0aW9uczogeyBjaGFuZ2VzIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBzZWxmLl9yZXNldHRpbmcgPSBmYWxzZTtcbiAgICBzZWxmLl9zaWxlbnQgPSBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBpc01vZGVsKG9iajogYW55KSB7XG4gICAgcmV0dXJuIHt9LnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgTW9kZWxdJztcbiAgfVxuXG4gIHN0YXRpYyBpc0NvbGxlY3Rpb24ob2JqOiBhbnkpIHtcbiAgICByZXR1cm4ge30udG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBDb2xsZWN0aW9uXSc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbGxlY3Rpb248Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIGNvbGxlY3Rpb246IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PixcbiAgICB2YWx1ZTogT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+IHwgVFtdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICApIHtcbiAgICBpZiAoXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpICYmXG4gICAgICBjb2xsZWN0aW9uLmVxdWFscyh2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4pXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS50b0VudGl0aWVzKFxuICAgICAgICBJTkNMVURFX0RFRVBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbGxlY3Rpb24uX2Fubm90YXRpb25zID0gZmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgc2VsZi5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zO1xuICAgIGNvbGxlY3Rpb24uYXNzaWduKHZhbHVlIGFzIFRbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sIHtcbiAgICAgIHJlc2V0OiBzZWxmLl9yZXNldHRpbmcsXG4gICAgICBzaWxlbnQ6IHNlbGYuX3NpbGVudCxcbiAgICB9KTtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVNb2RlbDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8Rj4sXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8Rj4gfCBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgJiZcbiAgICAgIG1vZGVsLmVxdWFscyh2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4pLnRvRW50aXR5KElOQ0xVREVfREVFUCk7XG4gICAgfVxuICAgIG1vZGVsLl9hbm5vdGF0aW9ucyA9IGZpZWxkLmFubm90YXRpb25zRmFjdG9yeShcbiAgICAgIHNlbGYuYW5ub3RzKClcbiAgICApIGFzIE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gICAgbW9kZWwuYXNzaWduKHZhbHVlIGFzIEYgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0dGluZyxcbiAgICAgIHNpbGVudDogc2VsZi5fc2lsZW50LFxuICAgIH0pO1xuICAgIHJldHVybiBtb2RlbC5oYXNDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+XG4gICk6IEYgfCBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGZpZWxkLmlzU3RydWN0dXJlZFR5cGUoKSkge1xuICAgICAgcmV0dXJuIHNlbGYuX3JlbGF0aW9uc1tmaWVsZC5uYW1lXT8ubW9kZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXMoc2VsZiwge1xuICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICAgICAgfSlbZmllbGQubmFtZV07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U3RydWN0dXJlZDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgdmFsdWU6XG4gICAgICB8IEZcbiAgICAgIHwgRltdXG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgIHwgbnVsbFxuICApOiBib29sZWFuIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIC8vIEVuc3VyZXMgdGhhdCB0aGUgcmVsYXRpb24gZXhpc3RzXG4gICAgaWYgKCEoZmllbGQubmFtZSBpbiBzZWxmLl9yZWxhdGlvbnMpKSB7XG4gICAgICBzZWxmLl9yZWxhdGlvbnNbZmllbGQubmFtZV0gPSB7XG4gICAgICAgIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkLFxuICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uID0gc2VsZi5fcmVsYXRpb25zW2ZpZWxkLm5hbWVdO1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHJlbGF0aW9uLm1vZGVsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZWxhdGlvbi5tb2RlbCA9IHZhbHVlIGFzIG51bGw7XG4gICAgICBjaGFuZ2VkID0gY3VycmVudE1vZGVsICE9PSB2YWx1ZTtcbiAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlKHNlbGYsIHJlbGF0aW9uKTtcbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50TW9kZWwpKSB7XG4gICAgICBjaGFuZ2VkID0gdGhpcy51cGRhdGVDb2xsZWN0aW9uPEY+KFxuICAgICAgICBzZWxmLFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgY3VycmVudE1vZGVsIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PixcbiAgICAgICAgdmFsdWUgYXNcbiAgICAgICAgICB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PlxuICAgICAgICAgIHwgVFtdXG4gICAgICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChjdXJyZW50TW9kZWwpKSB7XG4gICAgICBjaGFuZ2VkID0gdGhpcy51cGRhdGVNb2RlbDxGPihcbiAgICAgICAgc2VsZixcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGN1cnJlbnRNb2RlbCBhcyBPRGF0YU1vZGVsPEY+LFxuICAgICAgICB2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+IHwgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWxhdGlvbi5tb2RlbCA9XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkgfHxcbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSlcbiAgICAgICAgICA/ICh2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+KVxuICAgICAgICAgIDogZmllbGQubW9kZWxDb2xsZWN0aW9uRmFjdG9yeTxULCBGPih7XG4gICAgICAgICAgICAgIHBhcmVudDogc2VsZixcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICByZXNldDogc2VsZi5fcmVzZXR0aW5nLFxuICAgICAgICAgICAgfSk7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3N1YnNjcmliZShzZWxmLCByZWxhdGlvbik7XG4gICAgfVxuICAgIGlmICghT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHJlbGF0aW9uLm1vZGVsKSkge1xuICAgICAgdmFyIHJlZiA9IGZpZWxkLm1ldGE/LnJlc29sdmVSZWZlcmVudGlhbChyZWxhdGlvbi5tb2RlbCwgZmllbGQpO1xuICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlZikuZm9yRWFjaCgoW2ssIHZdKSA9PlxuICAgICAgICAgIHRoaXMuX3NldFZhbHVlKHNlbGYsIGssIHYsIGZhbHNlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZWxhdGlvbi5zdGF0ZSA9XG4gICAgICBzZWxmLl9yZXNldHRpbmcgfHwgIWNoYW5nZWRcbiAgICAgICAgPyBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkXG4gICAgICAgIDogT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQ7XG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlZCkge1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICB0cmFjazogZmllbGQubmFtZSxcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICB2YWx1ZTogcmVsYXRpb24ubW9kZWwsXG4gICAgICAgICAgcHJldmlvdXM6IGN1cnJlbnRNb2RlbCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VmFsdWU8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogc3RyaW5nLFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGwsXG4gICAga2V5PzogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGF0dHJzID0gdGhpcy5hdHRyaWJ1dGVzKHNlbGYsIHtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGF0dHJzW2ZpZWxkXTtcbiAgICBjaGFuZ2VkID0gIVR5cGVzLmlzRXF1YWwoY3VycmVudFZhbHVlLCB2YWx1ZSk7XG4gICAgaWYgKHNlbGYuX3Jlc2V0dGluZykge1xuICAgICAgZGVsZXRlIHNlbGYuX2NoYW5nZXNbZmllbGRdO1xuICAgICAgc2VsZi5fYXR0cmlidXRlc1tmaWVsZF0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKFR5cGVzLmlzRXF1YWwodmFsdWUsIHNlbGYuX2F0dHJpYnV0ZXNbZmllbGRdKSkge1xuICAgICAgZGVsZXRlIHNlbGYuX2NoYW5nZXNbZmllbGRdO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlZCkge1xuICAgICAgc2VsZi5fY2hhbmdlc1tmaWVsZF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlZCkge1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICB0cmFjazogZmllbGQsXG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXM6IGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB7IGtleSB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cblxuICBwcml2YXRlIF9zZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpZWxkLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgPyB0aGlzLl9zZXRTdHJ1Y3R1cmVkKHNlbGYsIGZpZWxkLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5fc2V0VmFsdWUoc2VsZiwgZmllbGQubmFtZSwgdmFsdWUsIGZpZWxkLmlzS2V5KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmU8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZWxhdGlvbjogT0RhdGFNb2RlbFJlbGF0aW9uPEY+XG4gICkge1xuICAgIGlmIChyZWxhdGlvbi5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHJlbGF0aW9uLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZGVsZXRlIHJlbGF0aW9uLnN1YnNjcmlwdGlvbjtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlPEY+KHNlbGY6IE9EYXRhTW9kZWw8VD4sIHJlbGF0aW9uOiBPRGF0YU1vZGVsUmVsYXRpb248Rj4pIHtcbiAgICBpZiAocmVsYXRpb24uc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBpZiAocmVsYXRpb24ubW9kZWwgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdWJzY3JpcHRpb24gbW9kZWwgaXMgbnVsbCcpO1xuICAgIH1cbiAgICByZWxhdGlvbi5zdWJzY3JpcHRpb24gPSByZWxhdGlvbi5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PGFueT4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEJVQkJMSU5HLmluZGV4T2YoZXZlbnQubmFtZSkgIT09IC0xICYmXG4gICAgICAgICAgZXZlbnQuYnViYmxpbmcgJiZcbiAgICAgICAgICAhZXZlbnQudmlzaXRlZChzZWxmKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IHJlbGF0aW9uLm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV2ZW50Lm5hbWUgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgICAgICAgIHJlbGF0aW9uLmZpZWxkLm5hdmlnYXRpb24gJiZcbiAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucz8ua2V5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIHJlZiA9IChyZWxhdGlvbi5tb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLnJlZmVyZW50aWFsKFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uLmZpZWxkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlZikuZm9yRWFjaCgoW2ssIHZdKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0VmFsdWUoc2VsZiwgaywgdiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGV2ZW50LnB1c2goc2VsZiwgcmVsYXRpb24uZmllbGQubmFtZSk7XG4gICAgICAgICAgc2VsZi5ldmVudHMkLmVtaXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIl19
|