@vcd/sdk 0.13.0 → 15.0.0-alpha.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.
Files changed (92) hide show
  1. package/client/client/api.result.service.d.ts +20 -0
  2. package/client/client/constants.d.ts +10 -0
  3. package/client/client/index.d.ts +7 -0
  4. package/client/client/logging.interceptor.d.ts +14 -0
  5. package/client/client/request.headers.interceptor.d.ts +20 -0
  6. package/client/client/response.normalization.interceptor.d.ts +39 -0
  7. package/client/client/vcd.api.client.d.ts +351 -0
  8. package/client/client/vcd.http.client.d.ts +32 -0
  9. package/client/client/vcd.transfer.client.d.ts +121 -0
  10. package/client/container-hooks/index.d.ts +58 -0
  11. package/client/index.d.ts +2 -0
  12. package/client/openapi.d.ts +76 -0
  13. package/client/query/filter.builder.d.ts +162 -0
  14. package/client/query/index.d.ts +2 -0
  15. package/client/query/query.builder.d.ts +30 -0
  16. package/common/container-hooks.d.ts +2 -2
  17. package/core/plugin.module.d.ts +10 -5
  18. package/esm2020/client/client/api.result.service.mjs +43 -0
  19. package/esm2020/client/client/constants.mjs +13 -0
  20. package/esm2020/client/client/index.mjs +8 -0
  21. package/esm2020/client/client/logging.interceptor.mjs +44 -0
  22. package/esm2020/client/client/request.headers.interceptor.mjs +91 -0
  23. package/esm2020/client/client/response.normalization.interceptor.mjs +59 -0
  24. package/esm2020/client/client/vcd.api.client.mjs +602 -0
  25. package/esm2020/client/client/vcd.http.client.mjs +52 -0
  26. package/esm2020/client/client/vcd.transfer.client.mjs +166 -0
  27. package/esm2020/client/container-hooks/index.mjs +57 -0
  28. package/esm2020/client/index.mjs +3 -0
  29. package/esm2020/client/openapi.mjs +16 -0
  30. package/esm2020/client/query/filter.builder.mjs +195 -0
  31. package/esm2020/client/query/index.mjs +3 -0
  32. package/esm2020/client/query/query.builder.mjs +79 -0
  33. package/esm2020/common/container-hooks.mjs +74 -0
  34. package/esm2020/common/index.mjs +2 -0
  35. package/esm2020/core/index.mjs +2 -0
  36. package/esm2020/core/plugin.module.mjs +18 -0
  37. package/esm2020/main.mjs +45 -0
  38. package/esm2020/public-api.mjs +8 -0
  39. package/esm2020/vcd-sdk.mjs +5 -0
  40. package/fesm2015/vcd-sdk.mjs +1513 -0
  41. package/fesm2015/vcd-sdk.mjs.map +1 -0
  42. package/fesm2020/vcd-sdk.mjs +1508 -0
  43. package/fesm2020/vcd-sdk.mjs.map +1 -0
  44. package/index.d.ts +5 -0
  45. package/main.d.ts +11 -5
  46. package/package.json +30 -39
  47. package/public-api.d.ts +1 -1
  48. package/vcd-sdk-15.0.0-alpha.0.tgz +0 -0
  49. package/LICENSE.txt +0 -12
  50. package/README.md +0 -119
  51. package/bundles/vcd-sdk.umd.js +0 -810
  52. package/bundles/vcd-sdk.umd.js.map +0 -1
  53. package/bundles/vcd-sdk.umd.min.js +0 -16
  54. package/bundles/vcd-sdk.umd.min.js.map +0 -1
  55. package/esm2015/common/container-hooks.js +0 -219
  56. package/esm2015/common/index.js +0 -6
  57. package/esm2015/core/index.js +0 -6
  58. package/esm2015/core/plugin.module.js +0 -53
  59. package/esm2015/i18n/index.js +0 -8
  60. package/esm2015/i18n/translate.pipe.js +0 -92
  61. package/esm2015/i18n/translate.service.js +0 -229
  62. package/esm2015/i18n/translation.loader.js +0 -63
  63. package/esm2015/main.js +0 -37
  64. package/esm2015/public-api.js +0 -12
  65. package/esm2015/vcd-sdk.js +0 -10
  66. package/esm5/common/container-hooks.js +0 -266
  67. package/esm5/common/index.js +0 -6
  68. package/esm5/core/index.js +0 -6
  69. package/esm5/core/plugin.module.js +0 -64
  70. package/esm5/i18n/index.js +0 -8
  71. package/esm5/i18n/translate.pipe.js +0 -108
  72. package/esm5/i18n/translate.service.js +0 -280
  73. package/esm5/i18n/translation.loader.js +0 -68
  74. package/esm5/main.js +0 -41
  75. package/esm5/public-api.js +0 -12
  76. package/esm5/vcd-sdk.js +0 -10
  77. package/fesm2015/vcd-sdk.js +0 -511
  78. package/fesm2015/vcd-sdk.js.map +0 -1
  79. package/fesm5/vcd-sdk.js +0 -620
  80. package/fesm5/vcd-sdk.js.map +0 -1
  81. package/i18n/index.d.ts +0 -3
  82. package/i18n/translate.pipe.d.ts +0 -12
  83. package/i18n/translate.service.d.ts +0 -21
  84. package/i18n/translation.loader.d.ts +0 -11
  85. package/schematics/collection.json +0 -10
  86. package/schematics/ng-add/index.d.ts +0 -3
  87. package/schematics/ng-add/index.js +0 -101
  88. package/schematics/ng-add/index.ts +0 -134
  89. package/schematics/ng-add/schema.d.ts +0 -8
  90. package/schematics/ng-add/schema.json +0 -19
  91. package/vcd-sdk.d.ts +0 -5
  92. package/vcd-sdk.metadata.json +0 -1
