breeze-client 2.2.2 → 3.0.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/LICENSE +1 -1
- package/README.md +83 -63
- package/adapters/abstract-data-service-adapter.d.ts +120 -0
- package/adapters/abstract-data-service-adapter.js +395 -0
- package/adapters/abstract-data-service-adapter.js.map +1 -0
- package/adapters/adapter-ajax-fetch.d.ts +12 -0
- package/adapters/adapter-ajax-fetch.js +13 -0
- package/adapters/adapter-ajax-fetch.js.map +1 -0
- package/{adapter-ajax-post → adapters}/adapter-ajax-post.d.ts +40 -36
- package/{fesm2022/breeze-client-adapter-ajax-post.mjs → adapters/adapter-ajax-post.js} +80 -82
- package/adapters/adapter-ajax-post.js.map +1 -0
- package/{adapter-ajax-fetch → adapters}/adapter-core.d.ts +4 -4
- package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → adapters/adapter-core.js} +48 -91
- package/adapters/adapter-core.js.map +1 -0
- package/adapters/adapter-data-service-webapi.d.ts +9 -0
- package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → adapters/adapter-data-service-webapi.js} +105 -107
- package/adapters/adapter-data-service-webapi.js.map +1 -0
- package/adapters/adapter-model-library-backing-store.d.ts +32 -0
- package/adapters/adapter-model-library-backing-store.js +321 -0
- package/adapters/adapter-model-library-backing-store.js.map +1 -0
- package/adapters/adapter-uri-builder-json.d.ts +11 -0
- package/adapters/adapter-uri-builder-json.js +40 -0
- package/adapters/adapter-uri-builder-json.js.map +1 -0
- package/adapters/http.d.ts +52 -0
- package/adapters/http.js +202 -0
- package/adapters/http.js.map +1 -0
- package/angular/adapter-angular-httpclient.d.ts +21 -0
- package/angular/adapter-angular-httpclient.js +70 -0
- package/angular/adapter-angular-httpclient.js.map +1 -0
- package/breeze.d.ts +215 -0
- package/breeze.js +141 -0
- package/breeze.js.map +1 -0
- package/config/config.d.ts +212 -0
- package/config/config.js +392 -0
- package/config/config.js.map +1 -0
- package/config/configure.d.ts +66 -0
- package/config/configure.js +46 -0
- package/config/configure.js.map +1 -0
- package/config/default-adapters.d.ts +1 -0
- package/config/default-adapters.js +40 -0
- package/config/default-adapters.js.map +1 -0
- package/config/interface-registry.d.ts +191 -0
- package/config/interface-registry.js +5 -0
- package/config/interface-registry.js.map +1 -0
- package/{src → core}/assert-param.d.ts +52 -60
- package/core/assert-param.js +390 -0
- package/core/assert-param.js.map +1 -0
- package/core/core.d.ts +285 -0
- package/core/core.js +772 -0
- package/core/core.js.map +1 -0
- package/core/enum.d.ts +116 -0
- package/core/enum.js +167 -0
- package/core/enum.js.map +1 -0
- package/core/event.d.ts +169 -0
- package/core/event.js +338 -0
- package/core/event.js.map +1 -0
- package/entity/array.d.ts +3 -0
- package/entity/array.js +4 -0
- package/entity/array.js.map +1 -0
- package/entity/complex-array.d.ts +17 -0
- package/entity/complex-array.js +104 -0
- package/entity/complex-array.js.map +1 -0
- package/entity/default-property-interceptor.d.ts +1 -0
- package/entity/default-property-interceptor.js +496 -0
- package/entity/default-property-interceptor.js.map +1 -0
- package/{src → entity}/entity-action.d.ts +36 -42
- package/entity/entity-action.js +45 -0
- package/entity/entity-action.js.map +1 -0
- package/entity/entity-aspect.d.ts +457 -0
- package/entity/entity-aspect.js +1262 -0
- package/entity/entity-aspect.js.map +1 -0
- package/entity/entity-base.d.ts +55 -0
- package/entity/entity-base.js +41 -0
- package/entity/entity-base.js.map +1 -0
- package/entity/entity-group.d.ts +1 -0
- package/entity/entity-group.js +224 -0
- package/entity/entity-group.js.map +1 -0
- package/entity/entity-key.d.ts +95 -0
- package/entity/entity-key.js +189 -0
- package/entity/entity-key.js.map +1 -0
- package/{src → entity}/entity-state.d.ts +112 -84
- package/entity/entity-state.js +135 -0
- package/entity/entity-state.js.map +1 -0
- package/entity/key-generator.d.ts +57 -0
- package/entity/key-generator.js +155 -0
- package/entity/key-generator.js.map +1 -0
- package/entity/observable-array.d.ts +25 -0
- package/entity/observable-array.js +230 -0
- package/entity/observable-array.js.map +1 -0
- package/entity/primitive-array.d.ts +12 -0
- package/entity/primitive-array.js +71 -0
- package/entity/primitive-array.js.map +1 -0
- package/entity/relation-array.d.ts +24 -0
- package/entity/relation-array.js +176 -0
- package/entity/relation-array.js.map +1 -0
- package/entity/unattached-children-map.d.ts +1 -0
- package/entity/unattached-children-map.js +105 -0
- package/entity/unattached-children-map.js.map +1 -0
- package/generate-entity-classes.js +1176 -0
- package/manager/entity-manager.d.ts +801 -0
- package/manager/entity-manager.js +2395 -0
- package/manager/entity-manager.js.map +1 -0
- package/{src → manager}/save-options.d.ts +48 -42
- package/manager/save-options.js +51 -0
- package/manager/save-options.js.map +1 -0
- package/{src → metadata}/data-service.d.ts +229 -184
- package/metadata/data-service.js +246 -0
- package/metadata/data-service.js.map +1 -0
- package/metadata/data-type.d.ts +122 -0
- package/metadata/data-type.js +465 -0
- package/metadata/data-type.js.map +1 -0
- package/metadata/entity-metadata.d.ts +1193 -0
- package/metadata/entity-metadata.js +2502 -0
- package/metadata/entity-metadata.js.map +1 -0
- package/{src → metadata}/local-query-comparison-options.d.ts +65 -59
- package/metadata/local-query-comparison-options.js +69 -0
- package/metadata/local-query-comparison-options.js.map +1 -0
- package/{src → metadata}/naming-convention.d.ts +75 -72
- package/metadata/naming-convention.js +97 -0
- package/metadata/naming-convention.js.map +1 -0
- package/mixins/mixin-get-entity-graph.d.ts +63 -0
- package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → mixins/mixin-get-entity-graph.js} +331 -253
- package/mixins/mixin-get-entity-graph.js.map +1 -0
- package/mixins/mixin-save-queuing.d.ts +98 -0
- package/{fesm2022/breeze-client-mixin-save-queuing.mjs → mixins/mixin-save-queuing.js} +493 -365
- package/mixins/mixin-save-queuing.js.map +1 -0
- package/package.json +63 -94
- package/query/entity-query.d.ts +521 -0
- package/query/entity-query.js +1149 -0
- package/query/entity-query.js.map +1 -0
- package/{src → query}/mapping-context.d.ts +44 -46
- package/query/mapping-context.js +412 -0
- package/query/mapping-context.js.map +1 -0
- package/query/predicate.d.ts +394 -0
- package/query/predicate.js +1294 -0
- package/query/predicate.js.map +1 -0
- package/query/property-path.d.ts +252 -0
- package/query/property-path.js +2 -0
- package/query/property-path.js.map +1 -0
- package/{src → query}/query-options.d.ts +143 -119
- package/query/query-options.js +180 -0
- package/query/query-options.js.map +1 -0
- package/rxjs/breeze-rxjs.d.ts +72 -0
- package/rxjs/breeze-rxjs.js +117 -0
- package/rxjs/breeze-rxjs.js.map +1 -0
- package/validation/validate.d.ts +583 -0
- package/validation/validate.js +961 -0
- package/validation/validate.js.map +1 -0
- package/{src → validation}/validation-options.d.ts +67 -63
- package/validation/validation-options.js +70 -0
- package/validation/validation-options.js.map +1 -0
- package/adapter-ajax-angularjs/adapter-ajax-angularjs.d.ts +0 -17
- package/adapter-ajax-angularjs/adapter-core.d.ts +0 -4
- package/adapter-ajax-angularjs/index.d.ts +0 -5
- package/adapter-ajax-fetch/adapter-ajax-fetch.d.ts +0 -18
- package/adapter-ajax-fetch/index.d.ts +0 -5
- package/adapter-ajax-httpclient/adapter-ajax-httpclient.d.ts +0 -13
- package/adapter-ajax-httpclient/adapter-core.d.ts +0 -4
- package/adapter-ajax-httpclient/index.d.ts +0 -5
- package/adapter-ajax-jquery/adapter-ajax-jquery.d.ts +0 -15
- package/adapter-ajax-jquery/index.d.ts +0 -5
- package/adapter-ajax-post/index.d.ts +0 -5
- package/adapter-data-service-odata/adapter-core.d.ts +0 -4
- package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -17
- package/adapter-data-service-odata/index.d.ts +0 -5
- package/adapter-data-service-webapi/adapter-data-service-webapi.d.ts +0 -15
- package/adapter-data-service-webapi/index.d.ts +0 -5
- package/adapter-model-library-backing-store/adapter-model-library-backing-store.d.ts +0 -10
- package/adapter-model-library-backing-store/index.d.ts +0 -5
- package/adapter-model-library-ko/adapter-model-library-ko.d.ts +0 -10
- package/adapter-model-library-ko/index.d.ts +0 -5
- package/adapter-uri-builder-json/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-json/adapter-uri-builder-json.d.ts +0 -8
- package/adapter-uri-builder-json/index.d.ts +0 -5
- package/adapter-uri-builder-odata/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-odata/adapter-uri-builder-odata.d.ts +0 -8
- package/adapter-uri-builder-odata/index.d.ts +0 -5
- package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
- package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
- package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
- package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
- package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
- package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
- package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
- package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
- package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
- package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
- package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -461
- package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
- package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
- package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
- package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
- package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
- package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
- package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
- package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
- package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
- package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
- package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
- package/esm2022/breeze-client.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
- package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
- package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
- package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
- package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
- package/esm2022/src/array.mjs +0 -4
- package/esm2022/src/assert-param.mjs +0 -330
- package/esm2022/src/breeze.mjs +0 -85
- package/esm2022/src/complex-array.mjs +0 -117
- package/esm2022/src/config.mjs +0 -232
- package/esm2022/src/core.mjs +0 -712
- package/esm2022/src/csdl-metadata-parser.mjs +0 -385
- package/esm2022/src/data-service.mjs +0 -221
- package/esm2022/src/data-type.mjs +0 -510
- package/esm2022/src/default-property-interceptor.mjs +0 -460
- package/esm2022/src/entity-action.mjs +0 -45
- package/esm2022/src/entity-aspect.mjs +0 -897
- package/esm2022/src/entity-group.mjs +0 -192
- package/esm2022/src/entity-key.mjs +0 -125
- package/esm2022/src/entity-manager.mjs +0 -2163
- package/esm2022/src/entity-metadata.mjs +0 -2242
- package/esm2022/src/entity-query.mjs +0 -1024
- package/esm2022/src/entity-state.mjs +0 -107
- package/esm2022/src/enum.mjs +0 -143
- package/esm2022/src/event.mjs +0 -264
- package/esm2022/src/interface-registry.mjs +0 -39
- package/esm2022/src/key-generator.mjs +0 -110
- package/esm2022/src/local-query-comparison-options.mjs +0 -65
- package/esm2022/src/mapping-context.mjs +0 -411
- package/esm2022/src/naming-convention.mjs +0 -92
- package/esm2022/src/observable-array.mjs +0 -183
- package/esm2022/src/predicate.mjs +0 -1259
- package/esm2022/src/primitive-array.mjs +0 -85
- package/esm2022/src/query-options.mjs +0 -152
- package/esm2022/src/relation-array.mjs +0 -173
- package/esm2022/src/save-options.mjs +0 -41
- package/esm2022/src/unattached-children-map.mjs +0 -56
- package/esm2022/src/validate.mjs +0 -995
- package/esm2022/src/validation-options.mjs +0 -64
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs +0 -194
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs +0 -114
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs +0 -516
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs +0 -276
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs +0 -248
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs +0 -246
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
- package/fesm2022/breeze-client.mjs +0 -14144
- package/fesm2022/breeze-client.mjs.map +0 -1
- package/index.d.ts +0 -1
- package/mixin-get-entity-graph/index.d.ts +0 -5
- package/mixin-get-entity-graph/mixin-get-entity-graph.d.ts +0 -31
- package/mixin-save-queuing/index.d.ts +0 -5
- package/mixin-save-queuing/mixin-save-queuing.d.ts +0 -32
- package/src/abstract-data-service-adapter.d.ts +0 -84
- package/src/array.d.ts +0 -3
- package/src/breeze.d.ts +0 -139
- package/src/complex-array.d.ts +0 -13
- package/src/config.d.ts +0 -104
- package/src/core.d.ts +0 -164
- package/src/csdl-metadata-parser.d.ts +0 -7
- package/src/data-type.d.ts +0 -89
- package/src/default-property-interceptor.d.ts +0 -4
- package/src/entity-aspect.d.ts +0 -332
- package/src/entity-group.d.ts +0 -28
- package/src/entity-key.d.ts +0 -77
- package/src/entity-manager.d.ts +0 -680
- package/src/entity-metadata.d.ts +0 -988
- package/src/entity-query.d.ts +0 -444
- package/src/enum.d.ts +0 -100
- package/src/event.d.ts +0 -142
- package/src/interface-registry.d.ts +0 -150
- package/src/key-generator.d.ts +0 -12
- package/src/observable-array.d.ts +0 -52
- package/src/predicate.d.ts +0 -376
- package/src/primitive-array.d.ts +0 -7
- package/src/relation-array.d.ts +0 -18
- package/src/unattached-children-map.d.ts +0 -19
- package/src/validate.d.ts +0 -650
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import { assertConfig } from './assert-param';
|
|
2
|
-
import { config } from './config';
|
|
3
|
-
import { core } from './core';
|
|
4
|
-
/**
|
|
5
|
-
A DataService instance is used to encapsulate the details of a single 'service'; this includes a serviceName, a dataService adapterInstance,
|
|
6
|
-
and whether the service has server side metadata.
|
|
7
|
-
|
|
8
|
-
You can construct an EntityManager with either a serviceName or a DataService instance, if you use a serviceName then a DataService
|
|
9
|
-
is constructed for you. (It can also be set via the EntityManager.setProperties method).
|
|
10
|
-
|
|
11
|
-
The same applies to the MetadataStore.fetchMetadata method, i.e. it takes either a serviceName or a DataService instance.
|
|
12
|
-
|
|
13
|
-
Each metadataStore contains a list of DataServices, each accessible via its ‘serviceName’.
|
|
14
|
-
( see MetadataStore.getDataService and MetadataStore.addDataService). The ‘addDataService’ method is called internally
|
|
15
|
-
anytime a MetadataStore.fetchMetadata call occurs with a new dataService ( or service name).
|
|
16
|
-
|
|
17
|
-
**/
|
|
18
|
-
export class DataService {
|
|
19
|
-
/** DataService constructor
|
|
20
|
-
> var dataService = new DataService({
|
|
21
|
-
> serviceName: altServiceName,
|
|
22
|
-
> hasServerMetadata: false
|
|
23
|
-
> });
|
|
24
|
-
|
|
25
|
-
> var metadataStore = new MetadataStore({
|
|
26
|
-
> namingConvention: NamingConvention.camelCase
|
|
27
|
-
> });
|
|
28
|
-
|
|
29
|
-
> return new EntityManager({
|
|
30
|
-
> dataService: dataService,
|
|
31
|
-
> metadataStore: metadataStore
|
|
32
|
-
> });
|
|
33
|
-
@param config - A configuration object.
|
|
34
|
-
**/
|
|
35
|
-
constructor(config) {
|
|
36
|
-
updateWithConfig(this, config);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
Returns a copy of this DataService with the specified properties applied.
|
|
40
|
-
@param config - The configuration object to apply to create a new DataService.
|
|
41
|
-
**/
|
|
42
|
-
using(config) {
|
|
43
|
-
if (!config)
|
|
44
|
-
return this;
|
|
45
|
-
let result = new DataService(this);
|
|
46
|
-
return updateWithConfig(result, config);
|
|
47
|
-
}
|
|
48
|
-
static resolve(dataServices) {
|
|
49
|
-
// final defaults
|
|
50
|
-
// Deliberate use of 'as any' below.
|
|
51
|
-
dataServices.push({
|
|
52
|
-
hasServerMetadata: true,
|
|
53
|
-
useJsonp: false
|
|
54
|
-
});
|
|
55
|
-
let ds = new DataService(core.resolveProperties(dataServices, ["serviceName", "adapterName", "uriBuilderName", "hasServerMetadata", "jsonResultsAdapter", "useJsonp"]));
|
|
56
|
-
if (!ds.serviceName) {
|
|
57
|
-
throw new Error("Unable to resolve a 'serviceName' for this dataService");
|
|
58
|
-
}
|
|
59
|
-
ds.adapterInstance = ds.adapterInstance || config.getAdapterInstance("dataService", ds.adapterName);
|
|
60
|
-
ds.jsonResultsAdapter = ds.jsonResultsAdapter || ds.adapterInstance.jsonResultsAdapter;
|
|
61
|
-
ds.uriBuilder = ds.uriBuilder || config.getAdapterInstance("uriBuilder", ds.uriBuilderName);
|
|
62
|
-
return ds;
|
|
63
|
-
}
|
|
64
|
-
/** @hidden @internal */
|
|
65
|
-
static _normalizeServiceName(serviceName) {
|
|
66
|
-
serviceName = serviceName.trim();
|
|
67
|
-
if (serviceName.substr(-1) !== "/") {
|
|
68
|
-
return serviceName + '/';
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
return serviceName;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/** */
|
|
75
|
-
toJSON() {
|
|
76
|
-
// don't use default value here - because we want to be able to distinguish undefined props for inheritence purposes.
|
|
77
|
-
return core.toJson(this, {
|
|
78
|
-
serviceName: null,
|
|
79
|
-
adapterName: null,
|
|
80
|
-
uriBuilderName: null,
|
|
81
|
-
hasServerMetadata: null,
|
|
82
|
-
jsonResultsAdapter: function (v) {
|
|
83
|
-
return v && v.name;
|
|
84
|
-
},
|
|
85
|
-
useJsonp: null
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
static fromJSON(json) {
|
|
89
|
-
json.jsonResultsAdapter = config._fetchObject(JsonResultsAdapter, json.jsonResultsAdapter);
|
|
90
|
-
return new DataService(json);
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
Returns a url for this dataService with the specified suffix. This method handles dataService names either
|
|
94
|
-
with or without trailing '/'s. If the suffix starts with "http" then it will be returned as-is.
|
|
95
|
-
@method qualifyUrl
|
|
96
|
-
@param suffix {String} The resulting url.
|
|
97
|
-
@return {a Url string}
|
|
98
|
-
**/
|
|
99
|
-
qualifyUrl(suffix) {
|
|
100
|
-
if (suffix && suffix.startsWith("http")) {
|
|
101
|
-
return suffix;
|
|
102
|
-
}
|
|
103
|
-
let url = this.serviceName;
|
|
104
|
-
// remove any trailing "/"
|
|
105
|
-
if (core.stringEndsWith(url, "/")) {
|
|
106
|
-
url = url.substr(0, url.length - 1);
|
|
107
|
-
}
|
|
108
|
-
// ensure that it ends with "/" + suffix
|
|
109
|
-
suffix = "/" + suffix;
|
|
110
|
-
if (!core.stringEndsWith(url, suffix)) {
|
|
111
|
-
url = url + suffix;
|
|
112
|
-
}
|
|
113
|
-
return url;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
DataService.prototype._$typeName = "DataService";
|
|
117
|
-
function updateWithConfig(obj, dsConfig) {
|
|
118
|
-
if (dsConfig) {
|
|
119
|
-
assertConfig(dsConfig)
|
|
120
|
-
.whereParam("serviceName").isOptional()
|
|
121
|
-
.whereParam("adapterName").isString().isOptional()
|
|
122
|
-
.whereParam("uriBuilderName").isString().isOptional()
|
|
123
|
-
.whereParam("hasServerMetadata").isBoolean().isOptional()
|
|
124
|
-
.whereParam("jsonResultsAdapter").isInstanceOf(JsonResultsAdapter).isOptional()
|
|
125
|
-
.whereParam("useJsonp").isBoolean().isOptional()
|
|
126
|
-
.applyAll(obj);
|
|
127
|
-
obj.serviceName = obj.serviceName && DataService._normalizeServiceName(obj.serviceName);
|
|
128
|
-
obj.adapterInstance = obj.adapterName ? config.getAdapterInstance("dataService", obj.adapterName) : undefined;
|
|
129
|
-
obj.uriBuilder = obj.uriBuilderName ? config.getAdapterInstance("uriBuilder", obj.uriBuilderName) : undefined;
|
|
130
|
-
}
|
|
131
|
-
return obj;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
A JsonResultsAdapter instance is used to provide custom extraction and parsing logic on the json results returned by any web service.
|
|
135
|
-
This facility makes it possible for breeze to talk to virtually any web service and return objects that will be first class 'breeze' citizens.
|
|
136
|
-
**/
|
|
137
|
-
export class JsonResultsAdapter {
|
|
138
|
-
/** @hidden @internal */
|
|
139
|
-
_$typeName; // actually put on prototype.
|
|
140
|
-
/** The name of this adapter. This name is used to uniquely identify and locate this instance when an 'exported' JsonResultsAdapter is later imported. */
|
|
141
|
-
name;
|
|
142
|
-
/** A Function that is called once per query operation to extract the 'payload' from any json received over the wire.
|
|
143
|
-
This method has a default implementation which simply returns the "results" property from any json returned as a result of executing the query. */
|
|
144
|
-
extractResults; // TODO - refine
|
|
145
|
-
/** A function that is called once per save operation to extract the entities from any json received over the wire. Must return an array.
|
|
146
|
-
This method has a default implementation which simply returns the "entities" property from any json returned as a result of executing the save. */
|
|
147
|
-
extractSaveResults;
|
|
148
|
-
/** A function that is called once per save operation to extract the key mappings from any json received over the wire. Must return an array.
|
|
149
|
-
This method has a default implementation which simply returns the "keyMappings" property from any json returned as a result of executing the save. */
|
|
150
|
-
extractKeyMappings;
|
|
151
|
-
/** A function that is called once per save operation to extract any deleted keys from any json received over the wire. Must return an array.
|
|
152
|
-
This method has a default implementation which is to simply returns the "deletedKeys" property from any json returned as a result of executing the save. */
|
|
153
|
-
extractDeletedKeys; // TODO: refine
|
|
154
|
-
/** A visitor method that will be called on each node of the returned payload. */
|
|
155
|
-
visitNode;
|
|
156
|
-
/**
|
|
157
|
-
JsonResultsAdapter constructor
|
|
158
|
-
|
|
159
|
-
@example
|
|
160
|
-
//
|
|
161
|
-
var jsonResultsAdapter = new JsonResultsAdapter({
|
|
162
|
-
name: "test1e",
|
|
163
|
-
extractResults: function(json) {
|
|
164
|
-
return json.results;
|
|
165
|
-
},
|
|
166
|
-
visitNode: function(node, mappingContext, nodeContext) {
|
|
167
|
-
var entityType = normalizeTypeName(node.$type);
|
|
168
|
-
var propertyName = nodeContext.propertyName;
|
|
169
|
-
var ignore = propertyName && propertyName.substr(0, 1) === "$";
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
entityType: entityType,
|
|
173
|
-
nodeId: node.$id,
|
|
174
|
-
nodeRefId: node.$ref,
|
|
175
|
-
ignore: ignore,
|
|
176
|
-
passThru: false // default
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
var dataService = new DataService( {
|
|
182
|
-
serviceName: "breeze/foo",
|
|
183
|
-
jsonResultsAdapter: jsonResultsAdapter
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
var entityManager = new EntityManager( {
|
|
187
|
-
dataService: dataService
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
@param config - A configuration object.
|
|
191
|
-
|
|
192
|
-
**/
|
|
193
|
-
constructor(jsConfig) {
|
|
194
|
-
if (arguments.length !== 1) {
|
|
195
|
-
throw new Error("The JsonResultsAdapter ctor should be called with a single argument that is a configuration object.");
|
|
196
|
-
}
|
|
197
|
-
assertConfig(jsConfig)
|
|
198
|
-
.whereParam("name").isNonEmptyString()
|
|
199
|
-
.whereParam("extractResults").isFunction().isOptional().withDefault(extractResultsDefault)
|
|
200
|
-
.whereParam("extractSaveResults").isFunction().isOptional().withDefault(extractSaveResultsDefault)
|
|
201
|
-
.whereParam("extractKeyMappings").isFunction().isOptional().withDefault(extractKeyMappingsDefault)
|
|
202
|
-
.whereParam("extractDeletedKeys").isFunction().isOptional().withDefault(extractDeletedKeysDefault)
|
|
203
|
-
.whereParam("visitNode").isFunction()
|
|
204
|
-
.applyAll(this);
|
|
205
|
-
config._storeObject(this, "JsonResultsAdapter", this.name);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
JsonResultsAdapter.prototype._$typeName = "JsonResultsAdapter";
|
|
209
|
-
function extractResultsDefault(data) {
|
|
210
|
-
return data.results;
|
|
211
|
-
}
|
|
212
|
-
function extractSaveResultsDefault(data) {
|
|
213
|
-
return data.entities || data.Entities || [];
|
|
214
|
-
}
|
|
215
|
-
function extractKeyMappingsDefault(data) {
|
|
216
|
-
return data.keyMappings || data.KeyMappings || [];
|
|
217
|
-
}
|
|
218
|
-
function extractDeletedKeysDefault(data) {
|
|
219
|
-
return data.deletedKeys || data.DeletedKeys || [];
|
|
220
|
-
}
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGEtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBaUI5Qjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFvQnRCOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILFlBQVksTUFBMEI7UUFDcEMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFHRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBeUI7UUFDN0IsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6QixJQUFJLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUEyQjtRQUN4QyxpQkFBaUI7UUFDakIsb0NBQW9DO1FBQ25DLFlBQW9CLENBQUMsSUFBSSxDQUFDO1lBQ3pCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFDeEQsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFB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QyxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7QUFDOUMsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsSUFBUztJQUMxQyxPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsSUFBUztJQUMxQyxPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VBZGFwdGVyLCBVcmlCdWlsZGVyQWRhcHRlciB9IGZyb20gJy4vaW50ZXJmYWNlLXJlZ2lzdHJ5JztcclxuaW1wb3J0IHsgS2V5TWFwcGluZyB9IGZyb20gJy4vZW50aXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBNYXBwaW5nQ29udGV4dCB9IGZyb20gJy4vbWFwcGluZy1jb250ZXh0JztcclxuaW1wb3J0IHsgYXNzZXJ0Q29uZmlnIH0gZnJvbSAnLi9hc3NlcnQtcGFyYW0nO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gaW5mbyB0byBiZSBwYXNzZWQgdG8gdGhlIFtbRGF0YVNlcnZpY2VdXSBjb25zdHJ1Y3RvciAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTZXJ2aWNlQ29uZmlnIHtcclxuICAvKiogVGhlIHNlcnZpY2VOYW1lIGZvciB0aGlzIERhdGFTZXJ2aWNlLiAgKiovXHJcbiAgc2VydmljZU5hbWU/OiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBhZGFwdGVyIG5hbWUgZm9yIHRoZSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSB0byBiZSB1c2VkIHdpdGggdGhpcyBzZXJ2aWNlLiAgKiovXHJcbiAgYWRhcHRlck5hbWU/OiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBhZGFwdGVyIG5hbWUgZm9yIHRoZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIHRvIGJlIHVzZWQgd2l0aCB0aGlzIHNlcnZpY2UuICAqKi9cclxuICB1cmlCdWlsZGVyTmFtZT86IHN0cmluZztcclxuICAvKiogV2hldGhlciB0aGUgc2VydmVyIGNhbiBwcm92aWRlIG1ldGFkYXRhIGZvciB0aGlzIHNlcnZpY2UuICAqKi9cclxuICBoYXNTZXJ2ZXJNZXRhZGF0YT86IGJvb2xlYW47XHJcbiAgLyoqIFRoZSBbW0pzb25SZXN1bHRzQWRhcHRlcl1dIHVzZWQgdG8gcHJvY2VzcyB0aGUgcmVzdWx0cyBvZiBhbnkgcXVlcnkgYWdhaW5zdCB0aGlzIERhdGFTZXJ2aWNlLiAgKiovXHJcbiAganNvblJlc3VsdHNBZGFwdGVyPzogSnNvblJlc3VsdHNBZGFwdGVyO1xyXG4gIC8qKiBXaGV0aGVyIHRvIHVzZSBKU09OUCB3aGVuIHBlcmZvcm1pbmcgYSAnR0VUJyByZXF1ZXN0IGFnYWluc3QgdGhpcyBzZXJ2aWNlLiAgKiovXHJcbiAgdXNlSnNvbnA/OiBib29sZWFuO1xyXG59XHJcbi8qKlxyXG5BIERhdGFTZXJ2aWNlIGluc3RhbmNlIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgYSBzaW5nbGUgJ3NlcnZpY2UnOyB0aGlzIGluY2x1ZGVzIGEgc2VydmljZU5hbWUsIGEgZGF0YVNlcnZpY2UgYWRhcHRlckluc3RhbmNlLFxyXG5hbmQgd2hldGhlciB0aGUgc2VydmljZSBoYXMgc2VydmVyIHNpZGUgbWV0YWRhdGEuXHJcblxyXG5Zb3UgY2FuIGNvbnN0cnVjdCBhbiBFbnRpdHlNYW5hZ2VyIHdpdGggZWl0aGVyIGEgc2VydmljZU5hbWUgb3IgYSBEYXRhU2VydmljZSBpbnN0YW5jZSwgaWYgeW91IHVzZSBhIHNlcnZpY2VOYW1lIHRoZW4gYSBEYXRhU2VydmljZVxyXG5pcyBjb25zdHJ1Y3RlZCBmb3IgeW91LiAgKEl0IGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIEVudGl0eU1hbmFnZXIuc2V0UHJvcGVydGllcyBtZXRob2QpLlxyXG5cclxuVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgTWV0YWRhdGFTdG9yZS5mZXRjaE1ldGFkYXRhIG1ldGhvZCwgaS5lLiBpdCB0YWtlcyBlaXRoZXIgYSBzZXJ2aWNlTmFtZSBvciBhIERhdGFTZXJ2aWNlIGluc3RhbmNlLlxyXG5cclxuRWFjaCBtZXRhZGF0YVN0b3JlIGNvbnRhaW5zIGEgbGlzdCBvZiBEYXRhU2VydmljZXMsIGVhY2ggYWNjZXNzaWJsZSB2aWEgaXRzIOKAmHNlcnZpY2VOYW1l4oCZLlxyXG4oIHNlZSBNZXRhZGF0YVN0b3JlLmdldERhdGFTZXJ2aWNlIGFuZCBNZXRhZGF0YVN0b3JlLmFkZERhdGFTZXJ2aWNlKS4gIFRoZSDigJhhZGREYXRhU2VydmljZeKAmSBtZXRob2QgaXMgY2FsbGVkIGludGVybmFsbHlcclxuYW55dGltZSBhIE1ldGFkYXRhU3RvcmUuZmV0Y2hNZXRhZGF0YSBjYWxsIG9jY3VycyB3aXRoIGEgbmV3IGRhdGFTZXJ2aWNlICggb3Igc2VydmljZSBuYW1lKS5cclxuXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRGF0YVNlcnZpY2Uge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBhY3R1YWxseSBwdXQgb24gcHJvdG90eXBlLlxyXG4gIC8qKiBUaGUgc2VydmljZU5hbWUgZm9yIHRoaXMgRGF0YVNlcnZpY2UuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAgZGVjbGFyZSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xyXG4gIC8qKiBUaGUgYWRhcHRlciBuYW1lIGZvciB0aGUgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gdG8gYmUgdXNlZCB3aXRoIHRoaXMgc2VydmljZS4gX19SZWFkIE9ubHlfXyAgKiovXHJcbiAgZGVjbGFyZSBhZGFwdGVyTmFtZTogc3RyaW5nO1xyXG4gIC8qKiAgVGhlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGRlY2xhcmUgYWRhcHRlckluc3RhbmNlPzogRGF0YVNlcnZpY2VBZGFwdGVyO1xyXG4gIC8qKiBUaGUgYWRhcHRlciBuYW1lIGZvciB0aGUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSB0byBiZSB1c2VkIHdpdGggdGhpcyBzZXJ2aWNlLiBfX1JlYWQgT25seV9fICAqKi9cclxuICBkZWNsYXJlIHVyaUJ1aWxkZXJOYW1lOiBzdHJpbmc7XHJcbiAgLyoqICBUaGUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiBfX1JlYWQgT25seV9fICAqKi9cclxuICBkZWNsYXJlIHVyaUJ1aWxkZXI/OiBVcmlCdWlsZGVyQWRhcHRlcjtcclxuICAvKiogV2hldGhlciB0aGUgc2VydmVyIGNhbiBwcm92aWRlIG1ldGFkYXRhIGZvciB0aGlzIHNlcnZpY2UuIF9fUmVhZCBPbmx5X18gICAqKi9cclxuICBkZWNsYXJlIGhhc1NlcnZlck1ldGFkYXRhOiBib29sZWFuO1xyXG4gIC8qKiBUaGUgW1tKc29uUmVzdWx0c0FkYXB0ZXJdXSB1c2VkIHRvIHByb2Nlc3MgdGhlIHJlc3VsdHMgb2YgYW55IHF1ZXJ5IGFnYWluc3QgdGhpcyBEYXRhU2VydmljZS4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBkZWNsYXJlIGpzb25SZXN1bHRzQWRhcHRlcjogSnNvblJlc3VsdHNBZGFwdGVyO1xyXG4gIC8qKiBXaGV0aGVyIHRvIHVzZSBKU09OUCB3aGVuIHBlcmZvcm1pbmcgYSAnR0VUJyByZXF1ZXN0IGFnYWluc3QgdGhpcyBzZXJ2aWNlLiBfX1JlYWQgT25seV9fICAqKi9cclxuICBkZWNsYXJlIHVzZUpzb25wOiBib29sZWFuO1xyXG5cclxuICAvKiogICBEYXRhU2VydmljZSBjb25zdHJ1Y3RvclxyXG4gID4gICAgIHZhciBkYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZSh7XHJcbiAgPiAgICAgICAgIHNlcnZpY2VOYW1lOiBhbHRTZXJ2aWNlTmFtZSxcclxuICA+ICAgICAgICAgaGFzU2VydmVyTWV0YWRhdGE6IGZhbHNlXHJcbiAgPiAgICAgfSk7XHJcblxyXG4gID4gICAgIHZhciBtZXRhZGF0YVN0b3JlID0gbmV3IE1ldGFkYXRhU3RvcmUoe1xyXG4gID4gICAgICAgICBuYW1pbmdDb252ZW50aW9uOiBOYW1pbmdDb252ZW50aW9uLmNhbWVsQ2FzZVxyXG4gID4gICAgIH0pO1xyXG5cclxuICA+ICAgICByZXR1cm4gbmV3IEVudGl0eU1hbmFnZXIoe1xyXG4gID4gICAgICAgICBkYXRhU2VydmljZTogZGF0YVNlcnZpY2UsXHJcbiAgPiAgICAgICAgIG1ldGFkYXRhU3RvcmU6IG1ldGFkYXRhU3RvcmVcclxuICA+ICAgICB9KTtcclxuICBAcGFyYW0gY29uZmlnIC0gQSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAqKi9cclxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBEYXRhU2VydmljZUNvbmZpZykge1xyXG4gICAgdXBkYXRlV2l0aENvbmZpZyh0aGlzLCBjb25maWcpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgRGF0YVNlcnZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgYXBwbGllZC5cclxuICBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRvIGFwcGx5IHRvIGNyZWF0ZSBhIG5ldyBEYXRhU2VydmljZS5cclxuICAqKi9cclxuICB1c2luZyhjb25maWc6IERhdGFTZXJ2aWNlQ29uZmlnKSB7XHJcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIHRoaXM7XHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IERhdGFTZXJ2aWNlKHRoaXMpO1xyXG4gICAgcmV0dXJuIHVwZGF0ZVdpdGhDb25maWcocmVzdWx0LCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlc29sdmUoZGF0YVNlcnZpY2VzOiBEYXRhU2VydmljZVtdKSB7XHJcbiAgICAvLyBmaW5hbCBkZWZhdWx0c1xyXG4gICAgLy8gRGVsaWJlcmF0ZSB1c2Ugb2YgJ2FzIGFueScgYmVsb3cuXHJcbiAgICAoZGF0YVNlcnZpY2VzIGFzIGFueSkucHVzaCh7XHJcbiAgICAgIGhhc1NlcnZlck1ldGFkYXRhOiB0cnVlLFxyXG4gICAgICB1c2VKc29ucDogZmFsc2VcclxuICAgIH0pO1xyXG4gICAgbGV0IGRzID0gbmV3IERhdGFTZXJ2aWNlKGNvcmUucmVzb2x2ZVByb3BlcnRpZXMoZGF0YVNlcnZpY2VzLFxyXG4gICAgICAgIFtcInNlcnZpY2VOYW1lXCIsIFwiYWRhcHRlck5hbWVcIiwgXCJ1cmlCdWlsZGVyTmFtZVwiLCBcImhhc1NlcnZlck1ldGFkYXRhXCIsIFwianNvblJlc3VsdHNBZGFwdGVyXCIsIFwidXNlSnNvbnBcIl0pKTtcclxuXHJcbiAgICBpZiAoIWRzLnNlcnZpY2VOYW1lKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXNvbHZlIGEgJ3NlcnZpY2VOYW1lJyBmb3IgdGhpcyBkYXRhU2VydmljZVwiKTtcclxuICAgIH1cclxuICAgIGRzLmFkYXB0ZXJJbnN0YW5jZSA9IGRzLmFkYXB0ZXJJbnN0YW5jZSB8fCBjb25maWcuZ2V0QWRhcHRlckluc3RhbmNlPERhdGFTZXJ2aWNlQWRhcHRlcj4oXCJkYXRhU2VydmljZVwiLCBkcy5hZGFwdGVyTmFtZSk7XHJcbiAgICBkcy5qc29uUmVzdWx0c0FkYXB0ZXIgPSBkcy5qc29uUmVzdWx0c0FkYXB0ZXIgfHwgZHMuYWRhcHRlckluc3RhbmNlIS5qc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgICBkcy51cmlCdWlsZGVyID0gZHMudXJpQnVpbGRlciB8fCBjb25maWcuZ2V0QWRhcHRlckluc3RhbmNlPFVyaUJ1aWxkZXJBZGFwdGVyPihcInVyaUJ1aWxkZXJcIiwgZHMudXJpQnVpbGRlck5hbWUpO1xyXG4gICAgcmV0dXJuIGRzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgc3RhdGljIF9ub3JtYWxpemVTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLnRyaW0oKTtcclxuICAgIGlmIChzZXJ2aWNlTmFtZS5zdWJzdHIoLTEpICE9PSBcIi9cIikge1xyXG4gICAgICByZXR1cm4gc2VydmljZU5hbWUgKyAnLyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gc2VydmljZU5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogICovXHJcbiAgdG9KU09OKCkge1xyXG4gICAgLy8gZG9uJ3QgdXNlIGRlZmF1bHQgdmFsdWUgaGVyZSAtIGJlY2F1c2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIHVuZGVmaW5lZCBwcm9wcyBmb3IgaW5oZXJpdGVuY2UgcHVycG9zZXMuXHJcbiAgICByZXR1cm4gY29yZS50b0pzb24odGhpcywge1xyXG4gICAgICBzZXJ2aWNlTmFtZTogbnVsbCxcclxuICAgICAgYWRhcHRlck5hbWU6IG51bGwsXHJcbiAgICAgIHVyaUJ1aWxkZXJOYW1lOiBudWxsLFxyXG4gICAgICBoYXNTZXJ2ZXJNZXRhZGF0YTogbnVsbCxcclxuICAgICAganNvblJlc3VsdHNBZGFwdGVyOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHYgJiYgdi5uYW1lO1xyXG4gICAgICB9LFxyXG4gICAgICB1c2VKc29ucDogbnVsbFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbUpTT04oanNvbjogYW55KSB7XHJcbiAgICBqc29uLmpzb25SZXN1bHRzQWRhcHRlciA9IGNvbmZpZy5fZmV0Y2hPYmplY3QoSnNvblJlc3VsdHNBZGFwdGVyLCBqc29uLmpzb25SZXN1bHRzQWRhcHRlcik7XHJcbiAgICByZXR1cm4gbmV3IERhdGFTZXJ2aWNlKGpzb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgIFJldHVybnMgYSB1cmwgZm9yIHRoaXMgZGF0YVNlcnZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeC4gVGhpcyBtZXRob2QgaGFuZGxlcyBkYXRhU2VydmljZSBuYW1lcyBlaXRoZXJcclxuICAgd2l0aCBvciB3aXRob3V0IHRyYWlsaW5nICcvJ3MuICBJZiB0aGUgc3VmZml4IHN0YXJ0cyB3aXRoIFwiaHR0cFwiIHRoZW4gaXQgd2lsbCBiZSByZXR1cm5lZCBhcy1pcy5cclxuICAgQG1ldGhvZCBxdWFsaWZ5VXJsXHJcbiAgIEBwYXJhbSBzdWZmaXgge1N0cmluZ30gVGhlIHJlc3VsdGluZyB1cmwuXHJcbiAgIEByZXR1cm4ge2EgVXJsIHN0cmluZ31cclxuICAgKiovXHJcbiAgcXVhbGlmeVVybChzdWZmaXg6IHN0cmluZykge1xyXG4gICAgaWYgKHN1ZmZpeCAmJiBzdWZmaXguc3RhcnRzV2l0aChcImh0dHBcIikpIHtcclxuICAgICAgcmV0dXJuIHN1ZmZpeDtcclxuICAgIH1cclxuICAgIGxldCB1cmwgPSB0aGlzLnNlcnZpY2VOYW1lO1xyXG4gICAgLy8gcmVtb3ZlIGFueSB0cmFpbGluZyBcIi9cIlxyXG4gICAgaWYgKGNvcmUuc3RyaW5nRW5kc1dpdGgodXJsLCBcIi9cIikpIHtcclxuICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCB1cmwubGVuZ3RoIC0gMSk7XHJcbiAgICB9XHJcbiAgICAvLyBlbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggXCIvXCIgKyBzdWZmaXhcclxuICAgIHN1ZmZpeCA9IFwiL1wiICsgc3VmZml4O1xyXG4gICAgaWYgKCFjb3JlLnN0cmluZ0VuZHNXaXRoKHVybCwgc3VmZml4KSkge1xyXG4gICAgICB1cmwgPSB1cmwgKyBzdWZmaXg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJsO1xyXG4gIH1cclxuXHJcbn1cclxuRGF0YVNlcnZpY2UucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkRhdGFTZXJ2aWNlXCI7XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVXaXRoQ29uZmlnKG9iajogRGF0YVNlcnZpY2UsIGRzQ29uZmlnPzogRGF0YVNlcnZpY2VDb25maWcpIHtcclxuICBpZiAoZHNDb25maWcpIHtcclxuICAgIGFzc2VydENvbmZpZyhkc0NvbmZpZylcclxuICAgICAgICAud2hlcmVQYXJhbShcInNlcnZpY2VOYW1lXCIpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwiYWRhcHRlck5hbWVcIikuaXNTdHJpbmcoKS5pc09wdGlvbmFsKClcclxuICAgICAgICAud2hlcmVQYXJhbShcInVyaUJ1aWxkZXJOYW1lXCIpLmlzU3RyaW5nKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJoYXNTZXJ2ZXJNZXRhZGF0YVwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKClcclxuICAgICAgICAud2hlcmVQYXJhbShcImpzb25SZXN1bHRzQWRhcHRlclwiKS5pc0luc3RhbmNlT2YoSnNvblJlc3VsdHNBZGFwdGVyKS5pc09wdGlvbmFsKClcclxuICAgICAgICAud2hlcmVQYXJhbShcInVzZUpzb25wXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC5hcHBseUFsbChvYmopO1xyXG4gICAgb2JqLnNlcnZpY2VOYW1lID0gb2JqLnNlcnZpY2VOYW1lICYmIERhdGFTZXJ2aWNlLl9ub3JtYWxpemVTZXJ2aWNlTmFtZShvYmouc2VydmljZU5hbWUpO1xyXG4gICAgb2JqLmFkYXB0ZXJJbnN0YW5jZSA9IG9iai5hZGFwdGVyTmFtZSA/ICBjb25maWcuZ2V0QWRhcHRlckluc3RhbmNlPERhdGFTZXJ2aWNlQWRhcHRlcj4oXCJkYXRhU2VydmljZVwiLCBvYmouYWRhcHRlck5hbWUpIDogdW5kZWZpbmVkO1xyXG4gICAgb2JqLnVyaUJ1aWxkZXIgPSBvYmoudXJpQnVpbGRlck5hbWUgPyBjb25maWcuZ2V0QWRhcHRlckluc3RhbmNlPFVyaUJ1aWxkZXJBZGFwdGVyPihcInVyaUJ1aWxkZXJcIiwgb2JqLnVyaUJ1aWxkZXJOYW1lKSA6IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlTWV0YSB7XHJcbiAgZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XHJcbiAgbm9kZUlkPzogc3RyaW5nO1xyXG4gIG5vZGVSZWZJZD86IHN0cmluZztcclxuICBpZ25vcmU/OiBib29sZWFuO1xyXG4gIHBhc3NUaHJ1PzogYm9vbGVhbjtcclxuICBleHRyYU1ldGFkYXRhPzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVDb250ZXh0IHtcclxuICBub2RlVHlwZTogc3RyaW5nO1xyXG4gIHByb3BlcnR5TmFtZT86IHN0cmluZztcclxuICBuYXZpZ2F0aW9uUHJvcGVydHk/OiBOYXZpZ2F0aW9uUHJvcGVydHk7XHJcbn1cclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBbW0pzb25SZXN1bHRzQWRhcHRlcl1dIGNvbnN0cnVjdG9yICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnNvblJlc3VsdHNBZGFwdGVyQ29uZmlnIHtcclxuICAvKiogVGhlIG5hbWUgb2YgdGhpcyBhZGFwdGVyLiAgVGhpcyBuYW1lIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW5kIGxvY2F0ZSB0aGlzIGluc3RhbmNlIHdoZW4gYW4gJ2V4cG9ydGVkJyBKc29uUmVzdWx0c0FkYXB0ZXIgaXMgbGF0ZXIgaW1wb3J0ZWQuICovXHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIC8qKiBBIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9uY2UgcGVyIHF1ZXJ5IG9wZXJhdGlvbiB0byBleHRyYWN0IHRoZSAncGF5bG9hZCcgZnJvbSBhbnkganNvbiByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLiBcclxuICBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIHRvIHNpbXBseSByZXR1cm4gdGhlIFwicmVzdWx0c1wiIHByb3BlcnR5IGZyb20gYW55IGpzb24gcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBxdWVyeS4gXHJcbiAgKi9cclxuICBleHRyYWN0UmVzdWx0cz86IEZ1bmN0aW9uO1xyXG4gIC8qKiBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9uY2UgcGVyIHNhdmUgb3BlcmF0aW9uIHRvIGV4dHJhY3QgdGhlIGVudGl0aWVzIGZyb20gYW55IGpzb24gcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZS4gIE11c3QgcmV0dXJuIGFuIGFycmF5LlxyXG4gIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2ltcGx5IHJldHVybnMgdGhlIFwiZW50aXRpZXNcIiBwcm9wZXJ0eSBmcm9tIGFueSBqc29uIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgc2F2ZS4gKi9cclxuICBleHRyYWN0U2F2ZVJlc3VsdHM/OiBGdW5jdGlvbjtcclxuICAvKiogQSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvbmNlIHBlciBzYXZlIG9wZXJhdGlvbiB0byBleHRyYWN0IHRoZSBrZXkgbWFwcGluZ3MgZnJvbSBhbnkganNvbiByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLiAgTXVzdCByZXR1cm4gYW4gYXJyYXkuXHJcbiAgVGhpcyBtZXRob2QgaGFzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBzaW1wbHkgcmV0dXJucyB0aGUgXCJrZXlNYXBwaW5nc1wiIHByb3BlcnR5IGZyb20gYW55IGpzb24gcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBzYXZlLiAqL1xyXG4gIGV4dHJhY3RLZXlNYXBwaW5ncz86IChkYXRhOiB7fSkgPT4gS2V5TWFwcGluZ1tdO1xyXG4gIC8qKiBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9uY2UgcGVyIHNhdmUgb3BlcmF0aW9uIHRvIGV4dHJhY3QgYW55IGRlbGV0ZWQga2V5cyBmcm9tIGFueSBqc29uIHJlY2VpdmVkIG92ZXIgdGhlIHdpcmUuICBNdXN0IHJldHVybiBhbiBhcnJheS5cclxuICBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIHNpbXBseSByZXR1cm5zIGFuIGVtcHR5IGFycmF5LiAqL1xyXG4gIGV4dHJhY3REZWxldGVkS2V5cz86IChkYXRhOiB7fSkgPT4gYW55W107IC8vIFRPRE86IHJlZmluZVxyXG4gIC8qKiBBIHZpc2l0b3IgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBub2RlIG9mIHRoZSByZXR1cm5lZCBwYXlsb2FkLiAqL1xyXG4gIHZpc2l0Tm9kZT86ICh2OiBhbnksIG1jPzogTWFwcGluZ0NvbnRleHQsIG5vZGVDb250ZXh0PzogTm9kZUNvbnRleHQpID0+IE5vZGVNZXRhO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbkEgSnNvblJlc3VsdHNBZGFwdGVyIGluc3RhbmNlIGlzIHVzZWQgdG8gcHJvdmlkZSBjdXN0b20gZXh0cmFjdGlvbiBhbmQgcGFyc2luZyBsb2dpYyBvbiB0aGUganNvbiByZXN1bHRzIHJldHVybmVkIGJ5IGFueSB3ZWIgc2VydmljZS5cclxuVGhpcyBmYWNpbGl0eSBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgYnJlZXplIHRvIHRhbGsgdG8gdmlydHVhbGx5IGFueSB3ZWIgc2VydmljZSBhbmQgcmV0dXJuIG9iamVjdHMgdGhhdCB3aWxsIGJlIGZpcnN0IGNsYXNzICdicmVlemUnIGNpdGl6ZW5zLlxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEpzb25SZXN1bHRzQWRhcHRlciB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBhY3R1YWxseSBwdXQgb24gcHJvdG90eXBlLlxyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIuICBUaGlzIG5hbWUgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhbmQgbG9jYXRlIHRoaXMgaW5zdGFuY2Ugd2hlbiBhbiAnZXhwb3J0ZWQnIEpzb25SZXN1bHRzQWRhcHRlciBpcyBsYXRlciBpbXBvcnRlZC4gKi9cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIEEgRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb25jZSBwZXIgcXVlcnkgb3BlcmF0aW9uIHRvIGV4dHJhY3QgdGhlICdwYXlsb2FkJyBmcm9tIGFueSBqc29uIHJlY2VpdmVkIG92ZXIgdGhlIHdpcmUuIFxyXG4gIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2ltcGx5IHJldHVybnMgdGhlIFwicmVzdWx0c1wiIHByb3BlcnR5IGZyb20gYW55IGpzb24gcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBxdWVyeS4gKi9cclxuICBleHRyYWN0UmVzdWx0czogRnVuY3Rpb247IC8vIFRPRE8gLSByZWZpbmVcclxuICAvKiogQSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvbmNlIHBlciBzYXZlIG9wZXJhdGlvbiB0byBleHRyYWN0IHRoZSBlbnRpdGllcyBmcm9tIGFueSBqc29uIHJlY2VpdmVkIG92ZXIgdGhlIHdpcmUuICBNdXN0IHJldHVybiBhbiBhcnJheS5cclxuICBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIHNpbXBseSByZXR1cm5zIHRoZSBcImVudGl0aWVzXCIgcHJvcGVydHkgZnJvbSBhbnkganNvbiByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHNhdmUuICovXHJcbiAgZXh0cmFjdFNhdmVSZXN1bHRzOiBGdW5jdGlvbjtcclxuICAgIC8qKiBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9uY2UgcGVyIHNhdmUgb3BlcmF0aW9uIHRvIGV4dHJhY3QgdGhlIGtleSBtYXBwaW5ncyBmcm9tIGFueSBqc29uIHJlY2VpdmVkIG92ZXIgdGhlIHdpcmUuICBNdXN0IHJldHVybiBhbiBhcnJheS5cclxuICBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIHNpbXBseSByZXR1cm5zIHRoZSBcImtleU1hcHBpbmdzXCIgcHJvcGVydHkgZnJvbSBhbnkganNvbiByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHNhdmUuICovXHJcbiAgZXh0cmFjdEtleU1hcHBpbmdzOiAgKGRhdGE6IHt9KSA9PiBLZXlNYXBwaW5nW107XHJcbiAgLyoqIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb25jZSBwZXIgc2F2ZSBvcGVyYXRpb24gdG8gZXh0cmFjdCBhbnkgZGVsZXRlZCBrZXlzIGZyb20gYW55IGpzb24gcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZS4gIE11c3QgcmV0dXJuIGFuIGFycmF5LlxyXG4gIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgdG8gc2ltcGx5IHJldHVybnMgdGhlIFwiZGVsZXRlZEtleXNcIiBwcm9wZXJ0eSBmcm9tIGFueSBqc29uIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgc2F2ZS4gKi9cclxuICBleHRyYWN0RGVsZXRlZEtleXM/OiAoZGF0YToge30pID0+IGFueVtdOyAvLyBUT0RPOiByZWZpbmVcclxuICAvKiogQSB2aXNpdG9yIG1ldGhvZCB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbm9kZSBvZiB0aGUgcmV0dXJuZWQgcGF5bG9hZC4gKi9cclxuICB2aXNpdE5vZGU6IEZ1bmN0aW9uO1xyXG5cclxuICAvKipcclxuICBKc29uUmVzdWx0c0FkYXB0ZXIgY29uc3RydWN0b3JcclxuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy9cclxuICAgICAgdmFyIGpzb25SZXN1bHRzQWRhcHRlciA9IG5ldyBKc29uUmVzdWx0c0FkYXB0ZXIoe1xyXG4gICAgICAgICAgbmFtZTogXCJ0ZXN0MWVcIixcclxuICAgICAgICAgIGV4dHJhY3RSZXN1bHRzOiBmdW5jdGlvbihqc29uKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGpzb24ucmVzdWx0cztcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2aXNpdE5vZGU6IGZ1bmN0aW9uKG5vZGUsIG1hcHBpbmdDb250ZXh0LCBub2RlQ29udGV4dCkge1xyXG4gICAgICAgICAgICAgIHZhciBlbnRpdHlUeXBlID0gbm9ybWFsaXplVHlwZU5hbWUobm9kZS4kdHlwZSk7XHJcbiAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG5vZGVDb250ZXh0LnByb3BlcnR5TmFtZTtcclxuICAgICAgICAgICAgICB2YXIgaWdub3JlID0gcHJvcGVydHlOYW1lICYmIHByb3BlcnR5TmFtZS5zdWJzdHIoMCwgMSkgPT09IFwiJFwiO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICBlbnRpdHlUeXBlOiBlbnRpdHlUeXBlLFxyXG4gICAgICAgICAgICAgICAgICBub2RlSWQ6IG5vZGUuJGlkLFxyXG4gICAgICAgICAgICAgICAgICBub2RlUmVmSWQ6IG5vZGUuJHJlZixcclxuICAgICAgICAgICAgICAgICAgaWdub3JlOiBpZ25vcmUsXHJcbiAgICAgICAgICAgICAgICAgIHBhc3NUaHJ1OiBmYWxzZSAvLyBkZWZhdWx0XHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgZGF0YVNlcnZpY2UgPSBuZXcgRGF0YVNlcnZpY2UoIHtcclxuICAgICAgICAgICAgICBzZXJ2aWNlTmFtZTogXCJicmVlemUvZm9vXCIsXHJcbiAgICAgICAgICAgICAganNvblJlc3VsdHNBZGFwdGVyOiBqc29uUmVzdWx0c0FkYXB0ZXJcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgZW50aXR5TWFuYWdlciA9IG5ldyBFbnRpdHlNYW5hZ2VyKCB7XHJcbiAgICAgICAgICBkYXRhU2VydmljZTogZGF0YVNlcnZpY2VcclxuICAgICAgfSk7XHJcblxyXG4gIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cclxuICAqKi9cclxuICBjb25zdHJ1Y3Rvcihqc0NvbmZpZzogSnNvblJlc3VsdHNBZGFwdGVyQ29uZmlnKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgSnNvblJlc3VsdHNBZGFwdGVyIGN0b3Igc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMgYSBjb25maWd1cmF0aW9uIG9iamVjdC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXNzZXJ0Q29uZmlnKGpzQ29uZmlnKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwibmFtZVwiKS5pc05vbkVtcHR5U3RyaW5nKClcclxuICAgICAgICAud2hlcmVQYXJhbShcImV4dHJhY3RSZXN1bHRzXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQoZXh0cmFjdFJlc3VsdHNEZWZhdWx0KVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwiZXh0cmFjdFNhdmVSZXN1bHRzXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQoZXh0cmFjdFNhdmVSZXN1bHRzRGVmYXVsdClcclxuICAgICAgICAud2hlcmVQYXJhbShcImV4dHJhY3RLZXlNYXBwaW5nc1wiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpLndpdGhEZWZhdWx0KGV4dHJhY3RLZXlNYXBwaW5nc0RlZmF1bHQpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJleHRyYWN0RGVsZXRlZEtleXNcIikuaXNGdW5jdGlvbigpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdChleHRyYWN0RGVsZXRlZEtleXNEZWZhdWx0KVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwidmlzaXROb2RlXCIpLmlzRnVuY3Rpb24oKVxyXG4gICAgICAgIC5hcHBseUFsbCh0aGlzKTtcclxuICAgIGNvbmZpZy5fc3RvcmVPYmplY3QodGhpcywgXCJKc29uUmVzdWx0c0FkYXB0ZXJcIiwgdGhpcy5uYW1lKTtcclxuICB9XHJcblxyXG59XHJcbkpzb25SZXN1bHRzQWRhcHRlci5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiSnNvblJlc3VsdHNBZGFwdGVyXCI7XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0UmVzdWx0c0RlZmF1bHQoZGF0YTogYW55KSB7XHJcbiAgcmV0dXJuIGRhdGEucmVzdWx0cztcclxufVxyXG5cclxuZnVuY3Rpb24gZXh0cmFjdFNhdmVSZXN1bHRzRGVmYXVsdChkYXRhOiBhbnkpIHtcclxuICByZXR1cm4gZGF0YS5lbnRpdGllcyB8fCBkYXRhLkVudGl0aWVzIHx8IFtdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0S2V5TWFwcGluZ3NEZWZhdWx0KGRhdGE6IGFueSkge1xyXG4gIHJldHVybiBkYXRhLmtleU1hcHBpbmdzIHx8IGRhdGEuS2V5TWFwcGluZ3MgfHwgW107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3REZWxldGVkS2V5c0RlZmF1bHQoZGF0YTogYW55KSB7XHJcbiAgcmV0dXJuIGRhdGEuZGVsZXRlZEtleXMgfHwgZGF0YS5EZWxldGVkS2V5cyB8fCBbXTtcclxufVxyXG5cclxuIl19
|