angular-odata 0.92.0 → 0.95.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/{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} +3 -1
- package/esm2020/lib/helper.mjs +268 -0
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -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/{esm2015/lib/resources/index.js → esm2020/lib/resources/index.mjs} +0 -0
- package/{esm2015/lib/resources/path/handlers.js → esm2020/lib/resources/path/handlers.mjs} +1 -1
- package/{esm2015/lib/resources/path/index.js → esm2020/lib/resources/path/index.mjs} +0 -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.mjs +207 -0
- package/esm2020/lib/resources/query/handlers.mjs +186 -0
- package/{esm2015/lib/resources/query/index.js → esm2020/lib/resources/query/index.mjs} +0 -0
- package/esm2020/lib/resources/query/options.mjs +103 -0
- package/esm2020/lib/resources/query/syntax.mjs +406 -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 +288 -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} +0 -0
- package/esm2020/lib/schema/parsers/callable.mjs +113 -0
- package/{esm2015/lib/schema/parsers/edm.js → esm2020/lib/schema/parsers/edm.mjs} +2 -2
- package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
- package/{esm2015/lib/schema/parsers/index.js → esm2020/lib/schema/parsers/index.mjs} +0 -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/{esm2015/lib/services/singleton.js → esm2020/lib/services/singleton.mjs} +1 -1
- 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/{esm2015/lib/utils/arraybuffers.js → esm2020/lib/utils/arraybuffers.mjs} +0 -0
- package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
- package/{esm2015/lib/utils/durations.js → esm2020/lib/utils/durations.mjs} +0 -0
- package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
- package/{esm2015/lib/utils/http.js → esm2020/lib/utils/http.mjs} +0 -0
- package/{esm2015/lib/utils/index.js → esm2020/lib/utils/index.mjs} +0 -0
- package/{esm2015/lib/utils/objects.js → esm2020/lib/utils/objects.mjs} +0 -0
- package/esm2020/lib/utils/odata.mjs +22 -0
- package/{esm2015/lib/utils/strings.js → esm2020/lib/utils/strings.mjs} +0 -0
- package/{esm2015/lib/utils/types.js → esm2020/lib/utils/types.mjs} +0 -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} +849 -750
- package/fesm2015/angular-odata.mjs.map +1 -0
- package/fesm2020/angular-odata.mjs +10274 -0
- package/fesm2020/angular-odata.mjs.map +1 -0
- package/lib/api.d.ts +10 -10
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/storage.d.ts +1 -1
- package/lib/client.d.ts +3 -3
- package/lib/constants.d.ts +1 -0
- package/lib/models/collection.d.ts +11 -19
- package/lib/models/model.d.ts +22 -18
- package/lib/models/options.d.ts +16 -21
- package/lib/module.d.ts +1 -1
- package/lib/options.d.ts +1 -0
- package/lib/resources/path/segments.d.ts +1 -1
- package/lib/resources/query/expressions.d.ts +37 -27
- package/lib/resources/query/handlers.d.ts +7 -11
- package/lib/resources/query/options.d.ts +2 -2
- package/lib/resources/query/syntax.d.ts +52 -54
- package/lib/resources/request.d.ts +1 -1
- package/lib/resources/resource.d.ts +25 -8
- package/lib/resources/types/action.d.ts +12 -19
- package/lib/resources/types/batch.d.ts +1 -3
- package/lib/resources/types/count.d.ts +5 -4
- package/lib/resources/types/entity-set.d.ts +11 -15
- package/lib/resources/types/entity.d.ts +12 -15
- package/lib/resources/types/function.d.ts +11 -18
- package/lib/resources/types/media.d.ts +6 -5
- package/lib/resources/types/metadata.d.ts +3 -5
- package/lib/resources/types/navigation-property.d.ts +15 -21
- package/lib/resources/types/property.d.ts +13 -19
- package/lib/resources/types/reference.d.ts +39 -6
- package/lib/resources/types/singleton.d.ts +12 -16
- package/lib/resources/types/value.d.ts +9 -5
- package/lib/schema/{base.d.ts → annotation.d.ts} +0 -0
- package/lib/schema/callable.d.ts +2 -18
- 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 +2 -26
- package/lib/schema/parsers/enum-type.d.ts +4 -4
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +8 -26
- package/lib/services/base.d.ts +2 -2
- package/lib/services/entity-set.d.ts +2 -2
- package/lib/services/entity.d.ts +1 -1
- package/lib/services/singleton.d.ts +2 -2
- package/lib/settings.d.ts +5 -5
- package/lib/types.d.ts +1 -0
- package/package.json +21 -8
- package/bundles/angular-odata.umd.js +0 -11861
- package/bundles/angular-odata.umd.js.map +0 -1
- package/esm2015/lib/api.js +0 -296
- package/esm2015/lib/client.js +0 -272
- package/esm2015/lib/helper.js +0 -268
- package/esm2015/lib/models/collection.js +0 -734
- package/esm2015/lib/models/model.js +0 -438
- package/esm2015/lib/models/options.js +0 -942
- package/esm2015/lib/options.js +0 -31
- package/esm2015/lib/resources/path/segments.js +0 -124
- package/esm2015/lib/resources/query/builder.js +0 -591
- package/esm2015/lib/resources/query/expressions.js +0 -194
- package/esm2015/lib/resources/query/handlers.js +0 -192
- package/esm2015/lib/resources/query/options.js +0 -103
- package/esm2015/lib/resources/query/syntax.js +0 -367
- package/esm2015/lib/resources/request.js +0 -168
- package/esm2015/lib/resources/resource.js +0 -243
- 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 -105
- package/esm2015/lib/resources/types/batch.js +0 -294
- package/esm2015/lib/resources/types/count.js +0 -33
- package/esm2015/lib/resources/types/entity-set.js +0 -101
- package/esm2015/lib/resources/types/entity.js +0 -137
- package/esm2015/lib/resources/types/function.js +0 -130
- 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 -205
- package/esm2015/lib/resources/types/options.js +0 -2
- package/esm2015/lib/resources/types/property.js +0 -151
- package/esm2015/lib/resources/types/reference.js +0 -74
- package/esm2015/lib/resources/types/singleton.js +0 -167
- package/esm2015/lib/resources/types/value.js +0 -35
- package/esm2015/lib/schema/base.js +0 -37
- package/esm2015/lib/schema/callable.js +0 -82
- package/esm2015/lib/schema/entity-container.js +0 -24
- package/esm2015/lib/schema/entity-set.js +0 -35
- package/esm2015/lib/schema/enum-type.js +0 -102
- package/esm2015/lib/schema/parsers/callable.js +0 -107
- package/esm2015/lib/schema/parsers/enum-type.js +0 -107
- package/esm2015/lib/schema/parsers/structured-type.js +0 -392
- package/esm2015/lib/schema/schema.js +0 -52
- package/esm2015/lib/schema/structured-type.js +0 -220
- package/esm2015/lib/services/base.js +0 -23
- package/esm2015/lib/services/entity-set.js +0 -146
- package/esm2015/lib/services/entity.js +0 -12
- package/esm2015/lib/types.js +0 -37
- package/esm2015/lib/utils/odata.js +0 -21
- package/fesm2015/angular-odata.js.map +0 -1
|
@@ -1,591 +0,0 @@
|
|
|
1
|
-
import { __rest } from "tslib";
|
|
2
|
-
const COMPARISON_OPERATORS = ['eq', 'ne', 'gt', 'ge', 'lt', 'le'];
|
|
3
|
-
const LOGICAL_OPERATORS = ['and', 'or', 'not'];
|
|
4
|
-
const COLLECTION_OPERATORS = ['any', 'all'];
|
|
5
|
-
const BOOLEAN_FUNCTIONS = ['startswith', 'endswith', 'contains'];
|
|
6
|
-
const SUPPORTED_EXPAND_PROPERTIES = [
|
|
7
|
-
'expand',
|
|
8
|
-
'levels',
|
|
9
|
-
'select',
|
|
10
|
-
'top',
|
|
11
|
-
'count',
|
|
12
|
-
'orderby',
|
|
13
|
-
'filter',
|
|
14
|
-
];
|
|
15
|
-
const FUNCTION_REGEX = /\((.*)\)/;
|
|
16
|
-
const INDEXOF_REGEX = /(?!indexof)\((\w+)\)/;
|
|
17
|
-
export var StandardAggregateMethods;
|
|
18
|
-
(function (StandardAggregateMethods) {
|
|
19
|
-
StandardAggregateMethods["sum"] = "sum";
|
|
20
|
-
StandardAggregateMethods["min"] = "min";
|
|
21
|
-
StandardAggregateMethods["max"] = "max";
|
|
22
|
-
StandardAggregateMethods["average"] = "average";
|
|
23
|
-
StandardAggregateMethods["countdistinct"] = "countdistinct";
|
|
24
|
-
})(StandardAggregateMethods || (StandardAggregateMethods = {}));
|
|
25
|
-
export var QueryCustomTypes;
|
|
26
|
-
(function (QueryCustomTypes) {
|
|
27
|
-
QueryCustomTypes[QueryCustomTypes["Raw"] = 0] = "Raw";
|
|
28
|
-
QueryCustomTypes[QueryCustomTypes["Alias"] = 1] = "Alias";
|
|
29
|
-
QueryCustomTypes[QueryCustomTypes["Duration"] = 2] = "Duration";
|
|
30
|
-
QueryCustomTypes[QueryCustomTypes["Binary"] = 3] = "Binary";
|
|
31
|
-
})(QueryCustomTypes || (QueryCustomTypes = {}));
|
|
32
|
-
//https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_QueryOptions
|
|
33
|
-
export const raw = (value) => ({
|
|
34
|
-
type: QueryCustomTypes.Raw,
|
|
35
|
-
value,
|
|
36
|
-
});
|
|
37
|
-
export const alias = (value, name) => ({
|
|
38
|
-
type: QueryCustomTypes.Alias,
|
|
39
|
-
value,
|
|
40
|
-
name,
|
|
41
|
-
});
|
|
42
|
-
export const duration = (value) => ({
|
|
43
|
-
type: QueryCustomTypes.Duration,
|
|
44
|
-
value,
|
|
45
|
-
});
|
|
46
|
-
export const binary = (value) => ({
|
|
47
|
-
type: QueryCustomTypes.Binary,
|
|
48
|
-
value,
|
|
49
|
-
});
|
|
50
|
-
export const isQueryCustomType = (value) => typeof value === 'object' &&
|
|
51
|
-
'type' in value &&
|
|
52
|
-
value.type in QueryCustomTypes;
|
|
53
|
-
export const ITEM_ROOT = '';
|
|
54
|
-
export default function ({ select, search, skiptoken, format, top, skip, filter, transform, orderBy, key, count, expand, action, func, aliases, escape, } = {}) {
|
|
55
|
-
const [path, params] = buildPathAndQuery({
|
|
56
|
-
select,
|
|
57
|
-
search,
|
|
58
|
-
skiptoken,
|
|
59
|
-
format,
|
|
60
|
-
top,
|
|
61
|
-
skip,
|
|
62
|
-
filter,
|
|
63
|
-
transform,
|
|
64
|
-
orderBy,
|
|
65
|
-
key,
|
|
66
|
-
count,
|
|
67
|
-
expand,
|
|
68
|
-
action,
|
|
69
|
-
func,
|
|
70
|
-
aliases,
|
|
71
|
-
escape,
|
|
72
|
-
});
|
|
73
|
-
return buildUrl(path, params);
|
|
74
|
-
}
|
|
75
|
-
export function buildPathAndQuery({ select, search, skiptoken, format, top, skip, filter, transform, orderBy, key, count, expand, action, func, aliases, escape, } = {}) {
|
|
76
|
-
let path = '';
|
|
77
|
-
aliases = aliases || [];
|
|
78
|
-
const query = {};
|
|
79
|
-
// key is not (null, undefined)
|
|
80
|
-
if (key != undefined) {
|
|
81
|
-
path += `(${normalizeValue(key, { aliases, escape })})`;
|
|
82
|
-
}
|
|
83
|
-
if (select) {
|
|
84
|
-
query.$select = Array.isArray(select) ? select.join(',') : select;
|
|
85
|
-
}
|
|
86
|
-
if (search) {
|
|
87
|
-
query.$search = search;
|
|
88
|
-
}
|
|
89
|
-
if (skiptoken) {
|
|
90
|
-
query.$skiptoken = skiptoken;
|
|
91
|
-
}
|
|
92
|
-
if (format) {
|
|
93
|
-
query.$format = format;
|
|
94
|
-
}
|
|
95
|
-
if (filter || typeof count === 'object') {
|
|
96
|
-
query.$filter = buildFilter(typeof count === 'object' ? count : filter, {
|
|
97
|
-
aliases,
|
|
98
|
-
escape,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
if (transform) {
|
|
102
|
-
query.$apply = buildTransforms(transform, { aliases, escape });
|
|
103
|
-
}
|
|
104
|
-
if (expand) {
|
|
105
|
-
query.$expand = buildExpand(expand, { aliases, escape });
|
|
106
|
-
}
|
|
107
|
-
if (orderBy) {
|
|
108
|
-
query.$orderby = buildOrderBy(orderBy);
|
|
109
|
-
}
|
|
110
|
-
if (count) {
|
|
111
|
-
if (typeof count === 'boolean') {
|
|
112
|
-
query.$count = true;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
path += '/$count';
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (typeof top === 'number') {
|
|
119
|
-
query.$top = top;
|
|
120
|
-
}
|
|
121
|
-
if (typeof skip === 'number') {
|
|
122
|
-
query.$skip = skip;
|
|
123
|
-
}
|
|
124
|
-
if (action) {
|
|
125
|
-
path += `/${action}`;
|
|
126
|
-
}
|
|
127
|
-
if (func) {
|
|
128
|
-
if (typeof func === 'string') {
|
|
129
|
-
path += `/${func}`;
|
|
130
|
-
}
|
|
131
|
-
else if (typeof func === 'object') {
|
|
132
|
-
const [funcName] = Object.keys(func);
|
|
133
|
-
const funcArgs = normalizeValue(func[funcName], {
|
|
134
|
-
aliases,
|
|
135
|
-
escape,
|
|
136
|
-
});
|
|
137
|
-
path += `/${funcName}`;
|
|
138
|
-
if (funcArgs !== '') {
|
|
139
|
-
path += `(${funcArgs})`;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
if (aliases.length > 0) {
|
|
144
|
-
Object.assign(query, aliases.reduce((acc, alias) => Object.assign(acc, {
|
|
145
|
-
[`@${alias.name}`]: normalizeValue(alias.value, {
|
|
146
|
-
escape,
|
|
147
|
-
}),
|
|
148
|
-
}), {}));
|
|
149
|
-
}
|
|
150
|
-
// Filter empty values
|
|
151
|
-
const params = Object.entries(query)
|
|
152
|
-
.filter(([, value]) => value !== undefined && value !== '')
|
|
153
|
-
.reduce((acc, [key, value]) => Object.assign(acc, { [key]: value }), {});
|
|
154
|
-
return [path, params];
|
|
155
|
-
}
|
|
156
|
-
function renderPrimitiveValue(key, val, { aliases, escape, }) {
|
|
157
|
-
return `${key} eq ${normalizeValue(val, { aliases, escape })}`;
|
|
158
|
-
}
|
|
159
|
-
function buildFilter(filters = {}, { aliases, propPrefix, escape, }) {
|
|
160
|
-
return (Array.isArray(filters) ? filters : [filters]).reduce((acc, filter) => {
|
|
161
|
-
if (filter) {
|
|
162
|
-
const builtFilter = buildFilterCore(filter, {
|
|
163
|
-
aliases,
|
|
164
|
-
propPrefix,
|
|
165
|
-
escape,
|
|
166
|
-
});
|
|
167
|
-
if (builtFilter) {
|
|
168
|
-
acc.push(builtFilter);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return acc;
|
|
172
|
-
}, []).join(' and ');
|
|
173
|
-
function buildFilterCore(filter = {}, { aliases, propPrefix, escape, }) {
|
|
174
|
-
let filterExpr = '';
|
|
175
|
-
if (typeof filter === 'string') {
|
|
176
|
-
// Use raw filter string
|
|
177
|
-
filterExpr = filter;
|
|
178
|
-
}
|
|
179
|
-
else if (filter && typeof filter === 'object') {
|
|
180
|
-
const filtersArray = Object.keys(filter).reduce((result, filterKey) => {
|
|
181
|
-
const value = filter[filterKey];
|
|
182
|
-
let propName = '';
|
|
183
|
-
if (propPrefix) {
|
|
184
|
-
if (filterKey === ITEM_ROOT) {
|
|
185
|
-
propName = propPrefix;
|
|
186
|
-
}
|
|
187
|
-
else if (INDEXOF_REGEX.test(filterKey)) {
|
|
188
|
-
propName = filterKey.replace(INDEXOF_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
|
|
189
|
-
? `(${propPrefix})`
|
|
190
|
-
: `(${propPrefix}/${$1.trim()})`);
|
|
191
|
-
}
|
|
192
|
-
else if (FUNCTION_REGEX.test(filterKey)) {
|
|
193
|
-
propName = filterKey.replace(FUNCTION_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
|
|
194
|
-
? `(${propPrefix})`
|
|
195
|
-
: `(${propPrefix}/${$1.trim()})`);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
propName = `${propPrefix}/${filterKey}`;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
propName = filterKey;
|
|
203
|
-
}
|
|
204
|
-
if (filterKey === ITEM_ROOT && Array.isArray(value)) {
|
|
205
|
-
return result.concat(value.map((arrayValue) => renderPrimitiveValue(propName, arrayValue, { escape, aliases })));
|
|
206
|
-
}
|
|
207
|
-
if (['number', 'string', 'boolean'].indexOf(typeof value) !== -1 ||
|
|
208
|
-
value instanceof Date ||
|
|
209
|
-
value === null) {
|
|
210
|
-
// Simple key/value handled as equals operator
|
|
211
|
-
result.push(renderPrimitiveValue(propName, value, { aliases, escape }));
|
|
212
|
-
}
|
|
213
|
-
else if (Array.isArray(value)) {
|
|
214
|
-
const op = filterKey;
|
|
215
|
-
const builtFilters = value
|
|
216
|
-
.map((v) => buildFilter(v, { aliases, propPrefix, escape }))
|
|
217
|
-
.filter((f) => f)
|
|
218
|
-
.map((f) => LOGICAL_OPERATORS.indexOf(op) !== -1 ? `(${f})` : f);
|
|
219
|
-
if (builtFilters.length) {
|
|
220
|
-
if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
|
|
221
|
-
if (builtFilters.length) {
|
|
222
|
-
if (op === 'not') {
|
|
223
|
-
result.push(parseNot(builtFilters));
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
result.push(`(${builtFilters.join(` ${op} `)})`);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
result.push(builtFilters.join(` ${op} `));
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
else if (LOGICAL_OPERATORS.indexOf(propName) !== -1) {
|
|
236
|
-
const op = propName;
|
|
237
|
-
const builtFilters = Object.keys(value).map((valueKey) => buildFilterCore({ [valueKey]: value[valueKey] }, { aliases, escape }));
|
|
238
|
-
if (builtFilters.length) {
|
|
239
|
-
if (op === 'not') {
|
|
240
|
-
result.push(parseNot(builtFilters));
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
result.push(`${builtFilters.join(` ${op} `)}`);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
else if (typeof value === 'object') {
|
|
248
|
-
if ('type' in value) {
|
|
249
|
-
result.push(renderPrimitiveValue(propName, value, { aliases, escape }));
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
const operators = Object.keys(value);
|
|
253
|
-
operators.forEach((op) => {
|
|
254
|
-
if (COMPARISON_OPERATORS.indexOf(op) !== -1) {
|
|
255
|
-
result.push(`${propName} ${op} ${normalizeValue(value[op], {
|
|
256
|
-
aliases,
|
|
257
|
-
escape,
|
|
258
|
-
})}`);
|
|
259
|
-
}
|
|
260
|
-
else if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
|
|
261
|
-
if (Array.isArray(value[op])) {
|
|
262
|
-
result.push(value[op]
|
|
263
|
-
.map((v) => '(' +
|
|
264
|
-
buildFilterCore(v, {
|
|
265
|
-
aliases,
|
|
266
|
-
propPrefix: propName,
|
|
267
|
-
escape,
|
|
268
|
-
}) +
|
|
269
|
-
')')
|
|
270
|
-
.join(` ${op} `));
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
result.push('(' +
|
|
274
|
-
buildFilterCore(value[op], {
|
|
275
|
-
aliases,
|
|
276
|
-
propPrefix: propName,
|
|
277
|
-
escape,
|
|
278
|
-
}) +
|
|
279
|
-
')');
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
else if (COLLECTION_OPERATORS.indexOf(op) !== -1) {
|
|
283
|
-
const collectionClause = buildCollectionClause(filterKey.toLowerCase(), value[op], op, propName);
|
|
284
|
-
if (collectionClause) {
|
|
285
|
-
result.push(collectionClause);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
else if (op === 'has') {
|
|
289
|
-
result.push(`${propName} ${op} ${normalizeValue(value[op], {
|
|
290
|
-
aliases,
|
|
291
|
-
escape,
|
|
292
|
-
})}`);
|
|
293
|
-
}
|
|
294
|
-
else if (op === 'in') {
|
|
295
|
-
const resultingValues = Array.isArray(value[op])
|
|
296
|
-
? value[op]
|
|
297
|
-
: value[op].value.map((typedValue) => ({
|
|
298
|
-
type: value[op].type,
|
|
299
|
-
value: typedValue,
|
|
300
|
-
}));
|
|
301
|
-
result.push(propName +
|
|
302
|
-
' in (' +
|
|
303
|
-
resultingValues
|
|
304
|
-
.map((v) => normalizeValue(v, { aliases, escape }))
|
|
305
|
-
.join(',') +
|
|
306
|
-
')');
|
|
307
|
-
}
|
|
308
|
-
else if (BOOLEAN_FUNCTIONS.indexOf(op) !== -1) {
|
|
309
|
-
// Simple boolean functions (startswith, endswith, contains)
|
|
310
|
-
result.push(`${op}(${propName},${normalizeValue(value[op], {
|
|
311
|
-
aliases,
|
|
312
|
-
escape,
|
|
313
|
-
})})`);
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
// Nested property
|
|
317
|
-
const filter = buildFilterCore(value, {
|
|
318
|
-
aliases,
|
|
319
|
-
propPrefix: propName,
|
|
320
|
-
escape,
|
|
321
|
-
});
|
|
322
|
-
if (filter) {
|
|
323
|
-
result.push(filter);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
else if (value === undefined) {
|
|
330
|
-
// Ignore/omit filter if value is `undefined`
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
throw new Error(`Unexpected value type: ${value}`);
|
|
334
|
-
}
|
|
335
|
-
return result;
|
|
336
|
-
}, []);
|
|
337
|
-
filterExpr = filtersArray.join(' and ');
|
|
338
|
-
} /* else {
|
|
339
|
-
throw new Error(`Unexpected filters type: ${filter}`);
|
|
340
|
-
} */
|
|
341
|
-
return filterExpr;
|
|
342
|
-
}
|
|
343
|
-
function buildCollectionClause(lambdaParameter, value, op, propName) {
|
|
344
|
-
let clause = '';
|
|
345
|
-
if (typeof value === 'string' || value instanceof String) {
|
|
346
|
-
clause = getStringCollectionClause(lambdaParameter, value, op, propName);
|
|
347
|
-
}
|
|
348
|
-
else if (value) {
|
|
349
|
-
// normalize {any:[{prop1: 1}, {prop2: 1}]} --> {any:{prop1: 1, prop2: 1}}; same for 'all',
|
|
350
|
-
// simple values collection: {any:[{'': 'simpleVal1'}, {'': 'simpleVal2'}]} --> {any:{'': ['simpleVal1', 'simpleVal2']}}; same for 'all',
|
|
351
|
-
const filterValue = Array.isArray(value)
|
|
352
|
-
? value.reduce((acc, item) => {
|
|
353
|
-
if (item.hasOwnProperty(ITEM_ROOT)) {
|
|
354
|
-
if (!acc.hasOwnProperty(ITEM_ROOT)) {
|
|
355
|
-
acc[ITEM_ROOT] = [];
|
|
356
|
-
}
|
|
357
|
-
acc[ITEM_ROOT].push(item[ITEM_ROOT]);
|
|
358
|
-
return acc;
|
|
359
|
-
}
|
|
360
|
-
return Object.assign(Object.assign({}, acc), item);
|
|
361
|
-
}, {})
|
|
362
|
-
: value;
|
|
363
|
-
const filter = buildFilterCore(filterValue, {
|
|
364
|
-
aliases,
|
|
365
|
-
propPrefix: lambdaParameter,
|
|
366
|
-
escape,
|
|
367
|
-
});
|
|
368
|
-
clause = `${propName}/${op}(${filter ? `${lambdaParameter}:${filter}` : ''})`;
|
|
369
|
-
}
|
|
370
|
-
return clause;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
function getStringCollectionClause(lambdaParameter, value, collectionOperator, propName) {
|
|
374
|
-
let clause = '';
|
|
375
|
-
const conditionOperator = collectionOperator == 'all' ? 'ne' : 'eq';
|
|
376
|
-
clause = `${propName}/${collectionOperator}(${lambdaParameter}: ${lambdaParameter} ${conditionOperator} '${value}')`;
|
|
377
|
-
return clause;
|
|
378
|
-
}
|
|
379
|
-
function escapeIllegalChars(string) {
|
|
380
|
-
string = string.replace(/%/g, '%25');
|
|
381
|
-
string = string.replace(/\+/g, '%2B');
|
|
382
|
-
string = string.replace(/\//g, '%2F');
|
|
383
|
-
string = string.replace(/\?/g, '%3F');
|
|
384
|
-
string = string.replace(/#/g, '%23');
|
|
385
|
-
string = string.replace(/&/g, '%26');
|
|
386
|
-
string = string.replace(/'/g, "''");
|
|
387
|
-
return string;
|
|
388
|
-
}
|
|
389
|
-
export function normalizeValue(value, { aliases, escape = false }) {
|
|
390
|
-
if (typeof value === 'string') {
|
|
391
|
-
return escape ? `'${escapeIllegalChars(value)}'` : `'${value}'`;
|
|
392
|
-
}
|
|
393
|
-
else if (value instanceof Date) {
|
|
394
|
-
return value.toISOString();
|
|
395
|
-
}
|
|
396
|
-
else if (typeof value === 'number') {
|
|
397
|
-
return value;
|
|
398
|
-
}
|
|
399
|
-
else if (Array.isArray(value)) {
|
|
400
|
-
return `[${value
|
|
401
|
-
.map((d) => normalizeValue(d, { aliases, escape }))
|
|
402
|
-
.join(',')}]`;
|
|
403
|
-
}
|
|
404
|
-
else if (value === null) {
|
|
405
|
-
return value;
|
|
406
|
-
}
|
|
407
|
-
else if (typeof value === 'object') {
|
|
408
|
-
switch (value.type) {
|
|
409
|
-
case QueryCustomTypes.Raw:
|
|
410
|
-
return value.value;
|
|
411
|
-
case QueryCustomTypes.Duration:
|
|
412
|
-
return `duration'${value.value}'`;
|
|
413
|
-
case QueryCustomTypes.Binary:
|
|
414
|
-
return `binary'${value.value}'`;
|
|
415
|
-
case QueryCustomTypes.Alias:
|
|
416
|
-
// Store
|
|
417
|
-
if (Array.isArray(aliases)) {
|
|
418
|
-
if (value.name === undefined) {
|
|
419
|
-
value.name = `a${aliases.length + 1}`;
|
|
420
|
-
}
|
|
421
|
-
aliases.push(value);
|
|
422
|
-
}
|
|
423
|
-
return `@${value.name}`;
|
|
424
|
-
default:
|
|
425
|
-
return Object.entries(value)
|
|
426
|
-
.filter(([, v]) => v !== undefined)
|
|
427
|
-
.map(([k, v]) => `${k}=${normalizeValue(v, { aliases, escape })}`)
|
|
428
|
-
.join(',');
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
return value;
|
|
432
|
-
}
|
|
433
|
-
function buildExpand(expands, { aliases, escape = false }) {
|
|
434
|
-
if (typeof expands === 'number') {
|
|
435
|
-
return expands;
|
|
436
|
-
}
|
|
437
|
-
else if (typeof expands === 'string') {
|
|
438
|
-
if (expands.indexOf('/') === -1) {
|
|
439
|
-
return expands;
|
|
440
|
-
}
|
|
441
|
-
// Change `Foo/Bar/Baz` to `Foo($expand=Bar($expand=Baz))`
|
|
442
|
-
return expands
|
|
443
|
-
.split('/')
|
|
444
|
-
.reverse()
|
|
445
|
-
.reduce((results, item, index, arr) => {
|
|
446
|
-
if (index === 0) {
|
|
447
|
-
// Inner-most item
|
|
448
|
-
return `$expand=${item}`;
|
|
449
|
-
}
|
|
450
|
-
else if (index === arr.length - 1) {
|
|
451
|
-
// Outer-most item, don't add `$expand=` prefix (added above)
|
|
452
|
-
return `${item}(${results})`;
|
|
453
|
-
}
|
|
454
|
-
else {
|
|
455
|
-
// Other items
|
|
456
|
-
return `$expand=${item}(${results})`;
|
|
457
|
-
}
|
|
458
|
-
}, '');
|
|
459
|
-
}
|
|
460
|
-
else if (Array.isArray(expands)) {
|
|
461
|
-
return `${expands
|
|
462
|
-
.map((e) => buildExpand(e, { aliases, escape }))
|
|
463
|
-
.join(',')}`;
|
|
464
|
-
}
|
|
465
|
-
else if (typeof expands === 'object') {
|
|
466
|
-
const expandKeys = Object.keys(expands);
|
|
467
|
-
if (expandKeys.some((key) => SUPPORTED_EXPAND_PROPERTIES.indexOf(key.toLowerCase()) !== -1)) {
|
|
468
|
-
return expandKeys
|
|
469
|
-
.map((key) => {
|
|
470
|
-
let value;
|
|
471
|
-
switch (key) {
|
|
472
|
-
case 'filter':
|
|
473
|
-
value = buildFilter(expands[key], {
|
|
474
|
-
aliases,
|
|
475
|
-
escape,
|
|
476
|
-
});
|
|
477
|
-
break;
|
|
478
|
-
case 'orderBy':
|
|
479
|
-
value = buildOrderBy(expands[key]);
|
|
480
|
-
break;
|
|
481
|
-
case 'levels':
|
|
482
|
-
case 'count':
|
|
483
|
-
case 'top':
|
|
484
|
-
value = `${expands[key]}`;
|
|
485
|
-
break;
|
|
486
|
-
default:
|
|
487
|
-
value = buildExpand(expands[key], { aliases, escape });
|
|
488
|
-
}
|
|
489
|
-
return `$${key.toLowerCase()}=${value}`;
|
|
490
|
-
})
|
|
491
|
-
.join(';');
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
return expandKeys
|
|
495
|
-
.map((key) => {
|
|
496
|
-
const builtExpand = buildExpand(expands[key], { aliases, escape });
|
|
497
|
-
return builtExpand ? `${key}(${builtExpand})` : key;
|
|
498
|
-
})
|
|
499
|
-
.join(',');
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
return '';
|
|
503
|
-
}
|
|
504
|
-
function buildTransforms(transforms, { aliases, escape = false }) {
|
|
505
|
-
// Wrap single object an array for simplified processing
|
|
506
|
-
const transformsArray = Array.isArray(transforms) ? transforms : [transforms];
|
|
507
|
-
const transformsResult = transformsArray.reduce((result, transform) => {
|
|
508
|
-
const { aggregate, filter, groupBy } = transform, rest = __rest(transform, ["aggregate", "filter", "groupBy"]);
|
|
509
|
-
// TODO: support as many of the following:
|
|
510
|
-
// topcount, topsum, toppercent,
|
|
511
|
-
// bottomsum, bottomcount, bottompercent,
|
|
512
|
-
// identity, concat, expand, search, compute, isdefined
|
|
513
|
-
const unsupportedKeys = Object.keys(rest);
|
|
514
|
-
if (unsupportedKeys.length) {
|
|
515
|
-
throw new Error(`Unsupported transform(s): ${unsupportedKeys}`);
|
|
516
|
-
}
|
|
517
|
-
if (aggregate) {
|
|
518
|
-
result.push(`aggregate(${buildAggregate(aggregate)})`);
|
|
519
|
-
}
|
|
520
|
-
if (filter) {
|
|
521
|
-
const builtFilter = buildFilter(filter, { aliases, escape });
|
|
522
|
-
if (builtFilter) {
|
|
523
|
-
result.push(`filter(${buildFilter(builtFilter, { aliases, escape })})`);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
if (groupBy) {
|
|
527
|
-
result.push(`groupby(${buildGroupBy(groupBy, { aliases, escape })})`);
|
|
528
|
-
}
|
|
529
|
-
return result;
|
|
530
|
-
}, []);
|
|
531
|
-
return transformsResult.join('/') || undefined;
|
|
532
|
-
}
|
|
533
|
-
function buildAggregate(aggregate) {
|
|
534
|
-
// Wrap single object in an array for simplified processing
|
|
535
|
-
const aggregateArray = Array.isArray(aggregate) ? aggregate : [aggregate];
|
|
536
|
-
return aggregateArray
|
|
537
|
-
.map((aggregateItem) => {
|
|
538
|
-
return typeof aggregateItem === 'string'
|
|
539
|
-
? aggregateItem
|
|
540
|
-
: Object.keys(aggregateItem).map((aggregateKey) => {
|
|
541
|
-
const aggregateValue = aggregateItem[aggregateKey];
|
|
542
|
-
// TODO: Are these always required? Can/should we default them if so?
|
|
543
|
-
if (!aggregateValue.with) {
|
|
544
|
-
throw new Error(`'with' property required for '${aggregateKey}'`);
|
|
545
|
-
}
|
|
546
|
-
if (!aggregateValue.as) {
|
|
547
|
-
throw new Error(`'as' property required for '${aggregateKey}'`);
|
|
548
|
-
}
|
|
549
|
-
return `${aggregateKey} with ${aggregateValue.with} as ${aggregateValue.as}`;
|
|
550
|
-
});
|
|
551
|
-
})
|
|
552
|
-
.join(',');
|
|
553
|
-
}
|
|
554
|
-
function buildGroupBy(groupBy, { aliases, escape = false }) {
|
|
555
|
-
if (!groupBy.properties) {
|
|
556
|
-
throw new Error(`'properties' property required for groupBy`);
|
|
557
|
-
}
|
|
558
|
-
let result = `(${groupBy.properties.join(',')})`;
|
|
559
|
-
if (groupBy.transform) {
|
|
560
|
-
result += `,${buildTransforms(groupBy.transform, { aliases, escape })}`;
|
|
561
|
-
}
|
|
562
|
-
return result;
|
|
563
|
-
}
|
|
564
|
-
function buildOrderBy(orderBy, prefix = '') {
|
|
565
|
-
if (Array.isArray(orderBy)) {
|
|
566
|
-
return orderBy
|
|
567
|
-
.map((value) => Array.isArray(value) &&
|
|
568
|
-
value.length === 2 &&
|
|
569
|
-
['asc', 'desc'].indexOf(value[1]) !== -1
|
|
570
|
-
? value.join(' ')
|
|
571
|
-
: value)
|
|
572
|
-
.map((v) => `${prefix}${v}`)
|
|
573
|
-
.join(',');
|
|
574
|
-
}
|
|
575
|
-
else if (typeof orderBy === 'object') {
|
|
576
|
-
return Object.entries(orderBy)
|
|
577
|
-
.map(([k, v]) => buildOrderBy(v, `${k}/`))
|
|
578
|
-
.map((v) => `${prefix}${v}`)
|
|
579
|
-
.join(',');
|
|
580
|
-
}
|
|
581
|
-
return `${prefix}${orderBy}`;
|
|
582
|
-
}
|
|
583
|
-
function buildUrl(path, params) {
|
|
584
|
-
// This can be refactored using URL API. But IE does not support it.
|
|
585
|
-
const queries = Object.entries(params).map(([key, value]) => `${key}=${value}`);
|
|
586
|
-
return queries.length ? `${path}?${queries.join('&')}` : path;
|
|
587
|
-
}
|
|
588
|
-
function parseNot(builtFilters) {
|
|
589
|
-
return `not(${builtFilters.join(' and ')})`;
|
|
590
|
-
}
|
|
591
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvcXVlcnkvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRSxNQUFNLDJCQUEyQixHQUFHO0lBQ2xDLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7Q0FDVCxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDO0FBQ2xDLE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDO0FBUTdDLE1BQU0sQ0FBTixJQUFZLHdCQU1YO0FBTkQsV0FBWSx3QkFBd0I7SUFDbEMsdUNBQVcsQ0FBQTtJQUNYLHVDQUFXLENBQUE7SUFDWCx1Q0FBVyxDQUFBO0lBQ1gsK0NBQW1CLENBQUE7SUFDbkIsMkRBQStCLENBQUE7QUFDakMsQ0FBQyxFQU5XLHdCQUF3QixLQUF4Qix3QkFBd0IsUUFNbkM7QUE0Q0QsTUFBTSxDQUFOLElBQVksZ0JBS1g7QUFMRCxXQUFZLGdCQUFnQjtJQUMxQixxREFBRyxDQUFBO0lBQ0gseURBQUssQ0FBQTtJQUNMLCtEQUFRLENBQUE7SUFDUiwyREFBTSxDQUFBO0FBQ1IsQ0FBQyxFQUxXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFLM0I7QUFTRCx1R0FBdUc7QUFDdkcsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBYSxFQUFtQixFQUFFLENBQUMsQ0FBQztJQUN0RCxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsR0FBRztJQUMxQixLQUFLO0NBQ04sQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBVSxFQUFFLElBQWEsRUFBbUIsRUFBRSxDQUFDLENBQUM7SUFDcEUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEtBQUs7SUFDNUIsS0FBSztJQUNMLElBQUk7Q0FDTCxDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFhLEVBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzNELElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRO0lBQy9CLEtBQUs7Q0FDTixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO0lBQzdCLEtBQUs7Q0FDTixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQzlDLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFDekIsTUFBTSxJQUFJLEtBQUs7SUFDZixLQUFLLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDO0FBZWpDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFNUIsTUFBTSxDQUFDLE9BQU8sV0FBYyxFQUMxQixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEVBQ04sR0FBRyxFQUNILElBQUksRUFDSixNQUFNLEVBQ04sU0FBUyxFQUNULE9BQU8sRUFDUCxHQUFHLEVBQ0gsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxFQUNKLE9BQU8sRUFDUCxNQUFNLE1BQ3NCLEVBQUU7SUFDOUIsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztRQUN2QyxNQUFNO1FBQ04sTUFBTTtRQUNOLFNBQVM7UUFDVCxNQUFNO1FBQ04sR0FBRztRQUNILElBQUk7UUFDSixNQUFNO1FBQ04sU0FBUztRQUNULE9BQU87UUFDUCxHQUFHO1FBQ0gsS0FBSztRQUNMLE1BQU07UUFDTixNQUFNO1FBQ04sSUFBSTtRQUNKLE9BQU87UUFDUCxNQUFNO0tBQ1AsQ0FBQyxDQUFDO0lBRUgsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUksRUFDbkMsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxFQUNOLEdBQUcsRUFDSCxJQUFJLEVBQ0osTUFBTSxFQUNOLFNBQVMsRUFDVCxPQUFPLEVBQ1AsR0FBRyxFQUNILEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEVBQ1AsTUFBTSxNQUNzQixFQUFFO0lBQzlCLElBQUksSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUN0QixPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUV4QixNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7SUFFdEIsK0JBQStCO0lBQy9CLElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRTtRQUNwQixJQUFJLElBQUksSUFBSSxjQUFjLENBQUMsR0FBWSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQztLQUNsRTtJQUVELElBQUksTUFBTSxFQUFFO1FBQ1YsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7S0FDbkU7SUFFRCxJQUFJLE1BQU0sRUFBRTtRQUNWLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0tBQ3hCO0lBRUQsSUFBSSxTQUFTLEVBQUU7UUFDYixLQUFLLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztLQUM5QjtJQUVELElBQUksTUFBTSxFQUFFO1FBQ1YsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7S0FDeEI7SUFFRCxJQUFJLE1BQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdkMsS0FBSyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUN0RSxPQUFPO1lBQ1AsTUFBTTtTQUNQLENBQUMsQ0FBQztLQUNKO0lBRUQsSUFBSSxTQUFTLEVBQUU7UUFDYixLQUFLLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUNoRTtJQUVELElBQUksTUFBTSxFQUFFO1FBQ1YsS0FBSyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDMUQ7SUFFRCxJQUFJLE9BQU8sRUFBRTtRQUNYLEtBQUssQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3hDO0lBRUQsSUFBSSxLQUFLLEVBQUU7UUFDVCxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUM5QixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNyQjthQUFNO1lBQ0wsSUFBSSxJQUFJLFNBQVMsQ0FBQztTQUNuQjtLQUNGO0lBRUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7UUFDM0IsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7S0FDbEI7SUFFRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM1QixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztLQUNwQjtJQUVELElBQUksTUFBTSxFQUFFO1FBQ1YsSUFBSSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7S0FDdEI7SUFFRCxJQUFJLElBQUksRUFBRTtRQUNSLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzVCLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1NBQ3BCO2FBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQVUsRUFBRTtnQkFDdkQsT0FBTztnQkFDUCxNQUFNO2FBQ1AsQ0FBQyxDQUFDO1lBRUgsSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDdkIsSUFBSSxRQUFRLEtBQUssRUFBRSxFQUFFO2dCQUNuQixJQUFJLElBQUksSUFBSSxRQUFRLEdBQUcsQ0FBQzthQUN6QjtTQUNGO0tBQ0Y7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQ1gsS0FBSyxFQUNMLE9BQU8sQ0FBQyxNQUFNLENBQ1osQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDYixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixDQUFDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQzlDLE1BQU07YUFDUCxDQUFDO1NBQ0gsQ0FBQyxFQUNKLEVBQUUsQ0FDSCxDQUNGLENBQUM7S0FDSDtJQUVELHNCQUFzQjtJQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUNqQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztTQUMxRCxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTNFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQzNCLEdBQVcsRUFDWCxHQUFRLEVBQ1IsRUFDRSxPQUFPLEVBQ1AsTUFBTSxHQUlQO0lBRUQsT0FBTyxHQUFHLEdBQUcsT0FBTyxjQUFjLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLFVBQXVCLEVBQUUsRUFDekIsRUFDRSxPQUFPLEVBQ1AsVUFBVSxFQUNWLE1BQU0sR0FDaUU7SUFFekUsT0FDRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDbkQsQ0FBQyxHQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDeEIsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUMxQyxPQUFPO2dCQUNQLFVBQVU7Z0JBQ1YsTUFBTTthQUNQLENBQUMsQ0FBQztZQUNILElBQUksV0FBVyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDdkI7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUNELEVBQUUsQ0FFTCxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVoQixTQUFTLGVBQWUsQ0FDdEIsU0FBc0IsRUFBRSxFQUN4QixFQUNFLE9BQU8sRUFDUCxVQUFVLEVBQ1YsTUFBTSxHQUNpRTtRQUV6RSxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDOUIsd0JBQXdCO1lBQ3hCLFVBQVUsR0FBRyxNQUFNLENBQUM7U0FDckI7YUFBTSxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQzdDLENBQUMsTUFBYSxFQUFFLFNBQVMsRUFBRSxFQUFFO2dCQUMzQixNQUFNLEtBQUssR0FBSSxNQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO3dCQUMzQixRQUFRLEdBQUcsVUFBVSxDQUFDO3FCQUN2Qjt5QkFBTSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7d0JBQ3hDLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUNwRCxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssU0FBUzs0QkFDckIsQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHOzRCQUNuQixDQUFDLENBQUMsSUFBSSxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQ25DLENBQUM7cUJBQ0g7eUJBQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUN6QyxRQUFRLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FDckQsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLFNBQVM7NEJBQ3JCLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRzs0QkFDbkIsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUNuQyxDQUFDO3FCQUNIO3lCQUFNO3dCQUNMLFFBQVEsR0FBRyxHQUFHLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQztxQkFDekM7aUJBQ0Y7cUJBQU07b0JBQ0wsUUFBUSxHQUFHLFNBQVMsQ0FBQztpQkFDdEI7Z0JBRUQsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ25ELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFLENBQzVCLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDaEUsQ0FDRixDQUFDO2lCQUNIO2dCQUVELElBQ0UsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUQsS0FBSyxZQUFZLElBQUk7b0JBQ3JCLEtBQUssS0FBSyxJQUFJLEVBQ2Q7b0JBQ0EsOENBQThDO29CQUM5QyxNQUFNLENBQUMsSUFBSSxDQUNULG9CQUFvQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FDM0QsQ0FBQztpQkFDSDtxQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQy9CLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQztvQkFDckIsTUFBTSxZQUFZLEdBQUcsS0FBSzt5QkFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO3lCQUMzRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzt5QkFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDVCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEQsQ0FBQztvQkFDSixJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUU7d0JBQ3ZCLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFOzRCQUN4QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0NBQ3ZCLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRTtvQ0FDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBd0IsQ0FBQyxDQUFDLENBQUM7aUNBQ2pEO3FDQUFNO29DQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7aUNBQ2xEOzZCQUNGO3lCQUNGOzZCQUFNOzRCQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzt5QkFDM0M7cUJBQ0Y7aUJBQ0Y7cUJBQU0sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ3JELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQztvQkFDcEIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN2RCxlQUFlLENBQ2IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUMvQixFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FDcEIsQ0FDRixDQUFDO29CQUNGLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDdkIsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFOzRCQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUF3QixDQUFDLENBQUMsQ0FBQzt5QkFDakQ7NkJBQU07NEJBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzt5QkFDaEQ7cUJBQ0Y7aUJBQ0Y7cUJBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7b0JBQ3BDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRTt3QkFDbkIsTUFBTSxDQUFDLElBQUksQ0FDVCxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQzNELENBQUM7cUJBQ0g7eUJBQU07d0JBQ0wsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDckMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFOzRCQUN2QixJQUFJLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQ0FDM0MsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLFFBQVEsSUFBSSxFQUFFLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRTtvQ0FDN0MsT0FBTztvQ0FDUCxNQUFNO2lDQUNQLENBQUMsRUFBRSxDQUNMLENBQUM7NkJBQ0g7aUNBQU0sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0NBQy9DLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtvQ0FDNUIsTUFBTSxDQUFDLElBQUksQ0FDVCxLQUFLLENBQUMsRUFBRSxDQUFDO3lDQUNOLEdBQUcsQ0FDRixDQUFDLENBQU0sRUFBRSxFQUFFLENBQ1QsR0FBRzt3Q0FDSCxlQUFlLENBQUMsQ0FBQyxFQUFFOzRDQUNqQixPQUFPOzRDQUNQLFVBQVUsRUFBRSxRQUFROzRDQUNwQixNQUFNO3lDQUNQLENBQUM7d0NBQ0YsR0FBRyxDQUNOO3lDQUNBLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQ25CLENBQUM7aUNBQ0g7cUNBQU07b0NBQ0wsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHO3dDQUNELGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7NENBQ3pCLE9BQU87NENBQ1AsVUFBVSxFQUFFLFFBQVE7NENBQ3BCLE1BQU07eUNBQ1AsQ0FBQzt3Q0FDRixHQUFHLENBQ04sQ0FBQztpQ0FDSDs2QkFDRjtpQ0FBTSxJQUFJLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQ0FDbEQsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FDNUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUN2QixLQUFLLENBQUMsRUFBRSxDQUFDLEVBQ1QsRUFBRSxFQUNGLFFBQVEsQ0FDVCxDQUFDO2dDQUNGLElBQUksZ0JBQWdCLEVBQUU7b0NBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQ0FDL0I7NkJBQ0Y7aUNBQU0sSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFO2dDQUN2QixNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsUUFBUSxJQUFJLEVBQUUsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO29DQUM3QyxPQUFPO29DQUNQLE1BQU07aUNBQ1AsQ0FBQyxFQUFFLENBQ0wsQ0FBQzs2QkFDSDtpQ0FBTSxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0NBQ3RCLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29DQUM5QyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQ0FDWCxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7d0NBQ3hDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSTt3Q0FDcEIsS0FBSyxFQUFFLFVBQVU7cUNBQ2xCLENBQUMsQ0FBQyxDQUFDO2dDQUVSLE1BQU0sQ0FBQyxJQUFJLENBQ1QsUUFBUTtvQ0FDTixPQUFPO29DQUNQLGVBQWU7eUNBQ1osR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7eUNBQ3ZELElBQUksQ0FBQyxHQUFHLENBQUM7b0NBQ1osR0FBRyxDQUNOLENBQUM7NkJBQ0g7aUNBQU0sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0NBQy9DLDREQUE0RDtnQ0FDNUQsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLEVBQUUsSUFBSSxRQUFRLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRTtvQ0FDN0MsT0FBTztvQ0FDUCxNQUFNO2lDQUNQLENBQUMsR0FBRyxDQUNOLENBQUM7NkJBQ0g7aUNBQU07Z0NBQ0wsa0JBQWtCO2dDQUNsQixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFO29DQUNwQyxPQUFPO29DQUNQLFVBQVUsRUFBRSxRQUFRO29DQUNwQixNQUFNO2lDQUNQLENBQUMsQ0FBQztnQ0FDSCxJQUFJLE1BQU0sRUFBRTtvQ0FDVixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lDQUNyQjs2QkFDRjt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtxQkFBTSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQzlCLDZDQUE2QztpQkFDOUM7cUJBQU07b0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDcEQ7Z0JBRUQsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO1lBRUYsVUFBVSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekMsQ0FBQzs7Y0FFSTtRQUNOLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTLHFCQUFxQixDQUM1QixlQUF1QixFQUN2QixLQUFVLEVBQ1YsRUFBVSxFQUNWLFFBQWdCO1FBRWhCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLFlBQVksTUFBTSxFQUFFO1lBQ3hELE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMxRTthQUFNLElBQUksS0FBSyxFQUFFO1lBQ2hCLDJGQUEyRjtZQUMzRix5SUFBeUk7WUFDekksTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO29CQUN6QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFOzRCQUNsQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO3lCQUNyQjt3QkFDRCxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUNyQyxPQUFPLEdBQUcsQ0FBQztxQkFDWjtvQkFDRCx1Q0FBWSxHQUFHLEdBQUssSUFBSSxFQUFHO2dCQUM3QixDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNSLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFVixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxPQUFPO2dCQUNQLFVBQVUsRUFBRSxlQUFlO2dCQUMzQixNQUFNO2FBQ1AsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsUUFBUSxJQUFJLEVBQUUsSUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDNUMsR0FBRyxDQUFDO1NBQ0w7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQ2hDLGVBQXVCLEVBQ3ZCLEtBQVUsRUFDVixrQkFBMEIsRUFDMUIsUUFBZ0I7SUFFaEIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLE1BQU0saUJBQWlCLEdBQUcsa0JBQWtCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRSxNQUFNLEdBQUcsR0FBRyxRQUFRLElBQUksa0JBQWtCLElBQUksZUFBZSxLQUFLLGVBQWUsSUFBSSxpQkFBaUIsS0FBSyxLQUFLLElBQUksQ0FBQztJQUVySCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxNQUFjO0lBQ3hDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsS0FBWSxFQUNaLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQXFEO0lBRTlFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUM7S0FDakU7U0FBTSxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUU7UUFDaEMsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDNUI7U0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUNwQyxPQUFPLEtBQUssQ0FBQztLQUNkO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQy9CLE9BQU8sSUFBSSxLQUFLO2FBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7S0FDakI7U0FBTSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7UUFDekIsT0FBTyxLQUFLLENBQUM7S0FDZDtTQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ3BDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRTtZQUNsQixLQUFLLGdCQUFnQixDQUFDLEdBQUc7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixLQUFLLGdCQUFnQixDQUFDLFFBQVE7Z0JBQzVCLE9BQU8sWUFBWSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDcEMsS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUMxQixPQUFPLFVBQVUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ2xDLEtBQUssZ0JBQWdCLENBQUMsS0FBSztnQkFDekIsUUFBUTtnQkFDUixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzFCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7d0JBQzVCLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3FCQUN2QztvQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNyQjtnQkFDRCxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFCO2dCQUNFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7cUJBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQztxQkFDbEMsR0FBRyxDQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULEdBQUcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUM1RDtxQkFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEI7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUNsQixPQUFrQixFQUNsQixFQUFFLE9BQU8sRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFxRDtJQUU5RSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTtRQUMvQixPQUFPLE9BQWMsQ0FBQztLQUN2QjtTQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO1FBQ3RDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUMvQixPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELDBEQUEwRDtRQUMxRCxPQUFPLE9BQU87YUFDWCxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsT0FBTyxFQUFFO2FBQ1QsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO2dCQUNmLGtCQUFrQjtnQkFDbEIsT0FBTyxXQUFXLElBQUksRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUksS0FBSyxLQUFLLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQyw2REFBNkQ7Z0JBQzdELE9BQU8sR0FBRyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0wsY0FBYztnQkFDZCxPQUFPLFdBQVcsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDO2FBQ3RDO1FBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ1Y7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDakMsT0FBTyxHQUFJLE9BQTJDO2FBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0tBQ2hCO1NBQU0sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7UUFDdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4QyxJQUNFLFVBQVUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDdkUsRUFDRDtZQUNBLE9BQU8sVUFBVTtpQkFDZCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWCxJQUFJLEtBQUssQ0FBQztnQkFDVixRQUFRLEdBQUcsRUFBRTtvQkFDWCxLQUFLLFFBQVE7d0JBQ1gsS0FBSyxHQUFHLFdBQVcsQ0FBRSxPQUFvQyxDQUFDLEdBQUcsQ0FBQyxFQUFFOzRCQUM5RCxPQUFPOzRCQUNQLE1BQU07eUJBQ1AsQ0FBQyxDQUFDO3dCQUNILE1BQU07b0JBQ1IsS0FBSyxTQUFTO3dCQUNaLEtBQUssR0FBRyxZQUFZLENBQ2pCLE9BQW9DLENBQUMsR0FBRyxDQUFlLENBQ3pELENBQUM7d0JBQ0YsTUFBTTtvQkFDUixLQUFLLFFBQVEsQ0FBQztvQkFDZCxLQUFLLE9BQU8sQ0FBQztvQkFDYixLQUFLLEtBQUs7d0JBQ1IsS0FBSyxHQUFHLEdBQUksT0FBb0MsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN4RCxNQUFNO29CQUNSO3dCQUNFLEtBQUssR0FBRyxXQUFXLENBQ2hCLE9BQW9DLENBQUMsR0FBRyxDQUFjLEVBQ3ZELEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUNwQixDQUFDO2lCQUNMO2dCQUNELE9BQU8sSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUMsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO2FBQU07WUFDTCxPQUFPLFVBQVU7aUJBQ2QsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1gsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUM1QixPQUFvQyxDQUNuQyxHQUFHLENBQ3dCLEVBQzdCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUNwQixDQUFDO2dCQUNGLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3RELENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDZDtLQUNGO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLFVBQXlDLEVBQ3pDLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQXFEO0lBRTlFLHdEQUF3RDtJQUN4RCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFOUUsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUM3QyxDQUFDLE1BQWdCLEVBQUUsU0FBUyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxLQUFjLFNBQVMsRUFBbEIsSUFBSSxVQUFLLFNBQVMsRUFBbkQsa0NBQXVDLENBQVksQ0FBQztRQUUxRCwwQ0FBMEM7UUFDMUMsa0NBQWtDO1FBQ2xDLDJDQUEyQztRQUMzQyx5REFBeUQ7UUFDekQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUU7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsZUFBZSxFQUFFLENBQUMsQ0FBQztTQUNqRTtRQUVELElBQUksU0FBUyxFQUFFO1lBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLFdBQVcsRUFBRTtnQkFDZixNQUFNLENBQUMsSUFBSSxDQUNULFVBQVUsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQzNELENBQUM7YUFDSDtTQUNGO1FBQ0QsSUFBSSxPQUFPLEVBQUU7WUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN2RTtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUVGLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsU0FBa0M7SUFDeEQsMkRBQTJEO0lBQzNELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUxRSxPQUFPLGNBQWM7U0FDbEIsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7UUFDckIsT0FBTyxPQUFPLGFBQWEsS0FBSyxRQUFRO1lBQ3RDLENBQUMsQ0FBQyxhQUFhO1lBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQzlDLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFFbkQsc0VBQXNFO2dCQUN0RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRTtvQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsWUFBWSxHQUFHLENBQUMsQ0FBQztpQkFDbkU7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLFlBQVksR0FBRyxDQUFDLENBQUM7aUJBQ2pFO2dCQUVELE9BQU8sR0FBRyxZQUFZLFNBQVMsY0FBYyxDQUFDLElBQUksT0FBTyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUM7SUFDVCxDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLE9BQW1CLEVBQ25CLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQXFEO0lBRTlFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUVqRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7UUFDckIsTUFBTSxJQUFJLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQ3pFO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFJLE9BQW1CLEVBQUUsU0FBaUIsRUFBRTtJQUMvRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUIsT0FBUSxPQUE4QjthQUNuQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNiLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNsQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLENBQUMsS0FBSyxDQUNWO2FBQ0EsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzthQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDZDtTQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO1FBQ3RDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFpQixFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN6RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNkO0lBQ0QsT0FBTyxHQUFHLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsSUFBWSxFQUFFLE1BQStCO0lBQzdELG9FQUFvRTtJQUNwRSxNQUFNLE9BQU8sR0FBYSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FDbEQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQ3BDLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2hFLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxZQUFzQjtJQUN0QyxPQUFPLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBDT01QQVJJU09OX09QRVJBVE9SUyA9IFsnZXEnLCAnbmUnLCAnZ3QnLCAnZ2UnLCAnbHQnLCAnbGUnXTtcbmNvbnN0IExPR0lDQUxfT1BFUkFUT1JTID0gWydhbmQnLCAnb3InLCAnbm90J107XG5jb25zdCBDT0xMRUNUSU9OX09QRVJBVE9SUyA9IFsnYW55JywgJ2FsbCddO1xuY29uc3QgQk9PTEVBTl9GVU5DVElPTlMgPSBbJ3N0YXJ0c3dpdGgnLCAnZW5kc3dpdGgnLCAnY29udGFpbnMnXTtcbmNvbnN0IFNVUFBPUlRFRF9FWFBBTkRfUFJPUEVSVElFUyA9IFtcbiAgJ2V4cGFuZCcsXG4gICdsZXZlbHMnLFxuICAnc2VsZWN0JyxcbiAgJ3RvcCcsXG4gICdjb3VudCcsXG4gICdvcmRlcmJ5JyxcbiAgJ2ZpbHRlcicsXG5dO1xuXG5jb25zdCBGVU5DVElPTl9SRUdFWCA9IC9cXCgoLiopXFwpLztcbmNvbnN0IElOREVYT0ZfUkVHRVggPSAvKD8haW5kZXhvZilcXCgoXFx3KylcXCkvO1xuXG5leHBvcnQgdHlwZSBVbnBhY2tlZDxUPiA9IFQgZXh0ZW5kcyAoaW5mZXIgVSlbXSA/IFUgOiBUO1xuZXhwb3J0IHR5cGUgU2VsZWN0PFQ+ID0gU2VsZWN0VHlwZTxUPiB8IFNlbGVjdFR5cGU8VD5bXTtcbmV4cG9ydCB0eXBlIFNlbGVjdFR5cGU8VD4gPSBzdHJpbmcgfCBrZXlvZiBUO1xuZXhwb3J0IHR5cGUgRmlsdGVyPFQ+ID0gRmlsdGVyVHlwZSB8IEZpbHRlclR5cGVbXTtcbmV4cG9ydCB0eXBlIEZpbHRlclR5cGUgPSBzdHJpbmcgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcblxuZXhwb3J0IGVudW0gU3RhbmRhcmRBZ2dyZWdhdGVNZXRob2RzIHtcbiAgc3VtID0gJ3N1bScsXG4gIG1pbiA9ICdtaW4nLFxuICBtYXggPSAnbWF4JyxcbiAgYXZlcmFnZSA9ICdhdmVyYWdlJyxcbiAgY291bnRkaXN0aW5jdCA9ICdjb3VudGRpc3RpbmN0Jyxcbn1cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZSA9XG4gIHwgc3RyaW5nXG4gIHwgeyBbcHJvcGVydHlOYW1lOiBzdHJpbmddOiB7IHdpdGg6IFN0YW5kYXJkQWdncmVnYXRlTWV0aG9kczsgYXM6IHN0cmluZyB9IH07XG5cbi8vIE9yZGVyQnlcblxuZXhwb3J0IHR5cGUgT3JkZXJCeTxUPiA9IE9yZGVyQnlUeXBlPFQ+IHwgT3JkZXJCeVR5cGU8VD5bXTtcbmV4cG9ydCB0eXBlIE9yZGVyQnlUeXBlPFQ+ID0gc3RyaW5nIHwgT3JkZXJCeU9iamVjdDxUPjtcbmV4cG9ydCB0eXBlIE9yZGVyQnlPYmplY3Q8VD4gPSBrZXlvZiBUIHwgW2tleW9mIFQgfCBzdHJpbmcsICdhc2MnIHwgJ2Rlc2MnXTtcbi8vVE9ETzogc3VwcG9ydCBhbmd1bGFyIDEyIHJlY3Vyc2l2ZSB0eXBlOlxuLypcbmV4cG9ydCB0eXBlIE9yZGVyQnlPcHRpb25zPFQ+ID0ga2V5b2YgVCB8IFsga2V5b2YgVCB8IHN0cmluZywgJ2FzYycgfCAnZGVzYycgXTtcbmV4cG9ydCB0eXBlIE5lc3RlZE9yZGVyQnk8VD4gPSB7IFtQIGluIGtleW9mIFRdPzogVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIEU+ID8gT3JkZXJCeTxFPiA6IE9yZGVyQnk8VFtQXT4gfVxuZXhwb3J0IHR5cGUgT3JkZXJCeTxUPiA9IHN0cmluZyB8IE9yZGVyQnlPcHRpb25zPFQ+IHwgQXJyYXk8T3JkZXJCeU9wdGlvbnM8VD4+IHwgTmVzdGVkT3JkZXJCeTxUPjtcbiovXG5cbi8vIEV4cGFuZFxuZXhwb3J0IHR5cGUgRXhwYW5kPFQ+ID0gRXhwYW5kVHlwZTxUPiB8IEV4cGFuZFR5cGU8VD5bXTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGU8VD4gPSBzdHJpbmcgfCBFeHBhbmRPYmplY3Q8VD47XG5leHBvcnQgdHlwZSBFeHBhbmRPYmplY3Q8VD4gPSBrZXlvZiBUIHwgTmVzdGVkRXhwYW5kT3B0aW9uczxUPjtcbmV4cG9ydCB0eXBlIE5lc3RlZEV4cGFuZE9wdGlvbnM8VD4gPSB7XG4gIFtQIGluIGtleW9mIFRdPzogRXhwYW5kT3B0aW9uczxVbnBhY2tlZDxUW1BdPj47XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kT3B0aW9uczxUPiA9IHtcbiAgc2VsZWN0PzogU2VsZWN0PFQ+O1xuICBmaWx0ZXI/OiBGaWx0ZXI8VD47XG4gIG9yZGVyQnk/OiBPcmRlckJ5PFQ+O1xuICB0b3A/OiBudW1iZXI7XG4gIGxldmVscz86IG51bWJlciB8ICdtYXgnO1xuICBjb3VudD86IGJvb2xlYW4gfCBGaWx0ZXI8VD47XG4gIGV4cGFuZD86IEV4cGFuZDxUPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRyYW5zZm9ybTxUPiA9IHtcbiAgYWdncmVnYXRlPzogQWdncmVnYXRlIHwgQXJyYXk8QWdncmVnYXRlPjtcbiAgZmlsdGVyPzogRmlsdGVyPFQ+O1xuICBncm91cEJ5PzogR3JvdXBCeTxUPjtcbn07XG5leHBvcnQgdHlwZSBHcm91cEJ5PFQ+ID0ge1xuICBwcm9wZXJ0aWVzOiBBcnJheTxrZXlvZiBUPjtcbiAgdHJhbnNmb3JtPzogVHJhbnNmb3JtPFQ+O1xufTtcblxuZXhwb3J0IGVudW0gUXVlcnlDdXN0b21UeXBlcyB7XG4gIFJhdyxcbiAgQWxpYXMsXG4gIER1cmF0aW9uLFxuICBCaW5hcnksXG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q3VzdG9tVHlwZSA9IHtcbiAgdHlwZTogUXVlcnlDdXN0b21UeXBlcztcbiAgdmFsdWU6IGFueTtcbiAgbmFtZT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBWYWx1ZSA9IHN0cmluZyB8IERhdGUgfCBudW1iZXIgfCBib29sZWFuIHwgUXVlcnlDdXN0b21UeXBlO1xuXG4vL2h0dHBzOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9vZGF0YS9vZGF0YS92NC4wMS9vZGF0YS12NC4wMS1wYXJ0Mi11cmwtY29udmVudGlvbnMuaHRtbCNzZWNfUXVlcnlPcHRpb25zXG5leHBvcnQgY29uc3QgcmF3ID0gKHZhbHVlOiBzdHJpbmcpOiBRdWVyeUN1c3RvbVR5cGUgPT4gKHtcbiAgdHlwZTogUXVlcnlDdXN0b21UeXBlcy5SYXcsXG4gIHZhbHVlLFxufSk7XG5leHBvcnQgY29uc3QgYWxpYXMgPSAodmFsdWU6IGFueSwgbmFtZT86IHN0cmluZyk6IFF1ZXJ5Q3VzdG9tVHlwZSA9PiAoe1xuICB0eXBlOiBRdWVyeUN1c3RvbVR5cGVzLkFsaWFzLFxuICB2YWx1ZSxcbiAgbmFtZSxcbn0pO1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uID0gKHZhbHVlOiBzdHJpbmcpOiBRdWVyeUN1c3RvbVR5cGUgPT4gKHtcbiAgdHlwZTogUXVlcnlDdXN0b21UeXBlcy5EdXJhdGlvbixcbiAgdmFsdWUsXG59KTtcbmV4cG9ydCBjb25zdCBiaW5hcnkgPSAodmFsdWU6IHN0cmluZyk6IFF1ZXJ5Q3VzdG9tVHlwZSA9PiAoe1xuICB0eXBlOiBRdWVyeUN1c3RvbVR5cGVzLkJpbmFyeSxcbiAgdmFsdWUsXG59KTtcbmV4cG9ydCBjb25zdCBpc1F1ZXJ5Q3VzdG9tVHlwZSA9ICh2YWx1ZTogYW55KSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICd0eXBlJyBpbiB2YWx1ZSAmJlxuICB2YWx1ZS50eXBlIGluIFF1ZXJ5Q3VzdG9tVHlwZXM7XG5leHBvcnQgdHlwZSBRdWVyeU9wdGlvbnM8VD4gPSBFeHBhbmRPcHRpb25zPFQ+ICYge1xuICBzZWFyY2g6IHN0cmluZztcbiAgdHJhbnNmb3JtOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W107XG4gIHNraXA6IG51bWJlcjtcbiAgc2tpcHRva2VuOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIGNvdW50OiBib29sZWFuIHwgRmlsdGVyPFQ+O1xuICBhY3Rpb246IHN0cmluZztcbiAgZnVuYzogc3RyaW5nIHwgeyBbZnVuY3Rpb25OYW1lOiBzdHJpbmddOiB7IFtwYXJhbWV0ZXJOYW1lOiBzdHJpbmddOiBhbnkgfSB9O1xuICBmb3JtYXQ6IHN0cmluZztcbiAgYWxpYXNlczogUXVlcnlDdXN0b21UeXBlW107XG4gIGVzY2FwZTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBJVEVNX1JPT1QgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gPFQ+KHtcbiAgc2VsZWN0LFxuICBzZWFyY2gsXG4gIHNraXB0b2tlbixcbiAgZm9ybWF0LFxuICB0b3AsXG4gIHNraXAsXG4gIGZpbHRlcixcbiAgdHJhbnNmb3JtLFxuICBvcmRlckJ5LFxuICBrZXksXG4gIGNvdW50LFxuICBleHBhbmQsXG4gIGFjdGlvbixcbiAgZnVuYyxcbiAgYWxpYXNlcyxcbiAgZXNjYXBlLFxufTogUGFydGlhbDxRdWVyeU9wdGlvbnM8VD4+ID0ge30pIHtcbiAgY29uc3QgW3BhdGgsIHBhcmFtc10gPSBidWlsZFBhdGhBbmRRdWVyeSh7XG4gICAgc2VsZWN0LFxuICAgIHNlYXJjaCxcbiAgICBza2lwdG9rZW4sXG4gICAgZm9ybWF0LFxuICAgIHRvcCxcbiAgICBza2lwLFxuICAgIGZpbHRlcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgb3JkZXJCeSxcbiAgICBrZXksXG4gICAgY291bnQsXG4gICAgZXhwYW5kLFxuICAgIGFjdGlvbixcbiAgICBmdW5jLFxuICAgIGFsaWFzZXMsXG4gICAgZXNjYXBlLFxuICB9KTtcblxuICByZXR1cm4gYnVpbGRVcmwocGF0aCwgcGFyYW1zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGF0aEFuZFF1ZXJ5PFQ+KHtcbiAgc2VsZWN0LFxuICBzZWFyY2gsXG4gIHNraXB0b2tlbixcbiAgZm9ybWF0LFxuICB0b3AsXG4gIHNraXAsXG4gIGZpbHRlcixcbiAgdHJhbnNmb3JtLFxuICBvcmRlckJ5LFxuICBrZXksXG4gIGNvdW50LFxuICBleHBhbmQsXG4gIGFjdGlvbixcbiAgZnVuYyxcbiAgYWxpYXNlcyxcbiAgZXNjYXBlLFxufTogUGFydGlhbDxRdWVyeU9wdGlvbnM8VD4+ID0ge30pOiBbc3RyaW5nLCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfV0ge1xuICBsZXQgcGF0aDogc3RyaW5nID0gJyc7XG4gIGFsaWFzZXMgPSBhbGlhc2VzIHx8IFtdO1xuXG4gIGNvbnN0IHF1ZXJ5OiBhbnkgPSB7fTtcblxuICAvLyBrZXkgaXMgbm90IChudWxsLCB1bmRlZmluZWQpXG4gIGlmIChrZXkgIT0gdW5kZWZpbmVkKSB7XG4gICAgcGF0aCArPSBgKCR7bm9ybWFsaXplVmFsdWUoa2V5IGFzIFZhbHVlLCB7IGFsaWFzZXMsIGVzY2FwZSB9KX0pYDtcbiAgfVxuXG4gIGlmIChzZWxlY3QpIHtcbiAgICBxdWVyeS4kc2VsZWN0ID0gQXJyYXkuaXNBcnJheShzZWxlY3QpID8gc2VsZWN0LmpvaW4oJywnKSA6IHNlbGVjdDtcbiAgfVxuXG4gIGlmIChzZWFyY2gpIHtcbiAgICBxdWVyeS4kc2VhcmNoID0gc2VhcmNoO1xuICB9XG5cbiAgaWYgKHNraXB0b2tlbikge1xuICAgIHF1ZXJ5LiRza2lwdG9rZW4gPSBza2lwdG9rZW47XG4gIH1cblxuICBpZiAoZm9ybWF0KSB7XG4gICAgcXVlcnkuJGZvcm1hdCA9IGZvcm1hdDtcbiAgfVxuXG4gIGlmIChmaWx0ZXIgfHwgdHlwZW9mIGNvdW50ID09PSAnb2JqZWN0Jykge1xuICAgIHF1ZXJ5LiRmaWx0ZXIgPSBidWlsZEZpbHRlcih0eXBlb2YgY291bnQgPT09ICdvYmplY3QnID8gY291bnQgOiBmaWx0ZXIsIHtcbiAgICAgIGFsaWFzZXMsXG4gICAgICBlc2NhcGUsXG4gICAgfSk7XG4gIH1cblxuICBpZiAodHJhbnNmb3JtKSB7XG4gICAgcXVlcnkuJGFwcGx5ID0gYnVpbGRUcmFuc2Zvcm1zKHRyYW5zZm9ybSwgeyBhbGlhc2VzLCBlc2NhcGUgfSk7XG4gIH1cblxuICBpZiAoZXhwYW5kKSB7XG4gICAgcXVlcnkuJGV4cGFuZCA9IGJ1aWxkRXhwYW5kKGV4cGFuZCwgeyBhbGlhc2VzLCBlc2NhcGUgfSk7XG4gIH1cblxuICBpZiAob3JkZXJCeSkge1xuICAgIHF1ZXJ5LiRvcmRlcmJ5ID0gYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgaWYgKHR5cGVvZiBjb3VudCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBxdWVyeS4kY291bnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoICs9ICcvJGNvdW50JztcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRvcCA9PT0gJ251bWJlcicpIHtcbiAgICBxdWVyeS4kdG9wID0gdG9wO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBza2lwID09PSAnbnVtYmVyJykge1xuICAgIHF1ZXJ5LiRza2lwID0gc2tpcDtcbiAgfVxuXG4gIGlmIChhY3Rpb24pIHtcbiAgICBwYXRoICs9IGAvJHthY3Rpb259YDtcbiAgfVxuXG4gIGlmIChmdW5jKSB7XG4gICAgaWYgKHR5cGVvZiBmdW5jID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0aCArPSBgLyR7ZnVuY31gO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZ1bmMgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBbZnVuY05hbWVdID0gT2JqZWN0LmtleXMoZnVuYyk7XG4gICAgICBjb25zdCBmdW5jQXJncyA9IG5vcm1hbGl6ZVZhbHVlKGZ1bmNbZnVuY05hbWVdIGFzIFZhbHVlLCB7XG4gICAgICAgIGFsaWFzZXMsXG4gICAgICAgIGVzY2FwZSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXRoICs9IGAvJHtmdW5jTmFtZX1gO1xuICAgICAgaWYgKGZ1bmNBcmdzICE9PSAnJykge1xuICAgICAgICBwYXRoICs9IGAoJHtmdW5jQXJnc30pYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgT2JqZWN0LmFzc2lnbihcbiAgICAgIHF1ZXJ5LFxuICAgICAgYWxpYXNlcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGFsaWFzKSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWNjLCB7XG4gICAgICAgICAgICBbYEAke2FsaWFzLm5hbWV9YF06IG5vcm1hbGl6ZVZhbHVlKGFsaWFzLnZhbHVlLCB7XG4gICAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvLyBGaWx0ZXIgZW1wdHkgdmFsdWVzXG4gIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5lbnRyaWVzKHF1ZXJ5KVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJycpXG4gICAgLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiB2YWx1ZSB9KSwge30pO1xuXG4gIHJldHVybiBbcGF0aCwgcGFyYW1zXTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyUHJpbWl0aXZlVmFsdWUoXG4gIGtleTogc3RyaW5nLFxuICB2YWw6IGFueSxcbiAge1xuICAgIGFsaWFzZXMsXG4gICAgZXNjYXBlLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gIH1cbikge1xuICByZXR1cm4gYCR7a2V5fSBlcSAke25vcm1hbGl6ZVZhbHVlKHZhbCwgeyBhbGlhc2VzLCBlc2NhcGUgfSl9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRGaWx0ZXIoXG4gIGZpbHRlcnM6IEZpbHRlcjxhbnk+ID0ge30sXG4gIHtcbiAgICBhbGlhc2VzLFxuICAgIHByb3BQcmVmaXgsXG4gICAgZXNjYXBlLFxuICB9OiB7IGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTsgcHJvcFByZWZpeD86IHN0cmluZzsgZXNjYXBlPzogYm9vbGVhbiB9XG4pOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIChBcnJheS5pc0FycmF5KGZpbHRlcnMpID8gZmlsdGVycyA6IFtmaWx0ZXJzXSkucmVkdWNlKFxuICAgICAgKGFjYzogc3RyaW5nW10sIGZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgY29uc3QgYnVpbHRGaWx0ZXIgPSBidWlsZEZpbHRlckNvcmUoZmlsdGVyLCB7XG4gICAgICAgICAgICBhbGlhc2VzLFxuICAgICAgICAgICAgcHJvcFByZWZpeCxcbiAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoYnVpbHRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGJ1aWx0RmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXVxuICAgICkgYXMgc3RyaW5nW11cbiAgKS5qb2luKCcgYW5kICcpO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkRmlsdGVyQ29yZShcbiAgICBmaWx0ZXI6IEZpbHRlcjxhbnk+ID0ge30sXG4gICAge1xuICAgICAgYWxpYXNlcyxcbiAgICAgIHByb3BQcmVmaXgsXG4gICAgICBlc2NhcGUsXG4gICAgfTogeyBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107IHByb3BQcmVmaXg/OiBzdHJpbmc7IGVzY2FwZT86IGJvb2xlYW4gfVxuICApIHtcbiAgICBsZXQgZmlsdGVyRXhwciA9ICcnO1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVXNlIHJhdyBmaWx0ZXIgc3RyaW5nXG4gICAgICBmaWx0ZXJFeHByID0gZmlsdGVyO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyICYmIHR5cGVvZiBmaWx0ZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBmaWx0ZXJzQXJyYXkgPSBPYmplY3Qua2V5cyhmaWx0ZXIpLnJlZHVjZShcbiAgICAgICAgKHJlc3VsdDogYW55W10sIGZpbHRlcktleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gKGZpbHRlciBhcyBhbnkpW2ZpbHRlcktleV07XG4gICAgICAgICAgbGV0IHByb3BOYW1lID0gJyc7XG4gICAgICAgICAgaWYgKHByb3BQcmVmaXgpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJLZXkgPT09IElURU1fUk9PVCkge1xuICAgICAgICAgICAgICBwcm9wTmFtZSA9IHByb3BQcmVmaXg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKElOREVYT0ZfUkVHRVgudGVzdChmaWx0ZXJLZXkpKSB7XG4gICAgICAgICAgICAgIHByb3BOYW1lID0gZmlsdGVyS2V5LnJlcGxhY2UoSU5ERVhPRl9SRUdFWCwgKF8sICQxKSA9PlxuICAgICAgICAgICAgICAgICQxLnRyaW0oKSA9PT0gSVRFTV9ST09UXG4gICAgICAgICAgICAgICAgICA/IGAoJHtwcm9wUHJlZml4fSlgXG4gICAgICAgICAgICAgICAgICA6IGAoJHtwcm9wUHJlZml4fS8keyQxLnRyaW0oKX0pYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChGVU5DVElPTl9SRUdFWC50ZXN0KGZpbHRlcktleSkpIHtcbiAgICAgICAgICAgICAgcHJvcE5hbWUgPSBmaWx0ZXJLZXkucmVwbGFjZShGVU5DVElPTl9SRUdFWCwgKF8sICQxKSA9PlxuICAgICAgICAgICAgICAgICQxLnRyaW0oKSA9PT0gSVRFTV9ST09UXG4gICAgICAgICAgICAgICAgICA/IGAoJHtwcm9wUHJlZml4fSlgXG4gICAgICAgICAgICAgICAgICA6IGAoJHtwcm9wUHJlZml4fS8keyQxLnRyaW0oKX0pYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHJvcE5hbWUgPSBgJHtwcm9wUHJlZml4fS8ke2ZpbHRlcktleX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9wTmFtZSA9IGZpbHRlcktleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmlsdGVyS2V5ID09PSBJVEVNX1JPT1QgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuY29uY2F0KFxuICAgICAgICAgICAgICB2YWx1ZS5tYXAoKGFycmF5VmFsdWU6IGFueSkgPT5cbiAgICAgICAgICAgICAgICByZW5kZXJQcmltaXRpdmVWYWx1ZShwcm9wTmFtZSwgYXJyYXlWYWx1ZSwgeyBlc2NhcGUsIGFsaWFzZXMgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBbJ251bWJlcicsICdzdHJpbmcnLCAnYm9vbGVhbiddLmluZGV4T2YodHlwZW9mIHZhbHVlKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgdmFsdWUgPT09IG51bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFNpbXBsZSBrZXkvdmFsdWUgaGFuZGxlZCBhcyBlcXVhbHMgb3BlcmF0b3JcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICByZW5kZXJQcmltaXRpdmVWYWx1ZShwcm9wTmFtZSwgdmFsdWUsIHsgYWxpYXNlcywgZXNjYXBlIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wID0gZmlsdGVyS2V5O1xuICAgICAgICAgICAgY29uc3QgYnVpbHRGaWx0ZXJzID0gdmFsdWVcbiAgICAgICAgICAgICAgLm1hcCgodikgPT4gYnVpbGRGaWx0ZXIodiwgeyBhbGlhc2VzLCBwcm9wUHJlZml4LCBlc2NhcGUgfSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYpXG4gICAgICAgICAgICAgIC5tYXAoKGYpID0+XG4gICAgICAgICAgICAgICAgTE9HSUNBTF9PUEVSQVRPUlMuaW5kZXhPZihvcCkgIT09IC0xID8gYCgke2Z9KWAgOiBmXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoYnVpbHRGaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAoTE9HSUNBTF9PUEVSQVRPUlMuaW5kZXhPZihvcCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1aWx0RmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gJ25vdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VOb3QoYnVpbHRGaWx0ZXJzIGFzIHN0cmluZ1tdKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChgKCR7YnVpbHRGaWx0ZXJzLmpvaW4oYCAke29wfSBgKX0pYCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJ1aWx0RmlsdGVycy5qb2luKGAgJHtvcH0gYCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChMT0dJQ0FMX09QRVJBVE9SUy5pbmRleE9mKHByb3BOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wID0gcHJvcE5hbWU7XG4gICAgICAgICAgICBjb25zdCBidWlsdEZpbHRlcnMgPSBPYmplY3Qua2V5cyh2YWx1ZSkubWFwKCh2YWx1ZUtleSkgPT5cbiAgICAgICAgICAgICAgYnVpbGRGaWx0ZXJDb3JlKFxuICAgICAgICAgICAgICAgIHsgW3ZhbHVlS2V5XTogdmFsdWVbdmFsdWVLZXldIH0sXG4gICAgICAgICAgICAgICAgeyBhbGlhc2VzLCBlc2NhcGUgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGJ1aWx0RmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKG9wID09PSAnbm90Jykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlTm90KGJ1aWx0RmlsdGVycyBhcyBzdHJpbmdbXSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGAke2J1aWx0RmlsdGVycy5qb2luKGAgJHtvcH0gYCl9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgndHlwZScgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgcmVuZGVyUHJpbWl0aXZlVmFsdWUocHJvcE5hbWUsIHZhbHVlLCB7IGFsaWFzZXMsIGVzY2FwZSB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgICAgICAgICBvcGVyYXRvcnMuZm9yRWFjaCgob3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQ09NUEFSSVNPTl9PUEVSQVRPUlMuaW5kZXhPZihvcCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7cHJvcE5hbWV9ICR7b3B9ICR7bm9ybWFsaXplVmFsdWUodmFsdWVbb3BdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgICAgIH0pfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChMT0dJQ0FMX09QRVJBVE9SUy5pbmRleE9mKG9wKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlW29wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVbb3BdXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAodjogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRGaWx0ZXJDb3JlKHYsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wUHJlZml4OiBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihgICR7b3B9IGApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRGaWx0ZXJDb3JlKHZhbHVlW29wXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wUHJlZml4OiBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDT0xMRUNUSU9OX09QRVJBVE9SUy5pbmRleE9mKG9wKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25DbGF1c2UgPSBidWlsZENvbGxlY3Rpb25DbGF1c2UoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcktleS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvcF0sXG4gICAgICAgICAgICAgICAgICAgIG9wLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uQ2xhdXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbGxlY3Rpb25DbGF1c2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICdoYXMnKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7cHJvcE5hbWV9ICR7b3B9ICR7bm9ybWFsaXplVmFsdWUodmFsdWVbb3BdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgICAgIH0pfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ2luJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0aW5nVmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZVtvcF0pXG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWVbb3BdXG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWVbb3BdLnZhbHVlLm1hcCgodHlwZWRWYWx1ZTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWVbb3BdLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgJyBpbiAoJyArXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh2OiBhbnkpID0+IG5vcm1hbGl6ZVZhbHVlKHYsIHsgYWxpYXNlcywgZXNjYXBlIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywnKSArXG4gICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQk9PTEVBTl9GVU5DVElPTlMuaW5kZXhPZihvcCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTaW1wbGUgYm9vbGVhbiBmdW5jdGlvbnMgKHN0YXJ0c3dpdGgsIGVuZHN3aXRoLCBjb250YWlucylcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHtvcH0oJHtwcm9wTmFtZX0sJHtub3JtYWxpemVWYWx1ZSh2YWx1ZVtvcF0sIHtcbiAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzLFxuICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICAgICAgICAgICAgfSl9KWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gYnVpbGRGaWx0ZXJDb3JlKHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BQcmVmaXg6IHByb3BOYW1lLFxuICAgICAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gSWdub3JlL29taXQgZmlsdGVyIGlmIHZhbHVlIGlzIGB1bmRlZmluZWRgXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSB0eXBlOiAke3ZhbHVlfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBmaWx0ZXJFeHByID0gZmlsdGVyc0FycmF5LmpvaW4oJyBhbmQgJyk7XG4gICAgfSAvKiBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZpbHRlcnMgdHlwZTogJHtmaWx0ZXJ9YCk7XG4gICAgICB9ICovXG4gICAgcmV0dXJuIGZpbHRlckV4cHI7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENvbGxlY3Rpb25DbGF1c2UoXG4gICAgbGFtYmRhUGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcDogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGNsYXVzZSA9ICcnO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIGNsYXVzZSA9IGdldFN0cmluZ0NvbGxlY3Rpb25DbGF1c2UobGFtYmRhUGFyYW1ldGVyLCB2YWx1ZSwgb3AsIHByb3BOYW1lKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAvLyBub3JtYWxpemUge2FueTpbe3Byb3AxOiAxfSwge3Byb3AyOiAxfV19IC0tPiB7YW55Ontwcm9wMTogMSwgcHJvcDI6IDF9fTsgc2FtZSBmb3IgJ2FsbCcsXG4gICAgICAvLyBzaW1wbGUgdmFsdWVzIGNvbGxlY3Rpb246IHthbnk6W3snJzogJ3NpbXBsZVZhbDEnfSwgeycnOiAnc2ltcGxlVmFsMid9XX0gLS0+IHthbnk6eycnOiBbJ3NpbXBsZVZhbDEnLCAnc2ltcGxlVmFsMiddfX07IHNhbWUgZm9yICdhbGwnLFxuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICA/IHZhbHVlLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5oYXNPd25Qcm9wZXJ0eShJVEVNX1JPT1QpKSB7XG4gICAgICAgICAgICAgIGlmICghYWNjLmhhc093blByb3BlcnR5KElURU1fUk9PVCkpIHtcbiAgICAgICAgICAgICAgICBhY2NbSVRFTV9ST09UXSA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFjY1tJVEVNX1JPT1RdLnB1c2goaXRlbVtJVEVNX1JPT1RdKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4uaXRlbSB9O1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICA6IHZhbHVlO1xuXG4gICAgICBjb25zdCBmaWx0ZXIgPSBidWlsZEZpbHRlckNvcmUoZmlsdGVyVmFsdWUsIHtcbiAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgcHJvcFByZWZpeDogbGFtYmRhUGFyYW1ldGVyLFxuICAgICAgICBlc2NhcGUsXG4gICAgICB9KTtcbiAgICAgIGNsYXVzZSA9IGAke3Byb3BOYW1lfS8ke29wfSgke1xuICAgICAgICBmaWx0ZXIgPyBgJHtsYW1iZGFQYXJhbWV0ZXJ9OiR7ZmlsdGVyfWAgOiAnJ1xuICAgICAgfSlgO1xuICAgIH1cbiAgICByZXR1cm4gY2xhdXNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0cmluZ0NvbGxlY3Rpb25DbGF1c2UoXG4gIGxhbWJkYVBhcmFtZXRlcjogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBjb2xsZWN0aW9uT3BlcmF0b3I6IHN0cmluZyxcbiAgcHJvcE5hbWU6IHN0cmluZ1xuKSB7XG4gIGxldCBjbGF1c2UgPSAnJztcbiAgY29uc3QgY29uZGl0aW9uT3BlcmF0b3IgPSBjb2xsZWN0aW9uT3BlcmF0b3IgPT0gJ2FsbCcgPyAnbmUnIDogJ2VxJztcbiAgY2xhdXNlID0gYCR7cHJvcE5hbWV9LyR7Y29sbGVjdGlvbk9wZXJhdG9yfSgke2xhbWJkYVBhcmFtZXRlcn06ICR7bGFtYmRhUGFyYW1ldGVyfSAke2NvbmRpdGlvbk9wZXJhdG9yfSAnJHt2YWx1ZX0nKWA7XG5cbiAgcmV0dXJuIGNsYXVzZTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlSWxsZWdhbENoYXJzKHN0cmluZzogc3RyaW5nKSB7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8lL2csICclMjUnKTtcbiAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAnJTJCJyk7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXC8vZywgJyUyRicpO1xuICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFw/L2csICclM0YnKTtcbiAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLyMvZywgJyUyMycpO1xuICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvJi9nLCAnJTI2Jyk7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8nL2csIFwiJydcIik7XG4gIHJldHVybiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZShcbiAgdmFsdWU6IFZhbHVlLFxuICB7IGFsaWFzZXMsIGVzY2FwZSA9IGZhbHNlIH06IHsgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdOyBlc2NhcGU/OiBib29sZWFuIH1cbik6IGFueSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVzY2FwZSA/IGAnJHtlc2NhcGVJbGxlZ2FsQ2hhcnModmFsdWUpfSdgIDogYCcke3ZhbHVlfSdgO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gYFske3ZhbHVlXG4gICAgICAubWFwKChkKSA9PiBub3JtYWxpemVWYWx1ZShkLCB7IGFsaWFzZXMsIGVzY2FwZSB9KSlcbiAgICAgIC5qb2luKCcsJyl9XWA7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodmFsdWUudHlwZSkge1xuICAgICAgY2FzZSBRdWVyeUN1c3RvbVR5cGVzLlJhdzpcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgICAgY2FzZSBRdWVyeUN1c3RvbVR5cGVzLkR1cmF0aW9uOlxuICAgICAgICByZXR1cm4gYGR1cmF0aW9uJyR7dmFsdWUudmFsdWV9J2A7XG4gICAgICBjYXNlIFF1ZXJ5Q3VzdG9tVHlwZXMuQmluYXJ5OlxuICAgICAgICByZXR1cm4gYGJpbmFyeScke3ZhbHVlLnZhbHVlfSdgO1xuICAgICAgY2FzZSBRdWVyeUN1c3RvbVR5cGVzLkFsaWFzOlxuICAgICAgICAvLyBTdG9yZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbGlhc2VzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZS5uYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlLm5hbWUgPSBgYSR7YWxpYXNlcy5sZW5ndGggKyAxfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFsaWFzZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBAJHt2YWx1ZS5uYW1lfWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUpXG4gICAgICAgICAgLmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgKFtrLCB2XSkgPT5cbiAgICAgICAgICAgICAgYCR7a309JHtub3JtYWxpemVWYWx1ZSh2IGFzIFZhbHVlLCB7IGFsaWFzZXMsIGVzY2FwZSB9KX1gXG4gICAgICAgICAgKVxuICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFeHBhbmQ8VD4oXG4gIGV4cGFuZHM6IEV4cGFuZDxUPixcbiAgeyBhbGlhc2VzLCBlc2NhcGUgPSBmYWxzZSB9OiB7IGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTsgZXNjYXBlPzogYm9vbGVhbiB9XG4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGV4cGFuZHMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGV4cGFuZHMgYXMgYW55O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBhbmRzID09PSAnc3RyaW5nJykge1xuICAgIGlmIChleHBhbmRzLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBleHBhbmRzO1xuICAgIH1cblxuICAgIC8vIENoYW5nZSBgRm9vL0Jhci9CYXpgIHRvIGBGb28oJGV4cGFuZD1CYXIoJGV4cGFuZD1CYXopKWBcbiAgICByZXR1cm4gZXhwYW5kc1xuICAgICAgLnNwbGl0KCcvJylcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5yZWR1Y2UoKHJlc3VsdHMsIGl0ZW0sIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gSW5uZXItbW9zdCBpdGVtXG4gICAgICAgICAgcmV0dXJuIGAkZXhwYW5kPSR7aXRlbX1gO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBhcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIE91dGVyLW1vc3QgaXRlbSwgZG9uJ3QgYWRkIGAkZXhwYW5kPWAgcHJlZml4IChhZGRlZCBhYm92ZSlcbiAgICAgICAgICByZXR1cm4gYCR7aXRlbX0oJHtyZXN1bHRzfSlgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyIGl0ZW1zXG4gICAgICAgICAgcmV0dXJuIGAkZXhwYW5kPSR7aXRlbX0oJHtyZXN1bHRzfSlgO1xuICAgICAgICB9XG4gICAgICB9LCAnJyk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleHBhbmRzKSkge1xuICAgIHJldHVybiBgJHsoZXhwYW5kcyBhcyBBcnJheTxOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4+KVxuICAgICAgLm1hcCgoZSkgPT4gYnVpbGRFeHBhbmQoZSwgeyBhbGlhc2VzLCBlc2NhcGUgfSkpXG4gICAgICAuam9pbignLCcpfWA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cGFuZHMgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXhwYW5kS2V5cyA9IE9iamVjdC5rZXlzKGV4cGFuZHMpO1xuXG4gICAgaWYgKFxuICAgICAgZXhwYW5kS2V5cy5zb21lKFxuICAgICAgICAoa2V5KSA9PiBTVVBQT1JURURfRVhQQU5EX1BST1BFUlRJRVMuaW5kZXhPZihrZXkudG9Mb3dlckNhc2UoKSkgIT09IC0xXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZXhwYW5kS2V5c1xuICAgICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgICAgICAgIHZhbHVlID0gYnVpbGRGaWx0ZXIoKGV4cGFuZHMgYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+KVtrZXldLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29yZGVyQnknOlxuICAgICAgICAgICAgICB2YWx1ZSA9IGJ1aWxkT3JkZXJCeShcbiAgICAgICAgICAgICAgICAoZXhwYW5kcyBhcyBOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4pW2tleV0gYXMgT3JkZXJCeTxUPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2xldmVscyc6XG4gICAgICAgICAgICBjYXNlICdjb3VudCc6XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICB2YWx1ZSA9IGAkeyhleHBhbmRzIGFzIE5lc3RlZEV4cGFuZE9wdGlvbnM8YW55Pilba2V5XX1gO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHZhbHVlID0gYnVpbGRFeHBhbmQoXG4gICAgICAgICAgICAgICAgKGV4cGFuZHMgYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+KVtrZXldIGFzIEV4cGFuZDxUPixcbiAgICAgICAgICAgICAgICB7IGFsaWFzZXMsIGVzY2FwZSB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBgJCR7a2V5LnRvTG93ZXJDYXNlKCl9PSR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJzsnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGV4cGFuZEtleXNcbiAgICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbHRFeHBhbmQgPSBidWlsZEV4cGFuZChcbiAgICAgICAgICAgIChleHBhbmRzIGFzIE5lc3RlZEV4cGFuZE9wdGlvbnM8YW55PilbXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgXSBhcyBOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4sXG4gICAgICAgICAgICB7IGFsaWFzZXMsIGVzY2FwZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gYnVpbHRFeHBhbmQgPyBgJHtrZXl9KCR7YnVpbHRFeHBhbmR9KWAgOiBrZXk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gYnVpbGRUcmFuc2Zvcm1zPFQ+KFxuICB0cmFuc2Zvcm1zOiBUcmFuc2Zvcm08VD4gfCBUcmFuc2Zvcm08VD5bXSxcbiAgeyBhbGlhc2VzLCBlc2NhcGUgPSBmYWxzZSB9OiB7IGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTsgZXNjYXBlPzogYm9vbGVhbiB9XG4pIHtcbiAgLy8gV3JhcCBzaW5nbGUgb2JqZWN0IGFuIGFycmF5IGZvciBzaW1wbGlmaWVkIHByb2Nlc3NpbmdcbiAgY29uc3QgdHJhbnNmb3Jtc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1zKSA/IHRyYW5zZm9ybXMgOiBbdHJhbnNmb3Jtc107XG5cbiAgY29uc3QgdHJhbnNmb3Jtc1Jlc3VsdCA9IHRyYW5zZm9ybXNBcnJheS5yZWR1Y2UoXG4gICAgKHJlc3VsdDogc3RyaW5nW10sIHRyYW5zZm9ybSkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2dyZWdhdGUsIGZpbHRlciwgZ3JvdXBCeSwgLi4ucmVzdCB9ID0gdHJhbnNmb3JtO1xuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IGFzIG1hbnkgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgIC8vICAgdG9wY291bnQsIHRvcHN1bSwgdG9wcGVyY2VudCxcbiAgICAgIC8vICAgYm90dG9tc3VtLCBib3R0b21jb3VudCwgYm90dG9tcGVyY2VudCxcbiAgICAgIC8vICAgaWRlbnRpdHksIGNvbmNhdCwgZXhwYW5kLCBzZWFyY2gsIGNvbXB1dGUsIGlzZGVmaW5lZFxuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRLZXlzID0gT2JqZWN0LmtleXMocmVzdCk7XG4gICAgICBpZiAodW5zdXBwb3J0ZWRLZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHRyYW5zZm9ybShzKTogJHt1bnN1cHBvcnRlZEtleXN9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZ2dyZWdhdGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYGFnZ3JlZ2F0ZSgke2J1aWxkQWdncmVnYXRlKGFnZ3JlZ2F0ZSl9KWApO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBjb25zdCBidWlsdEZpbHRlciA9IGJ1aWxkRmlsdGVyKGZpbHRlciwgeyBhbGlhc2VzLCBlc2NhcGUgfSk7XG4gICAgICAgIGlmIChidWlsdEZpbHRlcikge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgYGZpbHRlcigke2J1aWxkRmlsdGVyKGJ1aWx0RmlsdGVyLCB7IGFsaWFzZXMsIGVzY2FwZSB9KX0pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGBncm91cGJ5KCR7YnVpbGRHcm91cEJ5KGdyb3VwQnksIHsgYWxpYXNlcywgZXNjYXBlIH0pfSlgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgcmV0dXJuIHRyYW5zZm9ybXNSZXN1bHQuam9pbignLycpIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBZ2dyZWdhdGUoYWdncmVnYXRlOiBBZ2dyZWdhdGUgfCBBZ2dyZWdhdGVbXSkge1xuICAvLyBXcmFwIHNpbmdsZSBvYmplY3QgaW4gYW4gYXJyYXkgZm9yIHNpbXBsaWZpZWQgcHJvY2Vzc2luZ1xuICBjb25zdCBhZ2dyZWdhdGVBcnJheSA9IEFycmF5LmlzQXJyYXkoYWdncmVnYXRlKSA/IGFnZ3JlZ2F0ZSA6IFthZ2dyZWdhdGVdO1xuXG4gIHJldHVybiBhZ2dyZWdhdGVBcnJheVxuICAgIC5tYXAoKGFnZ3JlZ2F0ZUl0ZW0pID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgYWdncmVnYXRlSXRlbSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBhZ2dyZWdhdGVJdGVtXG4gICAgICAgIDogT2JqZWN0LmtleXMoYWdncmVnYXRlSXRlbSkubWFwKChhZ2dyZWdhdGVLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVZhbHVlID0gYWdncmVnYXRlSXRlbVthZ2dyZWdhdGVLZXldO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBBcmUgdGhlc2UgYWx3YXlzIHJlcXVpcmVkPyAgQ2FuL3Nob3VsZCB3ZSBkZWZhdWx0IHRoZW0gaWYgc28/XG4gICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlLndpdGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnd2l0aCcgcHJvcGVydHkgcmVxdWlyZWQgZm9yICcke2FnZ3JlZ2F0ZUtleX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlLmFzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJ2FzJyBwcm9wZXJ0eSByZXF1aXJlZCBmb3IgJyR7YWdncmVnYXRlS2V5fSdgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGAke2FnZ3JlZ2F0ZUtleX0gd2l0aCAke2FnZ3JlZ2F0ZVZhbHVlLndpdGh9IGFzICR7YWdncmVnYXRlVmFsdWUuYXN9YDtcbiAgICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5qb2luKCcsJyk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkR3JvdXBCeTxUPihcbiAgZ3JvdXBCeTogR3JvdXBCeTxUPixcbiAgeyBhbGlhc2VzLCBlc2NhcGUgPSBmYWxzZSB9OiB7IGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTsgZXNjYXBlPzogYm9vbGVhbiB9XG4pIHtcbiAgaWYgKCFncm91cEJ5LnByb3BlcnRpZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCdwcm9wZXJ0aWVzJyBwcm9wZXJ0eSByZXF1aXJlZCBmb3IgZ3JvdXBCeWApO1xuICB9XG5cbiAgbGV0IHJlc3VsdCA9IGAoJHtncm91cEJ5LnByb3BlcnRpZXMuam9pbignLCcpfSlgO1xuXG4gIGlmIChncm91cEJ5LnRyYW5zZm9ybSkge1xuICAgIHJlc3VsdCArPSBgLCR7YnVpbGRUcmFuc2Zvcm1zKGdyb3VwQnkudHJhbnNmb3JtLCB7IGFsaWFzZXMsIGVzY2FwZSB9KX1gO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYnVpbGRPcmRlckJ5PFQ+KG9yZGVyQnk6IE9yZGVyQnk8VD4sIHByZWZpeDogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICBpZiAoQXJyYXkuaXNBcnJheShvcmRlckJ5KSkge1xuICAgIHJldHVybiAob3JkZXJCeSBhcyBPcmRlckJ5T2JqZWN0PFQ+W10pXG4gICAgICAubWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoID09PSAyICYmXG4gICAgICAgIFsnYXNjJywgJ2Rlc2MnXS5pbmRleE9mKHZhbHVlWzFdKSAhPT0gLTFcbiAgICAgICAgICA/IHZhbHVlLmpvaW4oJyAnKVxuICAgICAgICAgIDogdmFsdWVcbiAgICAgIClcbiAgICAgIC5tYXAoKHYpID0+IGAke3ByZWZpeH0ke3Z9YClcbiAgICAgIC5qb2luKCcsJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9yZGVyQnkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9yZGVyQnkpXG4gICAgICAubWFwKChbaywgdl0pID0+IGJ1aWxkT3JkZXJCeSh2IGFzIE9yZGVyQnk8YW55PiwgYCR7a30vYCkpXG4gICAgICAubWFwKCh2KSA9PiBgJHtwcmVmaXh9JHt2fWApXG4gICAgICAuam9pbignLCcpO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9JHtvcmRlckJ5fWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVXJsKHBhdGg6IHN0cmluZywgcGFyYW1zOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSk6IHN0cmluZyB7XG4gIC8vIFRoaXMgY2FuIGJlIHJlZmFjdG9yZWQgdXNpbmcgVVJMIEFQSS4gQnV0IElFIGRvZXMgbm90IHN1cHBvcnQgaXQuXG4gIGNvbnN0IHF1ZXJpZXM6IHN0cmluZ1tdID0gT2JqZWN0LmVudHJpZXMocGFyYW1zKS5tYXAoXG4gICAgKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWBcbiAgKTtcbiAgcmV0dXJuIHF1ZXJpZXMubGVuZ3RoID8gYCR7cGF0aH0/JHtxdWVyaWVzLmpvaW4oJyYnKX1gIDogcGF0aDtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb3QoYnVpbHRGaWx0ZXJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgbm90KCR7YnVpbHRGaWx0ZXJzLmpvaW4oJyBhbmQgJyl9KWA7XG59XG4iXX0=
|