@@ -0,0 +1,2 @@
1
+ export * from './query';
2
+ export * from './client';
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Entity reference used to describe VCD entities
3
+ */
4
+ export declare class EntityReference {
5
+ 'name': string;
6
+ 'id': string;
7
+ }
8
+ /**
9
+ * Session
10
+ */
11
+ export declare class Session {
12
+ /**
13
+ * ID of session
14
+ */
15
+ 'id': string;
16
+ /**
17
+ * User of this session
18
+ */
19
+ 'user': EntityReference;
20
+ /**
21
+ * Organization user is logged into for this session
22
+ */
23
+ 'org': EntityReference;
24
+ /**
25
+ * The accessible location this session is valid for
26
+ */
27
+ 'location': string;
28
+ /**
29
+ * User's roles for this session
30
+ */
31
+ 'roles': Array<string>;
32
+ /**
33
+ * References to user's roles
34
+ */
35
+ 'roleRefs': Array<EntityReference>;
36
+ /**
37
+ * The session idle timeout in minutes
38
+ */
39
+ 'sessionIdleTimeoutMinutes': number;
40
+ }
41
+ /**
42
+ * A list of locations accessible to this session.
43
+ */
44
+ export interface AccessibleLocations {
45
+ /**
46
+ * How many results there are in total (i.e., considering all pages).
47
+ */
48
+ resultTotal?: number;
49
+ /**
50
+ * How many pages there are in total.
51
+ */
52
+ pageCount?: number;
53
+ /**
54
+ * The page that was fetched, 1-indexed.
55
+ */
56
+ page?: number;
57
+ /**
58
+ * Result count for page that was fetched.
59
+ */
60
+ pageSize?: number;
61
+ /**
62
+ * The current page of accessible locations.
63
+ */
64
+ values?: Array<AccessibleLocation>;
65
+ }
66
+ /**
67
+ * A location accessible to this session.
68
+ */
69
+ export declare class AccessibleLocation {
70
+ 'locationId': string;
71
+ 'site': EntityReference;
72
+ 'org': EntityReference;
73
+ 'restApiEndpoint': string;
74
+ 'uiEndpoint': string;
75
+ 'apiVersion': string;
76
+ }
@@ -0,0 +1,162 @@
1
+ export declare namespace Filter {
2
+ /**
3
+ * Collection of strategies for wilcard string matching.
4
+ */
5
+ class MatchMode {
6
+ /**
7
+ * Match the start of a string.
8
+ */
9
+ static readonly START: string;
10
+ /**
11
+ * Match the end of a string.
12
+ */
13
+ static readonly END: string;
14
+ /**
15
+ * Match anywhere in the string.
16
+ */
17
+ static readonly ANYWHERE: string;
18
+ }
19
+ /**
20
+ * A filter item that can define a comparison/condition.
21
+ */
22
+ interface Property {
23
+ /**
24
+ * Create a filter condition to evaluate whether the property is equal to the specified value.
25
+ *
26
+ * @param value the pattern to evaluate
27
+ * @param moreValues optional additional patterns to evaluate that will be treated as an OR condition
28
+ * @returns an evaluatable filter condition
29
+ */
30
+ equalTo(value: (boolean | number | string), ...moreValues: (boolean | number | string)[]): CompleteCondition;
31
+ /**
32
+ * Create a filter condition to evaluate whether the property is not equal to the specified value.
33
+ *
34
+ * @param value the pattern to evaluate
35
+ * @returns an evaluatable filter condition
36
+ */
37
+ notEqualTo(value: (boolean | number | string)): CompleteCondition;
38
+ /**
39
+ * Create a filter condition to evaluate whether the property is less than the specified value.
40
+ *
41
+ * @param value the pattern to evaluate
42
+ * @returns an evaluatable filter condition
43
+ */
44
+ lessThan(value: number): CompleteCondition;
45
+ /**
46
+ * Create a filter condition to evaluate whether the property is less than or equal to the specified value.
47
+ *
48
+ * @param value the pattern to evaluate
49
+ * @returns an evaluatable filter condition
50
+ */
51
+ lessOrEqualTo(value: number): CompleteCondition;
52
+ /**
53
+ * Create a filter condition to evaluate whether the property is greater than the specified value.
54
+ *
55
+ * @param value the pattern to evaluate
56
+ * @returns an evaluatable filter condition
57
+ */
58
+ greaterThan(value: number): CompleteCondition;
59
+ /**
60
+ * Create a filter condition to evaluate whether the property is greater than or equal to the specified value.
61
+ *
62
+ * @param value the pattern to evaluate
63
+ * @returns an evaluatable filter condition
64
+ */
65
+ greaterOrEqualTo(value: number): CompleteCondition;
66
+ /**
67
+ * Create a filter condition to evaluate whether the property is a wildcard match with the specified value.
68
+ *
69
+ * @param value the pattern to evaluate
70
+ * @param mode the type of wildcard evaluation to perform
71
+ * @returns an evaluatable filter condition
72
+ */
73
+ like(value: string, mode: MatchMode): CompleteCondition;
74
+ }
75
+ /**
76
+ * A representation of a condition that is incomplete by itself, like an empty condition, aggregation wrapper, or junction.
77
+ */
78
+ interface PartialCondition {
79
+ /**
80
+ * Create a simple property to be evaulated as a filter condition.
81
+ *
82
+ * @param property the name of the property
83
+ * @returns a Property instance for defining a filter condition
84
+ */
85
+ is(property: string): Property;
86
+ /**
87
+ * Create a conjunction (AND) condition from existing conditions.
88
+ *
89
+ * @param condition1 first condition
90
+ * @param condition2 second condition
91
+ * @param conditionN any additional conditions
92
+ * @returns an evaluatable filter condition
93
+ */
94
+ and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
95
+ /**
96
+ * Create a disjunction (OR) condition from existing conditions.
97
+ *
98
+ * @param condition1 first condition
99
+ * @param condition2 second condition
100
+ * @param conditionN any additional conditions
101
+ * @returns an evaluatable filter condition
102
+ */
103
+ or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
104
+ }
105
+ /**
106
+ * An evaluatable filter condition.
107
+ */
108
+ interface CompleteCondition {
109
+ /**
110
+ * Add a condtion to this condition.
111
+ *
112
+ * This new condition will be ANDed to the existing condition.
113
+ *
114
+ * @returns an incomplete (empty) condition
115
+ */
116
+ and(): PartialCondition;
117
+ /**
118
+ * Add a condtion to this condition.
119
+ *
120
+ * This new condition will be ORed to the existing condition.
121
+ *
122
+ * @returns an incomplete (empty) condition
123
+ */
124
+ or(): PartialCondition;
125
+ /**
126
+ * Build the FIQL representation of the condition.
127
+ *
128
+ * @returns a FIQL string
129
+ */
130
+ query(): string;
131
+ }
132
+ /**
133
+ * Builds a FIQL search condition using a fluent interface.
134
+ */
135
+ class Builder implements PartialCondition {
136
+ /**
137
+ * Create a simple property to be evaulated as a filter condition.
138
+ *
139
+ * @param property the name of the property
140
+ * @returns a Property instance for defining a filter condition
141
+ */
142
+ is(property: string): Property;
143
+ /**
144
+ * Create a conjunction (AND) condition from existing conditions.
145
+ *
146
+ * @param condition1 first condition
147
+ * @param condition2 second condition
148
+ * @param conditionN any additional conditions
149
+ * @returns an evaluatable filter condition
150
+ */
151
+ and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
152
+ /**
153
+ * Create a disjunction (OR) condition from existing conditions.
154
+ *
155
+ * @param condition1 first condition
156
+ * @param condition2 second condition
157
+ * @param conditionN any additional conditions
158
+ * @returns an evaluatable filter condition
159
+ */
160
+ or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
161
+ }
162
+ }
@@ -0,0 +1,2 @@
1
+ export * from './query.builder';
2
+ export * from './filter.builder';
@@ -0,0 +1,30 @@
1
+ export declare namespace Query {
2
+ class Builder {
3
+ private _type;
4
+ private _format;
5
+ private _links;
6
+ private _pageSize;
7
+ private _fields;
8
+ private _filter;
9
+ private _sort;
10
+ private constructor();
11
+ static getBuilder(): Builder;
12
+ static ofType(type: string): Builder;
13
+ format(format: Query.Format): Builder;
14
+ links(links: boolean): Builder;
15
+ pageSize(pageSize: number): Builder;
16
+ fields(...fields: string[]): Builder;
17
+ filter(filter: string): Builder;
18
+ sort(...sort: {
19
+ field: string;
20
+ reverse?: boolean;
21
+ }[]): Builder;
22
+ get(): string;
23
+ getCloudAPI(): string;
24
+ }
25
+ class Format {
26
+ static readonly ID_RECORDS: string;
27
+ static readonly RECORDS: string;
28
+ static readonly REFERENCES: string;
29
+ }
30
+ }
@@ -67,7 +67,7 @@ export interface ExtensionNavRegistrationAction {
67
67
  payload: ExtensionNavRegistration;
68
68
  readonly type: string;
69
69
  }
70
- export declare type ExtensionNavRegistrationActionCtor = new (payload: ExtensionNavRegistration) => ExtensionNavRegistrationAction;
70
+ export type ExtensionNavRegistrationActionCtor = new (payload: ExtensionNavRegistration) => ExtensionNavRegistrationAction;
71
71
  export declare const ExtensionNavRegistrationAction: ExtensionNavRegistrationActionCtor;
72
72
  /**
73
73
  * Inject this to access the authentication token.
@@ -118,7 +118,7 @@ export interface EntityActionExtensionSubmenu {
118
118
  /**
119
119
  * This represents menu information for an entity action.
120
120
  */
121
- export declare type EntityActionExtensionMenuEntry = EntityActionExtensionMenuItem | EntityActionExtensionSubmenu;
121
+ export type EntityActionExtensionMenuEntry = EntityActionExtensionMenuItem | EntityActionExtensionSubmenu;
122
122
  /**
123
123
  * Every component referenced by an entity action extension point must inherit from this.
124
124
  */
@@ -1,11 +1,16 @@
1
1
  import { Store } from '@ngrx/store';
2
2
  import { ExtensionNavRegistration } from '../common';
3
- import { TranslateService } from '../i18n';
4
3
  export declare class PluginModule {
5
4
  private appStore;
6
- private translate;
7
- constructor(appStore: Store<any>, translate?: TranslateService);
5
+ constructor(appStore: Store<any>);
8
6
  protected registerExtension(extension: ExtensionNavRegistration): void;
9
- protected getDefaultLanguage(): string;
10
- protected getSupportedLanguages(): string[];
7
+ }
8
+ /**
9
+ * Config object that is passed on VcdSdkModule init
10
+ * using .forRoot() method. It can be used to store
11
+ * configutration properties that are later used by the Services
12
+ * provided.
13
+ */
14
+ export declare class VcdSdkConfig {
15
+ apiVersion: string;
11
16
  }
@@ -0,0 +1,43 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ // tslint:disable:variable-name
4
+ export class ApiResultService {
5
+ constructor() {
6
+ this._results = [];
7
+ }
8
+ get results() {
9
+ return this._results;
10
+ }
11
+ add(result) {
12
+ this._results = [result, ...this._results.slice(0, 99)];
13
+ }
14
+ clear() {
15
+ this._results = [];
16
+ }
17
+ }
18
+ ApiResultService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: ApiResultService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19
+ ApiResultService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: ApiResultService });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: ApiResultService, decorators: [{
21
+ type: Injectable
22
+ }] });
23
+ export class ApiResult {
24
+ get message() {
25
+ return this._message;
26
+ }
27
+ get succeeded() {
28
+ return this._succeeded;
29
+ }
30
+ get started() {
31
+ return this._started;
32
+ }
33
+ get finished() {
34
+ return this._finished;
35
+ }
36
+ constructor(message, succeeded, started, finished) {
37
+ this._message = message;
38
+ this._succeeded = succeeded;
39
+ this._started = started;
40
+ this._finished = finished;
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnJlc3VsdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmNkL3Nkay9zcmMvY2xpZW50L2NsaWVudC9hcGkucmVzdWx0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFM0MsK0JBQStCO0FBRS9CLE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFWSxhQUFRLEdBQWdCLEVBQUUsQ0FBQztLQVl0QztJQVhHLElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsR0FBRyxDQUFDLE1BQWlCO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsS0FBSztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OzZHQVpRLGdCQUFnQjtpSEFBaEIsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7O0FBZ0JYLE1BQU0sT0FBTyxTQUFTO0lBRWxCLElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBR0QsSUFBVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBR0QsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFHRCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVksT0FBZSxFQUFFLFNBQWtCLEVBQUUsT0FBYSxFQUFFLFFBQWM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDOUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTp2YXJpYWJsZS1uYW1lXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXBpUmVzdWx0U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfcmVzdWx0czogQXBpUmVzdWx0W10gPSBbXTtcbiAgICBwdWJsaWMgZ2V0IHJlc3VsdHMoKTogQXBpUmVzdWx0W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cztcbiAgICB9XG5cbiAgICBhZGQocmVzdWx0OiBBcGlSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5fcmVzdWx0cyA9IFtyZXN1bHQsIC4uLnRoaXMuX3Jlc3VsdHMuc2xpY2UoMCwgOTkpXTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fcmVzdWx0cyA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwaVJlc3VsdCB7XG4gICAgcHJpdmF0ZSBfbWVzc2FnZTogc3RyaW5nO1xuICAgIHB1YmxpYyBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdWNjZWVkZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGdldCBzdWNjZWVkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWNjZWVkZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RhcnRlZDogRGF0ZTtcbiAgICBwdWJsaWMgZ2V0IHN0YXJ0ZWQoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZpbmlzaGVkOiBEYXRlO1xuICAgIHB1YmxpYyBnZXQgZmluaXNoZWQoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5pc2hlZDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN1Y2NlZWRlZDogYm9vbGVhbiwgc3RhcnRlZDogRGF0ZSwgZmluaXNoZWQ6IERhdGUpIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuX3N1Y2NlZWRlZCA9IHN1Y2NlZWRlZDtcbiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHN0YXJ0ZWQ7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmluaXNoZWQ7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ /**
2
+ * HTTP Headers
3
+ */
4
+ export const HTTP_HEADERS = Object.freeze({
5
+ Authorization: 'Authorization',
6
+ etag: 'etag',
7
+ // Angular is dealing with case sensitive links despite the specification
8
+ // https://github.com/angular/angular/issues/6142
9
+ link: 'link',
10
+ Link: 'Link',
11
+ x_vcloud_authorization: 'x-vcloud-authorization'
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmNkL3Nkay9zcmMvY2xpZW50L2NsaWVudC9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUV0QyxhQUFhLEVBQUUsZUFBZTtJQUU5QixJQUFJLEVBQUUsTUFBTTtJQUVaLHlFQUF5RTtJQUN6RSxpREFBaUQ7SUFDakQsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsTUFBTTtJQUVaLHNCQUFzQixFQUFFLHdCQUF3QjtDQUNuRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhUVFAgSGVhZGVyc1xuICovXG5leHBvcnQgY29uc3QgSFRUUF9IRUFERVJTID0gT2JqZWN0LmZyZWV6ZSh7XG5cbiAgICBBdXRob3JpemF0aW9uOiAnQXV0aG9yaXphdGlvbicsXG5cbiAgICBldGFnOiAnZXRhZycsXG5cbiAgICAvLyBBbmd1bGFyIGlzIGRlYWxpbmcgd2l0aCBjYXNlIHNlbnNpdGl2ZSBsaW5rcyBkZXNwaXRlIHRoZSBzcGVjaWZpY2F0aW9uXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvNjE0MlxuICAgIGxpbms6ICdsaW5rJyxcbiAgICBMaW5rOiAnTGluaycsXG5cbiAgICB4X3ZjbG91ZF9hdXRob3JpemF0aW9uOiAneC12Y2xvdWQtYXV0aG9yaXphdGlvbidcbn0pO1xuIl19
@@ -0,0 +1,8 @@
1
+ export * from './api.result.service';
2
+ export * from './vcd.http.client';
3
+ export * from './vcd.api.client';
4
+ export * from './vcd.transfer.client';
5
+ export * from './request.headers.interceptor';
6
+ export * from './logging.interceptor';
7
+ export * from './response.normalization.interceptor';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FwaS5yZXN1bHQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZjZC5odHRwLmNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ZjZC5hcGkuY2xpZW50JztcbmV4cG9ydCAqIGZyb20gJy4vdmNkLnRyYW5zZmVyLmNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL3JlcXVlc3QuaGVhZGVycy5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dpbmcuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNwb25zZS5ub3JtYWxpemF0aW9uLmludGVyY2VwdG9yJztcbiJdfQ==
@@ -0,0 +1,44 @@
1
+ import { Injectable, Optional } from '@angular/core';
2
+ import { HttpResponse } from '@angular/common/http';
3
+ import { finalize, tap } from 'rxjs/operators';
4
+ import { ApiResult } from './api.result.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./api.result.service";
7
+ // tslint:disable:variable-name
8
+ export class LoggingInterceptor {
9
+ set enabled(enabled) {
10
+ this._enabled = enabled;
11
+ if (this._enabled && this._outputToConsole) {
12
+ console.warn('API logging enabled but no provider found for ApiResultService. Results will be output to the console.');
13
+ }
14
+ }
15
+ constructor(apiResultService) {
16
+ this.apiResultService = apiResultService;
17
+ this._enabled = false;
18
+ this._outputToConsole = !this.apiResultService;
19
+ }
20
+ intercept(req, next) {
21
+ if (!this._enabled) {
22
+ return next.handle(req);
23
+ }
24
+ const started = new Date();
25
+ let succeeded;
26
+ return next.handle(req)
27
+ .pipe(tap(event => succeeded = event instanceof HttpResponse ? true : false, error => succeeded = false), finalize(() => {
28
+ if (this._outputToConsole) {
29
+ console.log(`${req.method} ${req.urlWithParams} completed in ${Date.now() - started.getTime()} ms. Success: ${succeeded}`);
30
+ }
31
+ else {
32
+ this.apiResultService.add(new ApiResult(`${req.method} ${req.urlWithParams}`, succeeded, started, new Date()));
33
+ }
34
+ }));
35
+ }
36
+ }
37
+ LoggingInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LoggingInterceptor, deps: [{ token: i1.ApiResultService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
38
+ LoggingInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LoggingInterceptor });
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LoggingInterceptor, decorators: [{
40
+ type: Injectable
41
+ }], ctorParameters: function () { return [{ type: i1.ApiResultService, decorators: [{
42
+ type: Optional
43
+ }] }]; } });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZjZC9zZGsvc3JjL2NsaWVudC9jbGllbnQvbG9nZ2luZy5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBRVEsWUFBWSxFQUMxQixNQUFNLHNCQUFzQixDQUFDO0FBRzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFvQixTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRW5FLCtCQUErQjtBQUUvQixNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLElBQUksT0FBTyxDQUFDLE9BQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyx5R0FBeUcsQ0FBQyxDQUFDO1NBQ3pIO0lBQ0gsQ0FBQztJQUVELFlBQWdDLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBUjFELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFTdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pELENBQUM7SUFFRCxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekI7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksU0FBa0IsQ0FBQztRQUV2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ3BCLElBQUksQ0FDSCxHQUFHLENBQ0QsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQ2pFLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FDM0IsRUFDRCxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxhQUFhLGlCQUFpQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUM3SDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNoSDtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDOzsrR0FwQ1Usa0JBQWtCO21IQUFsQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVTs7MEJBV0ksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBIdHRwRXZlbnQsIEh0dHBJbnRlcmNlcHRvciwgSHR0cEhhbmRsZXIsXG4gIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2Vcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXBpUmVzdWx0U2VydmljZSwgQXBpUmVzdWx0IH0gZnJvbSAnLi9hcGkucmVzdWx0LnNlcnZpY2UnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTp2YXJpYWJsZS1uYW1lXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9nZ2luZ0ludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgcHJpdmF0ZSBfb3V0cHV0VG9Db25zb2xlOiBib29sZWFuO1xuICBwcml2YXRlIF9lbmFibGVkID0gZmFsc2U7XG4gIHNldCBlbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlZDtcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiB0aGlzLl9vdXRwdXRUb0NvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignQVBJIGxvZ2dpbmcgZW5hYmxlZCBidXQgbm8gcHJvdmlkZXIgZm91bmQgZm9yIEFwaVJlc3VsdFNlcnZpY2UuICBSZXN1bHRzIHdpbGwgYmUgb3V0cHV0IHRvIHRoZSBjb25zb2xlLicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgYXBpUmVzdWx0U2VydmljZTogQXBpUmVzdWx0U2VydmljZSkge1xuICAgIHRoaXMuX291dHB1dFRvQ29uc29sZSA9ICF0aGlzLmFwaVJlc3VsdFNlcnZpY2U7XG4gIH1cblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW47XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChcbiAgICAgICAgICBldmVudCA9PiBzdWNjZWVkZWQgPSBldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICBlcnJvciA9PiBzdWNjZWVkZWQgPSBmYWxzZVxuICAgICAgICApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX291dHB1dFRvQ29uc29sZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsV2l0aFBhcmFtc30gY29tcGxldGVkIGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0ZWQuZ2V0VGltZSgpfSBtcy4gIFN1Y2Nlc3M6ICR7c3VjY2VlZGVkfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwaVJlc3VsdFNlcnZpY2UuYWRkKG5ldyBBcGlSZXN1bHQoYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsV2l0aFBhcmFtc31gLCBzdWNjZWVkZWQsIHN0YXJ0ZWQsIG5ldyBEYXRlKCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,91 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpResponse } from '@angular/common/http';
3
+ import { map } from 'rxjs/operators';
4
+ import { parseHeaderHateoasLinks } from '.';
5
+ import { HTTP_HEADERS } from './constants';
6
+ import * as i0 from "@angular/core";
7
+ // tslint:disable:variable-name
8
+ export class RequestHeadersInterceptor {
9
+ constructor() {
10
+ this._enabled = true;
11
+ this._version = '';
12
+ this._authenticationHeader = HTTP_HEADERS.Authorization;
13
+ }
14
+ set enabled(_enabled) {
15
+ this._enabled = _enabled;
16
+ }
17
+ set actAs(_actAs) {
18
+ this._actAs = _actAs;
19
+ }
20
+ get version() {
21
+ return this._version;
22
+ }
23
+ set version(_version) {
24
+ this._version = _version;
25
+ }
26
+ set authentication(_authentication) {
27
+ this._authentication = _authentication;
28
+ this._authenticationHeader = (this._authentication && this._authentication.length > 32) ?
29
+ HTTP_HEADERS.Authorization : HTTP_HEADERS.x_vcloud_authorization;
30
+ }
31
+ intercept(req, next) {
32
+ let headers = req.headers;
33
+ if (!headers.has('Accept')) {
34
+ headers = this.setAcceptHeader(headers);
35
+ }
36
+ if (!headers.has('Content-Type')) {
37
+ headers = this.setContentTypeHeader(headers, req.url);
38
+ }
39
+ if (this._authentication && !headers.has(HTTP_HEADERS.Authorization)) {
40
+ headers = headers.set(this._authenticationHeader, this._authentication);
41
+ }
42
+ /**
43
+ * Covers the case where the User set the ActAs token himself
44
+ */
45
+ if (!headers.has('X-VMWARE-VCLOUD-TENANT-CONTEXT') && this._actAs) {
46
+ headers = headers.set('X-VMWARE-VCLOUD-TENANT-CONTEXT', this._actAs);
47
+ }
48
+ const customReq = req.clone({
49
+ headers
50
+ });
51
+ return next.handle(customReq).pipe(map((res) => {
52
+ if (res instanceof HttpResponse) {
53
+ if (!res.body || !res.headers) {
54
+ return res;
55
+ }
56
+ if (res.headers.has(HTTP_HEADERS.link)) {
57
+ res.body.link = parseHeaderHateoasLinks(res.headers.get(HTTP_HEADERS.link));
58
+ }
59
+ if (res.headers.has(HTTP_HEADERS.Link)) {
60
+ res.body.link = parseHeaderHateoasLinks(res.headers.get(HTTP_HEADERS.Link));
61
+ }
62
+ if (res.headers.has(HTTP_HEADERS.etag)) {
63
+ res.body.etag = res.headers.get(HTTP_HEADERS.etag);
64
+ }
65
+ }
66
+ return res;
67
+ }));
68
+ }
69
+ setAcceptHeader(headers) {
70
+ const value = headers.get('_multisite');
71
+ headers = headers.delete('_multisite');
72
+ return headers.set('Accept', [
73
+ `application/*+json;version=${this._version}${value ? `;multisite=${value}` : ''}`,
74
+ `application/json;version=${this._version}${value ? `;multisite=${value}` : ''}`
75
+ ]);
76
+ }
77
+ setContentTypeHeader(headers, url) {
78
+ if (url.indexOf('cloudapi') > -1) {
79
+ return headers.set('Content-Type', 'application/json');
80
+ }
81
+ else {
82
+ return headers.set('Content-Type', 'application/*+json');
83
+ }
84
+ }
85
+ }
86
+ RequestHeadersInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: RequestHeadersInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
87
+ RequestHeadersInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: RequestHeadersInterceptor });
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: RequestHeadersInterceptor, decorators: [{
89
+ type: Injectable
90
+ }] });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5oZWFkZXJzLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmNkL3Nkay9zcmMvY2xpZW50L2NsaWVudC9yZXF1ZXN0LmhlYWRlcnMuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxHQUFHLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFFM0MsK0JBQStCO0FBRS9CLE1BQU0sT0FBTyx5QkFBeUI7SUFEdEM7UUFFWSxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBVWhCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFRZCwwQkFBcUIsR0FBVyxZQUFZLENBQUMsYUFBYSxDQUFDO0tBNkV0RTtJQTlGRyxJQUFJLE9BQU8sQ0FBQyxRQUFpQjtRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBR0QsSUFBSSxLQUFLLENBQUMsTUFBYztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBR0QsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFnQjtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBSUQsSUFBSSxjQUFjLENBQUMsZUFBdUI7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixH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QyxHQUFHLENBQ2QsUUFBUSxFQUFFO1lBQ04sOEJBQThCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDbEYsNEJBQTRCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7U0FDbkYsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQW9CLEVBQUUsR0FBVztRQUMxRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDOUIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1NBQzFEO2FBQU07WUFDSCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLG9CQUFvQixDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDOztzSEEvRlEseUJBQXlCOzBIQUF6Qix5QkFBeUI7MkZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwRXZlbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBwYXJzZUhlYWRlckhhdGVvYXNMaW5rcyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgSFRUUF9IRUFERVJTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTp2YXJpYWJsZS1uYW1lXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgcHJpdmF0ZSBfZW5hYmxlZCA9IHRydWU7XG4gICAgc2V0IGVuYWJsZWQoX2VuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IF9lbmFibGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FjdEFzOiBzdHJpbmc7XG4gICAgc2V0IGFjdEFzKF9hY3RBczogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2FjdEFzID0gX2FjdEFzO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ZlcnNpb24gPSAnJztcbiAgICBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgc2V0IHZlcnNpb24oX3ZlcnNpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25IZWFkZXI6IHN0cmluZyA9IEhUVFBfSEVBREVSUy5BdXRob3JpemF0aW9uO1xuICAgIHByaXZhdGUgX2F1dGhlbnRpY2F0aW9uOiBzdHJpbmc7XG4gICAgc2V0IGF1dGhlbnRpY2F0aW9uKF9hdXRoZW50aWNhdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uID0gX2F1dGhlbnRpY2F0aW9uO1xuICAgICAgICB0aGlzLl9hdXRoZW50aWNhdGlvbkhlYWRlciA9ICh0aGlzLl9hdXRoZW50aWNhdGlvbiAmJiB0aGlzLl9hdXRoZW50aWNhdGlvbi5sZW5ndGggPiAzMikgP1xuICAgICAgICAgICAgSFRUUF9IRUFERVJTLkF1dGhvcml6YXRpb24gOiBIVFRQX0hFQURFUlMueF92Y2xvdWRfYXV0aG9yaXphdGlvbjtcbiAgICB9XG5cbiAgICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcblxuICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdBY2NlcHQnKSkge1xuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuc2V0QWNjZXB0SGVhZGVyKGhlYWRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSB0aGlzLnNldENvbnRlbnRUeXBlSGVhZGVyKGhlYWRlcnMsIHJlcS51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2F1dGhlbnRpY2F0aW9uICYmICFoZWFkZXJzLmhhcyhIVFRQX0hFQURFUlMuQXV0aG9yaXphdGlvbikpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCh0aGlzLl9hdXRoZW50aWNhdGlvbkhlYWRlciwgdGhpcy5fYXV0aGVudGljYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvdmVycyB0aGUgY2FzZSB3aGVyZSB0aGUgVXNlciBzZXQgdGhlIEFjdEFzIHRva2VuIGhpbXNlbGZcbiAgICAgICAgICovXG4gICAgICAgIGlmICghaGVhZGVycy5oYXMoJ1gtVk1XQVJFLVZDTE9VRC1URU5BTlQtQ09OVEVYVCcpICYmIHRoaXMuX2FjdEFzKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ1gtVk1XQVJFLVZDTE9VRC1URU5BTlQtQ09OVEVYVCcsIHRoaXMuX2FjdEFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1c3RvbVJlcTogSHR0cFJlcXVlc3Q8YW55PiA9IHJlcS5jbG9uZSh7XG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShjdXN0b21SZXEpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlczogSHR0cEV2ZW50PGFueT4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzLmJvZHkgfHwgIXJlcy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5oZWFkZXJzLmhhcyhIVFRQX0hFQURFUlMubGluaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5ib2R5LmxpbmsgPSBwYXJzZUhlYWRlckhhdGVvYXNMaW5rcyhyZXMuaGVhZGVycy5nZXQoSFRUUF9IRUFERVJTLmxpbmspKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMuaGVhZGVycy5oYXMoSFRUUF9IRUFERVJTLkxpbmspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMuYm9keS5saW5rID0gcGFyc2VIZWFkZXJIYXRlb2FzTGlua3MocmVzLmhlYWRlcnMuZ2V0KEhUVFBfSEVBREVSUy5MaW5rKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmhlYWRlcnMuaGFzKEhUVFBfSEVBREVSUy5ldGFnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmJvZHkuZXRhZyA9IHJlcy5oZWFkZXJzLmdldChIVFRQX0hFQURFUlMuZXRhZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRBY2NlcHRIZWFkZXIoaGVhZGVyczogSHR0cEhlYWRlcnMpOiBIdHRwSGVhZGVycyB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoJ19tdWx0aXNpdGUnKTtcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuZGVsZXRlKCdfbXVsdGlzaXRlJyk7XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnMuc2V0KFxuICAgICAgICAgICAgJ0FjY2VwdCcsIFtcbiAgICAgICAgICAgICAgICBgYXBwbGljYXRpb24vKitqc29uO3ZlcnNpb249JHt0aGlzLl92ZXJzaW9ufSR7dmFsdWUgPyBgO211bHRpc2l0ZT0ke3ZhbHVlfWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIGBhcHBsaWNhdGlvbi9qc29uO3ZlcnNpb249JHt0aGlzLl92ZXJzaW9ufSR7dmFsdWUgPyBgO211bHRpc2l0ZT0ke3ZhbHVlfWAgOiAnJ31gXG4gICAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDb250ZW50VHlwZUhlYWRlcihoZWFkZXJzOiBIdHRwSGVhZGVycywgdXJsOiBzdHJpbmcpOiBIdHRwSGVhZGVycyB7XG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignY2xvdWRhcGknKSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi8qK2pzb24nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,59 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpResponse } from '@angular/common/http';
3
+ import { map } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ // tslint:disable:jsdoc-format
6
+ /**
7
+ * An interceptor on the response chain that normalizes differences in
8
+ * JSON payloads between vCloud Director version 9.1 and versions
9
+ * greater than 9.1.
10
+ *
11
+ * In 9.1 (API version 30.0) the server serializes JSON and nests the payload in a value field:
12
+ * ```
13
+ {
14
+ "name" : "{http://www.vmware.com/vcloud/versions}SupportedVersions",
15
+ "declaredType" : "com.vmware.vcloud.api.rest.schema.versioning.SupportedVersionsType",
16
+ "scope" : "javax.xml.bind.JAXBElement$GlobalScope",
17
+ "value" : {
18
+ "versionInfo" : [],
19
+ "any" : [],
20
+ "otherAttributes" : {}
21
+ }
22
+ }
23
+ ```
24
+ *
25
+ * That same request in API versions 31.0 and above is represented as:
26
+ * ```
27
+ {
28
+ "versionInfo" : [],
29
+ "any" : [],
30
+ "otherAttributes" : {}
31
+ }
32
+ ```
33
+ * This interceptor should process responses before any other interceptors that rely
34
+ * on consistent API information.
35
+ */
36
+ export class ResponseNormalizationInterceptor {
37
+ intercept(req, next) {
38
+ return next.handle(req).pipe(map(response => {
39
+ // While this condition seems awfully specific, the alternative option of examining the 'Content-Type'
40
+ // response header for 'version=30.0' proved to be an unreliable condition in at least one case;
41
+ // returning the same JSON payload as API versions >= 31.0.
42
+ if (response instanceof HttpResponse && response.body && response.body.value && response.body.declaredType && response.body.scope) {
43
+ const body = response.body.value;
44
+ if (response.body.declaredType === ResponseNormalizationInterceptor.QUERY_RESULT_TYPE) {
45
+ body.record = body.record.map(record => record.value);
46
+ }
47
+ return response.clone({ body });
48
+ }
49
+ return response;
50
+ }));
51
+ }
52
+ }
53
+ ResponseNormalizationInterceptor.QUERY_RESULT_TYPE = 'com.vmware.vcloud.api.rest.schema_v1_5.QueryResultRecordsType';
54
+ ResponseNormalizationInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: ResponseNormalizationInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
55
+ ResponseNormalizationInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: ResponseNormalizationInterceptor });
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: ResponseNormalizationInterceptor, decorators: [{
57
+ type: Injectable
58
+ }] });
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2Uubm9ybWFsaXphdGlvbi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZjZC9zZGsvc3JjL2NsaWVudC9jbGllbnQvcmVzcG9uc2Uubm9ybWFsaXphdGlvbi5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBd0QsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHMUcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUVyQyw4QkFBOEI7QUFDOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBRUgsTUFBTSxPQUFPLGdDQUFnQztJQUczQyxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNoRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUMxQixHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDYixzR0FBc0c7WUFDdEcsZ0dBQWdHO1lBQ2hHLDJEQUEyRDtZQUMzRCxJQUFJLFFBQVEsWUFBWSxZQUFZLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDakksTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssZ0NBQWdDLENBQUMsaUJBQWlCLEVBQUU7b0JBQ3JGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3ZEO2dCQUVELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDakM7WUFFRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7QUFwQnVCLGtEQUFpQixHQUFHLCtEQUErRCxDQUFDOzZIQURqRyxnQ0FBZ0M7aUlBQWhDLGdDQUFnQzsyRkFBaEMsZ0NBQWdDO2tCQUQ1QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBIYW5kbGVyLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOmpzZG9jLWZvcm1hdFxuLyoqXG4gKiBBbiBpbnRlcmNlcHRvciBvbiB0aGUgcmVzcG9uc2UgY2hhaW4gdGhhdCBub3JtYWxpemVzIGRpZmZlcmVuY2VzIGluXG4gKiBKU09OIHBheWxvYWRzIGJldHdlZW4gdkNsb3VkIERpcmVjdG9yIHZlcnNpb24gOS4xIGFuZCB2ZXJzaW9uc1xuICogZ3JlYXRlciB0aGFuIDkuMS5cbiAqXG4gKiBJbiA5LjEgKEFQSSB2ZXJzaW9uIDMwLjApIHRoZSBzZXJ2ZXIgc2VyaWFsaXplcyBKU09OIGFuZCBuZXN0cyB0aGUgcGF5bG9hZCBpbiBhIHZhbHVlIGZpZWxkOlxuICogYGBgXG4gIHtcbiAgICBcIm5hbWVcIiA6IFwie2h0dHA6Ly93d3cudm13YXJlLmNvbS92Y2xvdWQvdmVyc2lvbnN9U3VwcG9ydGVkVmVyc2lvbnNcIixcbiAgICBcImRlY2xhcmVkVHlwZVwiIDogXCJjb20udm13YXJlLnZjbG91ZC5hcGkucmVzdC5zY2hlbWEudmVyc2lvbmluZy5TdXBwb3J0ZWRWZXJzaW9uc1R5cGVcIixcbiAgICBcInNjb3BlXCIgOiBcImphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50JEdsb2JhbFNjb3BlXCIsXG4gICAgXCJ2YWx1ZVwiIDoge1xuICAgICAgXCJ2ZXJzaW9uSW5mb1wiIDogW10sXG4gICAgICBcImFueVwiIDogW10sXG4gICAgICBcIm90aGVyQXR0cmlidXRlc1wiIDoge31cbiAgICB9XG4gIH1cbiAgYGBgXG4gKlxuICogVGhhdCBzYW1lIHJlcXVlc3QgaW4gQVBJIHZlcnNpb25zIDMxLjAgYW5kIGFib3ZlIGlzIHJlcHJlc2VudGVkIGFzOlxuICogYGBgXG4gIHtcbiAgICBcInZlcnNpb25JbmZvXCIgOiBbXSxcbiAgICBcImFueVwiIDogW10sXG4gICAgXCJvdGhlckF0dHJpYnV0ZXNcIiA6IHt9XG4gIH1cbiAgYGBgXG4gKiBUaGlzIGludGVyY2VwdG9yIHNob3VsZCBwcm9jZXNzIHJlc3BvbnNlcyBiZWZvcmUgYW55IG90aGVyIGludGVyY2VwdG9ycyB0aGF0IHJlbHlcbiAqIG9uIGNvbnNpc3RlbnQgQVBJIGluZm9ybWF0aW9uLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VOb3JtYWxpemF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBRVUVSWV9SRVNVTFRfVFlQRSA9ICdjb20udm13YXJlLnZjbG91ZC5hcGkucmVzdC5zY2hlbWFfdjFfNS5RdWVyeVJlc3VsdFJlY29yZHNUeXBlJztcblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gV2hpbGUgdGhpcyBjb25kaXRpb24gc2VlbXMgYXdmdWxseSBzcGVjaWZpYywgdGhlIGFsdGVybmF0aXZlIG9wdGlvbiBvZiBleGFtaW5pbmcgdGhlICdDb250ZW50LVR5cGUnXG4gICAgICAgIC8vIHJlc3BvbnNlIGhlYWRlciBmb3IgJ3ZlcnNpb249MzAuMCcgcHJvdmVkIHRvIGJlIGFuIHVucmVsaWFibGUgY29uZGl0aW9uIGluIGF0IGxlYXN0IG9uZSBjYXNlO1xuICAgICAgICAvLyByZXR1cm5pbmcgdGhlIHNhbWUgSlNPTiBwYXlsb2FkIGFzIEFQSSB2ZXJzaW9ucyA+PSAzMS4wLlxuICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgJiYgcmVzcG9uc2UuYm9keSAmJiByZXNwb25zZS5ib2R5LnZhbHVlICYmIHJlc3BvbnNlLmJvZHkuZGVjbGFyZWRUeXBlICYmIHJlc3BvbnNlLmJvZHkuc2NvcGUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuYm9keS52YWx1ZTtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS5kZWNsYXJlZFR5cGUgPT09IFJlc3BvbnNlTm9ybWFsaXphdGlvbkludGVyY2VwdG9yLlFVRVJZX1JFU1VMVF9UWVBFKSB7XG4gICAgICAgICAgICBib2R5LnJlY29yZCA9IGJvZHkucmVjb3JkLm1hcChyZWNvcmQgPT4gcmVjb3JkLnZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY2xvbmUoeyBib2R5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=