ng2-rest 11.0.41 → 13.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/app.js +2 -47
- package/app.js.map +1 -1
- package/browser/README.md +24 -0
- package/browser/esm2020/lib/cookie.mjs +27 -0
- package/browser/esm2020/lib/helpers.mjs +22 -0
- package/browser/esm2020/lib/index.mjs +10 -0
- package/browser/esm2020/lib/mapping.mjs +271 -0
- package/browser/esm2020/lib/models.mjs +135 -0
- package/browser/esm2020/lib/params.mjs +305 -0
- package/browser/esm2020/lib/request-cache.mjs +95 -0
- package/browser/esm2020/lib/resource.service.mjs +255 -0
- package/browser/esm2020/lib/rest-headers.mjs +129 -0
- package/browser/esm2020/lib/rest-request.mjs +310 -0
- package/browser/esm2020/lib/rest.class.mjs +114 -0
- package/browser/esm2020/lib/simple-resource.mjs +117 -0
- package/browser/esm2020/ng2-rest.mjs +5 -0
- package/browser/esm2020/public-api.mjs +2 -0
- package/browser/fesm2015/ng2-rest.mjs +1754 -0
- package/browser/fesm2015/ng2-rest.mjs.map +1 -0
- package/browser/fesm2020/ng2-rest.mjs +1751 -0
- package/browser/fesm2020/ng2-rest.mjs.map +1 -0
- package/browser/{cookie.d.ts → lib/cookie.d.ts} +0 -0
- package/browser/{helpers.d.ts → lib/helpers.d.ts} +0 -0
- package/browser/{index.d.ts → lib/index.d.ts} +0 -0
- package/browser/{mapping.d.ts → lib/mapping.d.ts} +0 -0
- package/{client → browser/lib}/models.d.ts +2 -3
- package/browser/{params.d.ts → lib/params.d.ts} +0 -0
- package/browser/{request-cache.d.ts → lib/request-cache.d.ts} +0 -0
- package/browser/{resource.service.d.ts → lib/resource.service.d.ts} +1 -5
- package/browser/{rest-headers.d.ts → lib/rest-headers.d.ts} +0 -0
- package/{rest-request.d.ts → browser/lib/rest-request.d.ts} +0 -3
- package/{rest.class.d.ts → browser/lib/rest.class.d.ts} +0 -1
- package/browser/{simple-resource.d.ts → lib/simple-resource.d.ts} +1 -5
- package/browser/ng2-rest.d.ts +5 -0
- package/browser/package.json +31 -0
- package/browser/public-api.d.ts +1 -0
- package/client/README.md +24 -0
- package/client/esm2020/lib/cookie.mjs +27 -0
- package/client/esm2020/lib/helpers.mjs +22 -0
- package/client/esm2020/lib/index.mjs +10 -0
- package/client/esm2020/lib/mapping.mjs +271 -0
- package/client/esm2020/lib/models.mjs +135 -0
- package/client/esm2020/lib/params.mjs +305 -0
- package/client/esm2020/lib/request-cache.mjs +95 -0
- package/client/esm2020/lib/resource.service.mjs +255 -0
- package/client/esm2020/lib/rest-headers.mjs +129 -0
- package/client/esm2020/lib/rest-request.mjs +310 -0
- package/client/esm2020/lib/rest.class.mjs +114 -0
- package/client/esm2020/lib/simple-resource.mjs +117 -0
- package/client/esm2020/ng2-rest.mjs +5 -0
- package/client/esm2020/public-api.mjs +2 -0
- package/client/fesm2015/ng2-rest.mjs +1754 -0
- package/client/fesm2015/ng2-rest.mjs.map +1 -0
- package/client/fesm2020/ng2-rest.mjs +1751 -0
- package/client/fesm2020/ng2-rest.mjs.map +1 -0
- package/client/{cookie.d.ts → lib/cookie.d.ts} +0 -0
- package/client/{helpers.d.ts → lib/helpers.d.ts} +0 -0
- package/client/{index.d.ts → lib/index.d.ts} +0 -0
- package/client/{mapping.d.ts → lib/mapping.d.ts} +0 -0
- package/{browser → client/lib}/models.d.ts +2 -3
- package/client/{params.d.ts → lib/params.d.ts} +0 -0
- package/client/{request-cache.d.ts → lib/request-cache.d.ts} +0 -0
- package/client/{resource.service.d.ts → lib/resource.service.d.ts} +1 -5
- package/client/{rest-headers.d.ts → lib/rest-headers.d.ts} +0 -0
- package/client/{rest-request.d.ts → lib/rest-request.d.ts} +0 -3
- package/client/{rest.class.d.ts → lib/rest.class.d.ts} +0 -1
- package/{simple-resource.d.ts → client/lib/simple-resource.d.ts} +1 -5
- package/client/ng2-rest.d.ts +5 -0
- package/client/package.json +25 -31
- package/client/public-api.d.ts +1 -0
- package/index.d.ts +1 -9
- package/index.js +3 -13
- package/index.js.map +1 -1
- package/{cookie.d.ts → lib/cookie.d.ts} +0 -0
- package/{cookie.js → lib/cookie.js} +2 -1
- package/lib/cookie.js.map +1 -0
- package/{helpers.d.ts → lib/helpers.d.ts} +0 -0
- package/{helpers.js → lib/helpers.js} +3 -2
- package/lib/helpers.js.map +1 -0
- package/{browser/index.js → lib/index.d.ts} +0 -1
- package/lib/index.js +17 -0
- package/lib/index.js.map +1 -0
- package/{mapping.d.ts → lib/mapping.d.ts} +0 -0
- package/{mapping.js → lib/mapping.js} +5 -4
- package/lib/mapping.js.map +1 -0
- package/{models.d.ts → lib/models.d.ts} +2 -3
- package/{models.js → lib/models.js} +6 -6
- package/lib/models.js.map +1 -0
- package/{params.d.ts → lib/params.d.ts} +0 -0
- package/{params.js → lib/params.js} +17 -16
- package/lib/params.js.map +1 -0
- package/{request-cache.d.ts → lib/request-cache.d.ts} +0 -0
- package/{request-cache.js → lib/request-cache.js} +2 -1
- package/lib/request-cache.js.map +1 -0
- package/{resource.service.d.ts → lib/resource.service.d.ts} +1 -5
- package/{resource.service.js → lib/resource.service.js} +33 -26
- package/lib/resource.service.js.map +1 -0
- package/{rest-headers.d.ts → lib/rest-headers.d.ts} +0 -0
- package/{rest-headers.js → lib/rest-headers.js} +2 -1
- package/lib/rest-headers.js.map +1 -0
- package/{browser → lib}/rest-request.d.ts +0 -3
- package/{rest-request.js → lib/rest-request.js} +19 -20
- package/lib/rest-request.js.map +1 -0
- package/{browser → lib}/rest.class.d.ts +0 -1
- package/{rest.class.js → lib/rest.class.js} +4 -5
- package/lib/rest.class.js.map +1 -0
- package/{client → lib}/simple-resource.d.ts +1 -5
- package/{simple-resource.js → lib/simple-resource.js} +11 -14
- package/lib/simple-resource.js.map +1 -0
- package/package.json +10 -10
- package/package.json_devDependencies.json +24 -24
- package/package.json_tnp.json +2 -1
- package/package.json_tnp.json5 +39 -0
- package/tmp-environment.json +85 -121
- package/browser/app.d.ts +0 -0
- package/browser/app.js +0 -31
- package/browser/app.js.map +0 -1
- package/browser/cookie.js +0 -27
- package/browser/cookie.js.map +0 -1
- package/browser/es5/app.js +0 -32
- package/browser/es5/cookie.js +0 -50
- package/browser/es5/helpers.js +0 -58
- package/browser/es5/index.js +0 -107
- package/browser/es5/mapping.js +0 -287
- package/browser/es5/models.js +0 -249
- package/browser/es5/params.js +0 -310
- package/browser/es5/request-cache.js +0 -133
- package/browser/es5/resource.service.js +0 -288
- package/browser/es5/rest-headers.js +0 -200
- package/browser/es5/rest-request.js +0 -423
- package/browser/es5/rest.class.js +0 -191
- package/browser/es5/simple-resource.js +0 -175
- package/browser/helpers.js +0 -22
- package/browser/helpers.js.map +0 -1
- package/browser/index.js.map +0 -1
- package/browser/mapping.js +0 -271
- package/browser/mapping.js.map +0 -1
- package/browser/models.js +0 -136
- package/browser/models.js.map +0 -1
- package/browser/params.js +0 -305
- package/browser/params.js.map +0 -1
- package/browser/request-cache.js +0 -95
- package/browser/request-cache.js.map +0 -1
- package/browser/resource.service.js +0 -249
- package/browser/resource.service.js.map +0 -1
- package/browser/rest-headers.js +0 -129
- package/browser/rest-headers.js.map +0 -1
- package/browser/rest-request.js +0 -316
- package/browser/rest-request.js.map +0 -1
- package/browser/rest.class.js +0 -116
- package/browser/rest.class.js.map +0 -1
- package/browser/simple-resource.js +0 -121
- package/browser/simple-resource.js.map +0 -1
- package/client/app.d.ts +0 -0
- package/client/app.js +0 -31
- package/client/app.js.map +0 -1
- package/client/cookie.js +0 -27
- package/client/cookie.js.map +0 -1
- package/client/es5/app.js +0 -32
- package/client/es5/cookie.js +0 -50
- package/client/es5/helpers.js +0 -58
- package/client/es5/index.js +0 -107
- package/client/es5/mapping.js +0 -287
- package/client/es5/models.js +0 -249
- package/client/es5/params.js +0 -310
- package/client/es5/request-cache.js +0 -133
- package/client/es5/resource.service.js +0 -288
- package/client/es5/rest-headers.js +0 -200
- package/client/es5/rest-request.js +0 -423
- package/client/es5/rest.class.js +0 -191
- package/client/es5/simple-resource.js +0 -175
- package/client/helpers.js +0 -22
- package/client/helpers.js.map +0 -1
- package/client/index.js +0 -10
- package/client/index.js.map +0 -1
- package/client/mapping.js +0 -271
- package/client/mapping.js.map +0 -1
- package/client/models.js +0 -136
- package/client/models.js.map +0 -1
- package/client/params.js +0 -305
- package/client/params.js.map +0 -1
- package/client/request-cache.js +0 -95
- package/client/request-cache.js.map +0 -1
- package/client/resource.service.js +0 -249
- package/client/resource.service.js.map +0 -1
- package/client/rest-headers.js +0 -129
- package/client/rest-headers.js.map +0 -1
- package/client/rest-request.js +0 -316
- package/client/rest-request.js.map +0 -1
- package/client/rest.class.js +0 -116
- package/client/rest.class.js.map +0 -1
- package/client/simple-resource.js +0 -121
- package/client/simple-resource.js.map +0 -1
- package/cookie.js.map +0 -1
- package/helpers.js.map +0 -1
- package/mapping.js.map +0 -1
- package/models.js.map +0 -1
- package/params.js.map +0 -1
- package/request-cache.js.map +0 -1
- package/resource.service.js.map +0 -1
- package/rest-headers.js.map +0 -1
- package/rest-request.js.map +0 -1
- package/rest.class.js.map +0 -1
- package/simple-resource.js.map +0 -1
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { Log, Level } from 'ng2-logger/browser';
|
|
3
|
+
const log = Log.create('resouce-service', Level.__NOTHING);
|
|
4
|
+
import { Rest } from './rest.class';
|
|
5
|
+
import { RestRequest } from './rest-request';
|
|
6
|
+
import { RestHeaders } from './rest-headers';
|
|
7
|
+
import { Cookie } from './cookie';
|
|
8
|
+
import { interpolateParamsToUrl, isValid, containsModels, getModels } from './params';
|
|
9
|
+
export class Resource {
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region constructor
|
|
12
|
+
constructor() {
|
|
13
|
+
setTimeout(() => {
|
|
14
|
+
const zone = this.getZone();
|
|
15
|
+
if (!RestRequest.zone) {
|
|
16
|
+
RestRequest.zone = zone;
|
|
17
|
+
}
|
|
18
|
+
;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static get listenErrors() {
|
|
22
|
+
return this._listenErrors.asObservable();
|
|
23
|
+
}
|
|
24
|
+
//#region private mthods and fields
|
|
25
|
+
getZone() {
|
|
26
|
+
const isNode = (typeof window === 'undefined');
|
|
27
|
+
if (isNode) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
;
|
|
31
|
+
const ng = window['ng'];
|
|
32
|
+
const getAllAngularRootElements = window['getAllAngularRootElements'];
|
|
33
|
+
if (!ng || !getAllAngularRootElements) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const probe = ng.probe;
|
|
37
|
+
const coreTokens = ng.coreTokens;
|
|
38
|
+
if (!coreTokens || !coreTokens.NgZone) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const zoneClass = coreTokens.NgZone;
|
|
42
|
+
if (!probe || typeof probe !== 'function' || !getAllAngularRootElements) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const angularElements = getAllAngularRootElements();
|
|
46
|
+
if (!Array.isArray(angularElements) || angularElements.length === 0) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const rootElement = ng.probe(angularElements[0]);
|
|
50
|
+
if (!rootElement) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const injector = rootElement.injector;
|
|
54
|
+
if (!injector || !injector.get || typeof injector.get !== 'function') {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const zone = injector.get(zoneClass);
|
|
58
|
+
return zone;
|
|
59
|
+
}
|
|
60
|
+
static initAngularNgZone(zone) {
|
|
61
|
+
RestRequest.zone = zone;
|
|
62
|
+
}
|
|
63
|
+
checkNestedModels(model, allModels) {
|
|
64
|
+
// if (model.indexOf('/') !== -1) { //TODO make this better, becouse now I unecesary checking shit
|
|
65
|
+
for (let p in allModels) {
|
|
66
|
+
if (allModels.hasOwnProperty(p)) {
|
|
67
|
+
let m = allModels[p];
|
|
68
|
+
if (isValid(p)) {
|
|
69
|
+
let urlModels = getModels(p);
|
|
70
|
+
if (containsModels(model, urlModels)) {
|
|
71
|
+
model = p;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// }
|
|
78
|
+
return model;
|
|
79
|
+
}
|
|
80
|
+
static getModel(endpoint, model) {
|
|
81
|
+
model = Resource.prepareModel(model);
|
|
82
|
+
const e = Resource.endpoints[endpoint];
|
|
83
|
+
if (!e) {
|
|
84
|
+
return void 0;
|
|
85
|
+
}
|
|
86
|
+
const r = Resource.endpoints[endpoint].models[model];
|
|
87
|
+
return Resource.endpoints[endpoint].models[model];
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region create
|
|
91
|
+
static create(e, model, entityMapping, circular) {
|
|
92
|
+
const badRestRegEX = new RegExp('((\/:)[a-z]+)+', 'g');
|
|
93
|
+
const matchArr = model.match(badRestRegEX) || [];
|
|
94
|
+
const badModelsNextToEachOther = matchArr.join();
|
|
95
|
+
const atleas2DoubleDots = ((badModelsNextToEachOther.match(new RegExp(':', 'g')) || []).length >= 2);
|
|
96
|
+
if (atleas2DoubleDots && model.search(badModelsNextToEachOther) !== -1) {
|
|
97
|
+
throw new Error(`
|
|
98
|
+
|
|
99
|
+
Bad rest model: ${model}
|
|
100
|
+
|
|
101
|
+
Do not create rest models like this: /book/author/:bookid/:authorid
|
|
102
|
+
Instead use nested approach: /book/:bookid/author/:authorid
|
|
103
|
+
`);
|
|
104
|
+
}
|
|
105
|
+
;
|
|
106
|
+
Resource.map(e, e);
|
|
107
|
+
Resource.instance.add(e, model ? model : '', entityMapping, circular);
|
|
108
|
+
// if (model.charAt(model.length - 1) !== '/') model = `${model}/`;
|
|
109
|
+
return {
|
|
110
|
+
model: (params) => Resource.instance.api(e, interpolateParamsToUrl(params, model)),
|
|
111
|
+
replay: (method) => {
|
|
112
|
+
Resource.getModel(e, model).replay(method);
|
|
113
|
+
},
|
|
114
|
+
get headers() {
|
|
115
|
+
return Resource.getModel(e, model).headers;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
//#region reset
|
|
121
|
+
static reset() {
|
|
122
|
+
Resource.endpoints = {};
|
|
123
|
+
}
|
|
124
|
+
//#region map
|
|
125
|
+
static map(endpoint, url) {
|
|
126
|
+
log.i('url', url);
|
|
127
|
+
let regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
|
|
128
|
+
let e = endpoint;
|
|
129
|
+
if (!regex.test(url)) {
|
|
130
|
+
throw `Url address is not correct: ${url}`;
|
|
131
|
+
}
|
|
132
|
+
if (url.charAt(url.length - 1) === '/')
|
|
133
|
+
url = url.slice(0, url.length - 1);
|
|
134
|
+
log.i('url after', url);
|
|
135
|
+
if (Resource.endpoints[e] !== void 0) {
|
|
136
|
+
!global.hideLog && console.warn('Cannot use map function at the same API endpoint again ('
|
|
137
|
+
+ Resource.endpoints[e].url + ')');
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
Resource.endpoints[e] = {
|
|
141
|
+
url: url,
|
|
142
|
+
models: {},
|
|
143
|
+
entity: null
|
|
144
|
+
};
|
|
145
|
+
log.i('enpoints', Resource.endpoints);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
//#endregion
|
|
149
|
+
static prepareModel(model) {
|
|
150
|
+
if (model.charAt(model.length - 1) === '/')
|
|
151
|
+
model = model.slice(0, model.length - 1);
|
|
152
|
+
if (model.charAt(0) === '/')
|
|
153
|
+
model = model.slice(1, model.length);
|
|
154
|
+
return model;
|
|
155
|
+
}
|
|
156
|
+
//#region add
|
|
157
|
+
/**
|
|
158
|
+
* And enipoint to application
|
|
159
|
+
*
|
|
160
|
+
* @param {E} endpoint
|
|
161
|
+
* @param {string} model
|
|
162
|
+
* @returns {boolean}
|
|
163
|
+
*/
|
|
164
|
+
add(endpoint, model, entity, circular) {
|
|
165
|
+
log.i(`I am maping ${model} on ${endpoint}`);
|
|
166
|
+
model = Resource.prepareModel(model);
|
|
167
|
+
let e;
|
|
168
|
+
e = (endpoint).toString();
|
|
169
|
+
if (Resource.endpoints[e] === void 0) {
|
|
170
|
+
console.error('Endpoint is not mapped ! Cannot add model ' + model);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (Resource.endpoints[e].models[model] !== void 0) {
|
|
174
|
+
if (Resource.enableWarnings)
|
|
175
|
+
console.warn(`Model '${model}' is already defined in endpoint: `
|
|
176
|
+
+ Resource.endpoints[e].url);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
Resource.endpoints[e].models[model] =
|
|
180
|
+
new Rest(Resource.endpoints[e].url
|
|
181
|
+
+ '/' + model, Resource.request, {
|
|
182
|
+
endpoint: e,
|
|
183
|
+
path: model,
|
|
184
|
+
entity,
|
|
185
|
+
circular
|
|
186
|
+
});
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region api
|
|
191
|
+
/**
|
|
192
|
+
* Access api throught endpoint
|
|
193
|
+
*
|
|
194
|
+
* @param {E} endpoint
|
|
195
|
+
* @param {string} model
|
|
196
|
+
* @returns {Rest<T, TA>}
|
|
197
|
+
*/
|
|
198
|
+
api(endpoint, model) {
|
|
199
|
+
// log.i(`[api]
|
|
200
|
+
// creating for endpoint: "${endpoint}"
|
|
201
|
+
// model: "${model}"
|
|
202
|
+
// `)
|
|
203
|
+
if (model.charAt(0) === '/')
|
|
204
|
+
model = model.slice(1, model.length);
|
|
205
|
+
let e = (endpoint).toString();
|
|
206
|
+
if (Resource.endpoints[e] === void 0) {
|
|
207
|
+
throw `Endpoint: ${endpoint} is not mapped ! Cannot add model: ${model}`;
|
|
208
|
+
}
|
|
209
|
+
let allModels = Resource.endpoints[e].models;
|
|
210
|
+
let orgModel = model;
|
|
211
|
+
model = this.checkNestedModels(model, allModels);
|
|
212
|
+
if (Resource.endpoints[e].models[model] === void 0) {
|
|
213
|
+
// log.d('Resource.endpoints', Resource.endpoints);
|
|
214
|
+
throw `Model '${model}' is undefined in endpoint: ${Resource.endpoints[e].url} `;
|
|
215
|
+
}
|
|
216
|
+
let res = Resource.endpoints[(endpoint).toString()].models[model];
|
|
217
|
+
// log.d(`
|
|
218
|
+
// orgModel: ${orgModel}
|
|
219
|
+
// model: ${model}
|
|
220
|
+
// `)
|
|
221
|
+
if (orgModel !== model) {
|
|
222
|
+
let baseUrl = Resource.endpoints[(endpoint).toString()].url;
|
|
223
|
+
// log.d('base', Resource.endpoints[<string>(endpoint).toString()])
|
|
224
|
+
// log.d('baseUrl', baseUrl)
|
|
225
|
+
// log.d('orgModel', orgModel)
|
|
226
|
+
res.__rest_endpoint = `${baseUrl}/${orgModel}`;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
res.__rest_endpoint = void 0;
|
|
230
|
+
}
|
|
231
|
+
;
|
|
232
|
+
// log.i(`Resource.endpoints`, Resource.endpoints)
|
|
233
|
+
return res;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
Resource.DEFAULT_HEADERS = RestHeaders.from({
|
|
237
|
+
'Content-Type': 'application/json',
|
|
238
|
+
'Accept': 'application/json'
|
|
239
|
+
});
|
|
240
|
+
Resource._listenErrors = new Subject();
|
|
241
|
+
Resource.enableWarnings = true;
|
|
242
|
+
Resource.instance = new Resource();
|
|
243
|
+
Resource.endpoints = {};
|
|
244
|
+
Resource.request = new RestRequest();
|
|
245
|
+
//#endregion
|
|
246
|
+
Resource.Cookies = Cookie.Instance;
|
|
247
|
+
// const res = Resource.create('')
|
|
248
|
+
// res.model()
|
|
249
|
+
// .mock({
|
|
250
|
+
// code: 500,
|
|
251
|
+
// data: {},
|
|
252
|
+
// isArray: true
|
|
253
|
+
// })
|
|
254
|
+
// .array.
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9yZXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUN0QyxLQUFLLENBQUMsU0FBUyxDQUNoQixDQUFBO0FBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBT3RGLE1BQU0sT0FBTyxRQUFRO0lBaUhuQixZQUFZO0lBRVoscUJBQXFCO0lBQ3JCO1FBQ0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtnQkFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTthQUFFO1lBQUEsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFqSE0sTUFBTSxLQUFLLFlBQVk7UUFDNUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFD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QUFHLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQzlCO1FBQUEsQ0FBQztRQUVGLGtEQUFrRDtRQUNsRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O0FBalBhLHdCQUFlLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztJQUMvQyxjQUFjLEVBQUUsa0JBQWtCO0lBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7Q0FDN0IsQ0FBQyxDQUFDO0FBRVksc0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUlwRCx1QkFBYyxHQUFZLElBQUksQ0FBQztBQStDOUIsaUJBQVEsR0FBRyxJQUFJLFFBQVEsRUFBb0IsQ0FBQztBQUM1QyxrQkFBUyxHQUFHLEVBQUUsQ0FBQztBQVFmLGdCQUFPLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7QUF1RHhELFlBQVk7QUFFRSxnQkFBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUE4SDFDLGtDQUFrQztBQUNsQyxjQUFjO0FBQ2QsWUFBWTtBQUNaLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEIsb0JBQW9CO0FBQ3BCLE9BQU87QUFDUCxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbi8vI3JlZ2lvbiBpbXBvcnRzXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2csIExldmVsIH0gZnJvbSAnbmcyLWxvZ2dlci9icm93c2VyJztcbmNvbnN0IGxvZyA9IExvZy5jcmVhdGUoJ3Jlc291Y2Utc2VydmljZScsXG4gIExldmVsLl9fTk9USElOR1xuKVxuXG5pbXBvcnQgeyBSZXN0IH0gZnJvbSAnLi9yZXN0LmNsYXNzJztcbmltcG9ydCB7IFJlc3RSZXF1ZXN0IH0gZnJvbSAnLi9yZXN0LXJlcXVlc3QnO1xuaW1wb3J0IHsgUmVzdEhlYWRlcnMgfSBmcm9tICcuL3Jlc3QtaGVhZGVycyc7XG5pbXBvcnQgeyBDb29raWUgfSBmcm9tICcuL2Nvb2tpZSc7XG5pbXBvcnQgeyBNYXBwaW5nIH0gZnJvbSAnLi9tYXBwaW5nJztcbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IGludGVycG9sYXRlUGFyYW1zVG9VcmwsIGlzVmFsaWQsIGNvbnRhaW5zTW9kZWxzLCBnZXRNb2RlbHMgfSBmcm9tICcuL3BhcmFtcyc7XG5pbXBvcnQgeyBDaXJjIH0gZnJvbSAnanNvbjEwL2Jyb3dzZXInO1xuLy8jZW5kcmVnaW9uXG5cbmRlY2xhcmUgY29uc3QgZ2xvYmFsOiBhbnk7XG5cblxuZXhwb3J0IGNsYXNzIFJlc291cmNlPEUsIFQsIFRBPiB7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0hFQURFUlMgPSBSZXN0SGVhZGVycy5mcm9tKHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbidcbiAgfSk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2xpc3RlbkVycm9ycyA9IG5ldyBTdWJqZWN0PE1vZGVscy5CYWNrZW5kRXJyb3I+KCk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGxpc3RlbkVycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdGVuRXJyb3JzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZW5hYmxlV2FybmluZ3M6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG10aG9kcyBhbmQgZmllbGRzXG4gIHByaXZhdGUgZ2V0Wm9uZSgpIHtcbiAgICBjb25zdCBpc05vZGUgPSAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgaWYgKGlzTm9kZSkgeyByZXR1cm4gfTtcbiAgICBjb25zdCBuZyA9IHdpbmRvd1snbmcnXTtcbiAgICBjb25zdCBnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzID0gd2luZG93WydnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzJ107XG4gICAgaWYgKCFuZyB8fCAhZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cykgeyByZXR1cm47IH1cbiAgICBjb25zdCBwcm9iZSA9IG5nLnByb2JlO1xuICAgIGNvbnN0IGNvcmVUb2tlbnMgPSBuZy5jb3JlVG9rZW5zO1xuICAgIGlmICghY29yZVRva2VucyB8fCAhY29yZVRva2Vucy5OZ1pvbmUpIHsgcmV0dXJuOyB9XG4gICAgY29uc3Qgem9uZUNsYXNzID0gY29yZVRva2Vucy5OZ1pvbmU7XG4gICAgaWYgKCFwcm9iZSB8fCB0eXBlb2YgcHJvYmUgIT09ICdmdW5jdGlvbicgfHwgIWdldEFsbEFuZ3VsYXJSb290RWxlbWVudHMpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgYW5ndWxhckVsZW1lbnRzOiBhbnlbXSA9IGdldEFsbEFuZ3VsYXJSb290RWxlbWVudHMoKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYW5ndWxhckVsZW1lbnRzKSB8fCBhbmd1bGFyRWxlbWVudHMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gbmcucHJvYmUoYW5ndWxhckVsZW1lbnRzWzBdKTtcbiAgICBpZiAoIXJvb3RFbGVtZW50KSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGluamVjdG9yID0gcm9vdEVsZW1lbnQuaW5qZWN0b3I7XG4gICAgaWYgKCFpbmplY3RvciB8fCAhaW5qZWN0b3IuZ2V0IHx8IHR5cGVvZiBpbmplY3Rvci5nZXQgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuOyB9XG4gICAgY29uc3Qgem9uZSA9IGluamVjdG9yLmdldCh6b25lQ2xhc3MpXG4gICAgcmV0dXJuIHpvbmU7XG4gIH1cblxuXG4gIHB1YmxpYyBzdGF0aWMgaW5pdEFuZ3VsYXJOZ1pvbmUoem9uZSkge1xuICAgIFJlc3RSZXF1ZXN0LnpvbmUgPSB6b25lO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja05lc3RlZE1vZGVscyhtb2RlbDogc3RyaW5nLCBhbGxNb2RlbHM6IE9iamVjdCkge1xuICAgIC8vIGlmIChtb2RlbC5pbmRleE9mKCcvJykgIT09IC0xKSB7IC8vVE9ETyBtYWtlIHRoaXMgYmV0dGVyLCBiZWNvdXNlIG5vdyBJIHVuZWNlc2FyeSBjaGVja2luZyBzaGl0XG4gICAgZm9yIChsZXQgcCBpbiBhbGxNb2RlbHMpIHtcbiAgICAgIGlmIChhbGxNb2RlbHMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgbGV0IG0gPSBhbGxNb2RlbHNbcF07XG4gICAgICAgIGlmIChpc1ZhbGlkKHApKSB7XG4gICAgICAgICAgbGV0IHVybE1vZGVscyA9IGdldE1vZGVscyhwKTtcbiAgICAgICAgICBpZiAoY29udGFpbnNNb2RlbHMobW9kZWwsIHVybE1vZGVscykpIHtcbiAgICAgICAgICAgIG1vZGVsID0gcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2UgPSBuZXcgUmVzb3VyY2U8c3RyaW5nLCBhbnksIGFueT4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgZW5kcG9pbnRzID0ge307XG4gIHB1YmxpYyBzdGF0aWMgZ2V0TW9kZWwoZW5kcG9pbnQ6IHN0cmluZywgbW9kZWw6IHN0cmluZyk6IFJlc3Q8YW55PiB7XG4gICAgbW9kZWwgPSBSZXNvdXJjZS5wcmVwYXJlTW9kZWwobW9kZWwpO1xuICAgIGNvbnN0IGUgPSBSZXNvdXJjZS5lbmRwb2ludHNbZW5kcG9pbnRdO1xuICAgIGlmICghZSkgeyByZXR1cm4gdm9pZCAwOyB9XG4gICAgY29uc3QgciA9IFJlc291cmNlLmVuZHBvaW50c1tlbmRwb2ludF0ubW9kZWxzW21vZGVsXTtcbiAgICByZXR1cm4gUmVzb3VyY2UuZW5kcG9pbnRzW2VuZHBvaW50XS5tb2RlbHNbbW9kZWxdO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIHJlcXVlc3Q6IFJlc3RSZXF1ZXN0ID0gbmV3IFJlc3RSZXF1ZXN0KCk7XG4gIC8vI2VuZHJlZ2lvblxuXG5cbiAgLy8jcmVnaW9uIGNyZWF0ZVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxBLCBUQSA9IEFbXT4oXG4gICAgZTogc3RyaW5nLFxuICAgIG1vZGVsPzogc3RyaW5nLFxuICAgIGVudGl0eU1hcHBpbmc/OiBNYXBwaW5nLk1hcHBpbmcsXG4gICAgY2lyY3VsYXI/OiBDaXJjW11cbiAgKTogTW9kZWxzLlJlc291cmNlTW9kZWw8QSwgVEE+IHtcbiAgICBjb25zdCBiYWRSZXN0UmVnRVggPSBuZXcgUmVnRXhwKCcoKFxcLzopW2Etel0rKSsnLCAnZycpO1xuICAgIGNvbnN0IG1hdGNoQXJyID0gbW9kZWwubWF0Y2goYmFkUmVzdFJlZ0VYKSB8fCBbXTtcbiAgICBjb25zdCBiYWRNb2RlbHNOZXh0VG9FYWNoT3RoZXIgPSBtYXRjaEFyci5qb2luKCk7XG4gICAgY29uc3QgYXRsZWFzMkRvdWJsZURvdHMgPSAoKGJhZE1vZGVsc05leHRUb0VhY2hPdGhlci5tYXRjaChuZXcgUmVnRXhwKCc6JywgJ2cnKSkgfHwgW10pLmxlbmd0aCA+PSAyKTtcbiAgICBpZiAoYXRsZWFzMkRvdWJsZURvdHMgJiYgbW9kZWwuc2VhcmNoKGJhZE1vZGVsc05leHRUb0VhY2hPdGhlcikgIT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuXG5CYWQgcmVzdCBtb2RlbDogJHttb2RlbH1cblxuRG8gbm90IGNyZWF0ZSByZXN0IG1vZGVscyBsaWtlIHRoaXM6ICAgIC9ib29rL2F1dGhvci86Ym9va2lkLzphdXRob3JpZFxuSW5zdGVhZCB1c2UgbmVzdGVkIGFwcHJvYWNoOiAgICAgICAgICAgIC9ib29rLzpib29raWQvYXV0aG9yLzphdXRob3JpZFxuICAgICAgICAgICAgYClcbiAgICB9O1xuICAgIFJlc291cmNlLm1hcChlLCBlKTtcbiAgICBSZXNvdXJjZS5pbnN0YW5jZS5hZGQoZSwgbW9kZWwgPyBtb2RlbCA6ICcnLCBlbnRpdHlNYXBwaW5nLCBjaXJjdWxhcik7XG4gICAgLy8gaWYgKG1vZGVsLmNoYXJBdChtb2RlbC5sZW5ndGggLSAxKSAhPT0gJy8nKSBtb2RlbCA9IGAke21vZGVsfS9gO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbDogKHBhcmFtcz86IE9iamVjdCkgPT4gUmVzb3VyY2UuaW5zdGFuY2UuYXBpKFxuICAgICAgICBlLFxuICAgICAgICBpbnRlcnBvbGF0ZVBhcmFtc1RvVXJsKHBhcmFtcywgbW9kZWwpXG4gICAgICApLFxuICAgICAgcmVwbGF5OiAobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCkgPT4ge1xuICAgICAgICBSZXNvdXJjZS5nZXRNb2RlbChlLCBtb2RlbCkucmVwbGF5KG1ldGhvZCk7XG4gICAgICB9LFxuICAgICAgZ2V0IGhlYWRlcnMoKSB7XG4gICAgICAgIHJldHVybiBSZXNvdXJjZS5nZXRNb2RlbChlLCBtb2RlbCkuaGVhZGVycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIHJlc2V0XG4gIHB1YmxpYyBzdGF0aWMgcmVzZXQoKSB7XG4gICAgUmVzb3VyY2UuZW5kcG9pbnRzID0ge307XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIGNvbnN0cnVjdG9yXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB6b25lID0gdGhpcy5nZXRab25lKCk7XG4gICAgICBpZiAoIVJlc3RSZXF1ZXN0LnpvbmUpIHsgUmVzdFJlcXVlc3Quem9uZSA9IHpvbmUgfTtcbiAgICB9KVxuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHB1YmxpYyBzdGF0aWMgQ29va2llcyA9IENvb2tpZS5JbnN0YW5jZTtcblxuICAvLyNyZWdpb24gbWFwXG4gIHByaXZhdGUgc3RhdGljIG1hcChlbmRwb2ludDogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgbG9nLmkoJ3VybCcsIHVybClcbiAgICBsZXQgcmVnZXggPSAvKGh0dHB8aHR0cHMpOlxcL1xcLyhcXHcrOnswLDF9XFx3Kik/KFxcUyspKDpbMC05XSspPyhcXC98XFwvKFtcXHcjITouPys9JiUhXFwtXFwvXSkpPy87XG4gICAgbGV0IGUgPSBlbmRwb2ludDtcbiAgICBpZiAoIXJlZ2V4LnRlc3QodXJsKSkge1xuICAgICAgdGhyb3cgYFVybCBhZGRyZXNzIGlzIG5vdCBjb3JyZWN0OiAke3VybH1gO1xuICAgIH1cbiAgICBpZiAodXJsLmNoYXJBdCh1cmwubGVuZ3RoIC0gMSkgPT09ICcvJykgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSAxKTtcbiAgICBsb2cuaSgndXJsIGFmdGVyJywgdXJsKVxuICAgIGlmIChSZXNvdXJjZS5lbmRwb2ludHNbZV0gIT09IHZvaWQgMCkge1xuICAgICAgIWdsb2JhbC5oaWRlTG9nICYmIGNvbnNvbGUud2FybignQ2Fubm90IHVzZSBtYXAgZnVuY3Rpb24gYXQgdGhlIHNhbWUgQVBJIGVuZHBvaW50IGFnYWluICgnXG4gICAgICAgICsgUmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybCArICcpJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFJlc291cmNlLmVuZHBvaW50c1tlXSA9IHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgbW9kZWxzOiB7fSxcbiAgICAgIGVudGl0eTogbnVsbFxuICAgIH07XG4gICAgbG9nLmkoJ2VucG9pbnRzJywgUmVzb3VyY2UuZW5kcG9pbnRzKVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHByaXZhdGUgc3RhdGljIHByZXBhcmVNb2RlbChtb2RlbCkge1xuICAgIGlmIChtb2RlbC5jaGFyQXQobW9kZWwubGVuZ3RoIC0gMSkgPT09ICcvJykgbW9kZWwgPSBtb2RlbC5zbGljZSgwLCBtb2RlbC5sZW5ndGggLSAxKTtcbiAgICBpZiAobW9kZWwuY2hhckF0KDApID09PSAnLycpIG1vZGVsID0gbW9kZWwuc2xpY2UoMSwgbW9kZWwubGVuZ3RoKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuXG4gIC8vI3JlZ2lvbiBhZGRcbiAgLyoqXG4gICAqIEFuZCBlbmlwb2ludCB0byBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0V9IGVuZHBvaW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHByaXZhdGUgYWRkKGVuZHBvaW50OiBFLCBtb2RlbDogc3RyaW5nLCBlbnRpdHk6IE1hcHBpbmcuTWFwcGluZywgY2lyY3VsYXI/OiBDaXJjW10pIHtcbiAgICBsb2cuaShgSSBhbSBtYXBpbmcgJHttb2RlbH0gb24gJHs8YW55PmVuZHBvaW50fWApO1xuICAgIG1vZGVsID0gUmVzb3VyY2UucHJlcGFyZU1vZGVsKG1vZGVsKTtcblxuICAgIGxldCBlOiBzdHJpbmc7XG4gICAgZSA9IDxzdHJpbmc+KGVuZHBvaW50KS50b1N0cmluZygpO1xuXG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFbmRwb2ludCBpcyBub3QgbWFwcGVkICEgQ2Fubm90IGFkZCBtb2RlbCAnICsgbW9kZWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoUmVzb3VyY2UuZW5kcG9pbnRzW2VdLm1vZGVsc1ttb2RlbF0gIT09IHZvaWQgMCkge1xuICAgICAgaWYgKFJlc291cmNlLmVuYWJsZVdhcm5pbmdzKSBjb25zb2xlLndhcm4oYE1vZGVsICcke21vZGVsfScgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGVuZHBvaW50OiBgXG4gICAgICAgICsgUmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFJlc291cmNlLmVuZHBvaW50c1tlXS5tb2RlbHNbbW9kZWxdID1cbiAgICAgIG5ldyBSZXN0PFQsIFRBPihSZXNvdXJjZS5lbmRwb2ludHNbZV0udXJsXG4gICAgICAgICsgJy8nICsgbW9kZWwsIFJlc291cmNlLnJlcXVlc3QsIHtcbiAgICAgICAgZW5kcG9pbnQ6IGUsXG4gICAgICAgIHBhdGg6IG1vZGVsLFxuICAgICAgICBlbnRpdHksXG4gICAgICAgIGNpcmN1bGFyXG4gICAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIGFwaVxuICAvKipcbiAgICogQWNjZXNzIGFwaSB0aHJvdWdodCBlbmRwb2ludFxuICAgKlxuICAgKiBAcGFyYW0ge0V9IGVuZHBvaW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFxuICAgKiBAcmV0dXJucyB7UmVzdDxULCBUQT59XG4gICAqL1xuICBwcml2YXRlIGFwaShlbmRwb2ludDogRSwgbW9kZWw6IHN0cmluZyk6IFJlc3Q8VCwgVEE+IHtcbiAgICAvLyBsb2cuaShgW2FwaV1cblxuICAgIC8vIGNyZWF0aW5nIGZvciBlbmRwb2ludDogXCIke2VuZHBvaW50fVwiXG4gICAgLy8gbW9kZWw6IFwiJHttb2RlbH1cIlxuXG4gICAgLy8gYClcbiAgICBpZiAobW9kZWwuY2hhckF0KDApID09PSAnLycpIG1vZGVsID0gbW9kZWwuc2xpY2UoMSwgbW9kZWwubGVuZ3RoKTtcbiAgICBsZXQgZSA9IDxzdHJpbmc+KGVuZHBvaW50KS50b1N0cmluZygpO1xuICAgIGlmIChSZXNvdXJjZS5lbmRwb2ludHNbZV0gPT09IHZvaWQgMCkge1xuICAgICAgdGhyb3cgYEVuZHBvaW50OiAkezxhbnk+ZW5kcG9pbnR9IGlzIG5vdCBtYXBwZWQgISBDYW5ub3QgYWRkIG1vZGVsOiAke21vZGVsfWA7XG4gICAgfVxuICAgIGxldCBhbGxNb2RlbHM6IE9iamVjdCA9IFJlc291cmNlLmVuZHBvaW50c1tlXS5tb2RlbHM7XG4gICAgbGV0IG9yZ01vZGVsID0gbW9kZWw7XG4gICAgbW9kZWwgPSB0aGlzLmNoZWNrTmVzdGVkTW9kZWxzKG1vZGVsLCBhbGxNb2RlbHMpO1xuXG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXS5tb2RlbHNbbW9kZWxdID09PSB2b2lkIDApIHtcbiAgICAgIC8vIGxvZy5kKCdSZXNvdXJjZS5lbmRwb2ludHMnLCBSZXNvdXJjZS5lbmRwb2ludHMpO1xuICAgICAgdGhyb3cgYE1vZGVsICcke21vZGVsfScgaXMgdW5kZWZpbmVkIGluIGVuZHBvaW50OiAke1Jlc291cmNlLmVuZHBvaW50c1tlXS51cmx9IGA7XG4gICAgfVxuXG4gICAgbGV0IHJlczogUmVzdDxULCBUQT4gPSBSZXNvdXJjZS5lbmRwb2ludHNbPHN0cmluZz4oZW5kcG9pbnQpLnRvU3RyaW5nKCldLm1vZGVsc1ttb2RlbF07XG5cbiAgICAvLyBsb2cuZChgXG4gICAgLy8gb3JnTW9kZWw6ICR7b3JnTW9kZWx9XG4gICAgLy8gbW9kZWw6ICR7bW9kZWx9XG5cbiAgICAvLyBgKVxuICAgIGlmIChvcmdNb2RlbCAhPT0gbW9kZWwpIHtcbiAgICAgIGxldCBiYXNlVXJsID0gUmVzb3VyY2UuZW5kcG9pbnRzWzxzdHJpbmc+KGVuZHBvaW50KS50b1N0cmluZygpXS51cmw7XG4gICAgICAvLyBsb2cuZCgnYmFzZScsIFJlc291cmNlLmVuZHBvaW50c1s8c3RyaW5nPihlbmRwb2ludCkudG9TdHJpbmcoKV0pXG4gICAgICAvLyBsb2cuZCgnYmFzZVVybCcsIGJhc2VVcmwpXG4gICAgICAvLyBsb2cuZCgnb3JnTW9kZWwnLCBvcmdNb2RlbClcbiAgICAgIHJlcy5fX3Jlc3RfZW5kcG9pbnQgPSBgJHtiYXNlVXJsfS8ke29yZ01vZGVsfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5fX3Jlc3RfZW5kcG9pbnQgPSB2b2lkIDA7XG4gICAgfTtcblxuICAgIC8vIGxvZy5pKGBSZXNvdXJjZS5lbmRwb2ludHNgLCBSZXNvdXJjZS5lbmRwb2ludHMpXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvLyNlbmRyZWdpb25cblxufVxuXG5cblxuLy8gY29uc3QgcmVzID0gUmVzb3VyY2UuY3JlYXRlKCcnKVxuLy8gcmVzLm1vZGVsKClcbi8vICAgLm1vY2soe1xuLy8gICAgIGNvZGU6IDUwMCxcbi8vICAgICBkYXRhOiB7fSxcbi8vICAgICBpc0FycmF5OiB0cnVlXG4vLyAgIH0pXG4vLyAgIC5hcnJheS5cbiJdfQ==
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
export class RestHeaders {
|
|
2
|
+
constructor(headers) {
|
|
3
|
+
/** @internal header names are lower case */
|
|
4
|
+
this._headers = new Map();
|
|
5
|
+
/** @internal map lower case names to actual names */
|
|
6
|
+
this._normalizedNames = new Map();
|
|
7
|
+
if (headers instanceof RestHeaders) {
|
|
8
|
+
headers.forEach((values, name) => {
|
|
9
|
+
values.forEach(value => this.set(name, value));
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
Object.keys(headers).forEach((name) => {
|
|
14
|
+
const values = (Array.isArray(headers[name]) ? headers[name] : [headers[name]]);
|
|
15
|
+
this.delete(name);
|
|
16
|
+
values.forEach(value => this.set(name, value));
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
static from(headers) {
|
|
21
|
+
if (!headers) {
|
|
22
|
+
return void 0;
|
|
23
|
+
}
|
|
24
|
+
return new RestHeaders(headers);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns a new RestHeaders instance from the given DOMString of Response RestHeaders
|
|
28
|
+
*/
|
|
29
|
+
static fromResponseHeaderString(headersString) {
|
|
30
|
+
const headers = new RestHeaders();
|
|
31
|
+
headersString.split('\n').forEach(line => {
|
|
32
|
+
const index = line.indexOf(':');
|
|
33
|
+
if (index > 0) {
|
|
34
|
+
const name = line.slice(0, index);
|
|
35
|
+
const value = line.slice(index + 1).trim();
|
|
36
|
+
headers.set(name, value);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return headers;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Appends a header to existing list of header values for a given header name.
|
|
43
|
+
*/
|
|
44
|
+
append(name, value) {
|
|
45
|
+
const values = this.getAll(name);
|
|
46
|
+
if (values === null) {
|
|
47
|
+
this.set(name, value);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
values.push(value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Deletes all header values for the given name.
|
|
55
|
+
*/
|
|
56
|
+
delete(name) {
|
|
57
|
+
const lcName = name.toLowerCase();
|
|
58
|
+
this._normalizedNames.delete(lcName);
|
|
59
|
+
this._headers.delete(lcName);
|
|
60
|
+
}
|
|
61
|
+
forEach(fn) {
|
|
62
|
+
this._headers.forEach((values, lcName) => fn(values, this._normalizedNames.get(lcName), this._headers));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns first header that matches given name.
|
|
66
|
+
*/
|
|
67
|
+
get(name) {
|
|
68
|
+
const values = this.getAll(name);
|
|
69
|
+
if (values === null) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return values.length > 0 ? values[0] : null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Checks for existence of header by given name.
|
|
76
|
+
*/
|
|
77
|
+
has(name) { return this._headers.has(name.toLowerCase()); }
|
|
78
|
+
/**
|
|
79
|
+
* Returns the names of the headers
|
|
80
|
+
*/
|
|
81
|
+
keys() { return Array.from(this._normalizedNames.values()); }
|
|
82
|
+
/**
|
|
83
|
+
* Sets or overrides header value for given name.
|
|
84
|
+
*/
|
|
85
|
+
set(name, value) {
|
|
86
|
+
if (Array.isArray(value)) {
|
|
87
|
+
if (value.length) {
|
|
88
|
+
this._headers.set(name.toLowerCase(), [value.join(',')]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this._headers.set(name.toLowerCase(), [value]);
|
|
93
|
+
}
|
|
94
|
+
this.mayBeSetNormalizedName(name);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Returns values of all headers.
|
|
98
|
+
*/
|
|
99
|
+
values() { return Array.from(this._headers.values()); }
|
|
100
|
+
/**
|
|
101
|
+
* Returns string of all headers.
|
|
102
|
+
*/
|
|
103
|
+
// TODO(vicb): returns {[name: string]: string[]}
|
|
104
|
+
toJSON() {
|
|
105
|
+
const serialized = {};
|
|
106
|
+
if (!this._headers) {
|
|
107
|
+
debugger;
|
|
108
|
+
}
|
|
109
|
+
this._headers.forEach((values, name) => {
|
|
110
|
+
const split = [];
|
|
111
|
+
values.forEach(v => split.push(...v.split(',')));
|
|
112
|
+
serialized[this._normalizedNames.get(name)] = split;
|
|
113
|
+
});
|
|
114
|
+
return serialized;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Returns list of header values for a given name.
|
|
118
|
+
*/
|
|
119
|
+
getAll(name) {
|
|
120
|
+
return this.has(name) ? this._headers.get(name.toLowerCase()) : null;
|
|
121
|
+
}
|
|
122
|
+
mayBeSetNormalizedName(name) {
|
|
123
|
+
const lcName = name.toLowerCase();
|
|
124
|
+
if (!this._normalizedNames.has(lcName)) {
|
|
125
|
+
this._normalizedNames.set(lcName, name);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1oZWFkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS9uZzItcmVzdC9wcm9qZWN0cy9uZzItcmVzdC9zcmMvbGliL3Jlc3QtaGVhZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLE9BQU8sV0FBVztJQWN0QixZQUFvQixPQUErRDtRQWJuRiw0Q0FBNEM7UUFDNUMsYUFBUSxHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVDLHFEQUFxRDtRQUNyRCxxQkFBZ0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQVdoRCxJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUU7WUFDbEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQWdCLEVBQUUsSUFBWSxFQUFFLEVBQUU7Z0JBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7Z0JBQzVDLE1BQU0sTUFBTSxHQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFRLENBQUM7Z0JBQ2pHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFD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QUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLElBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxJQUFZO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIlxuXG4vKipcbiAqIEJhc2VkIG9uIEhlYWRlcnMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2h0dHAvc3JjL2hlYWRlcnMudHNcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdEhlYWRlcnNPcHRpb25zID0gUmVzdEhlYWRlcnMgfCB7IFtuYW1lOiBzdHJpbmddOiAoc3RyaW5nIHwgc3RyaW5nW10pIH1cblxuZXhwb3J0IGNsYXNzIFJlc3RIZWFkZXJzIHtcbiAgLyoqIEBpbnRlcm5hbCBoZWFkZXIgbmFtZXMgYXJlIGxvd2VyIGNhc2UgKi9cbiAgX2hlYWRlcnM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiA9IG5ldyBNYXAoKTtcbiAgLyoqIEBpbnRlcm5hbCBtYXAgbG93ZXIgY2FzZSBuYW1lcyB0byBhY3R1YWwgbmFtZXMgKi9cbiAgX25vcm1hbGl6ZWROYW1lczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcblxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbShoZWFkZXJzPzogUmVzdEhlYWRlcnNPcHRpb25zKSB7XG4gICAgaWYgKCFoZWFkZXJzKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlc3RIZWFkZXJzKGhlYWRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihoZWFkZXJzPzogUmVzdEhlYWRlcnMgfCB7IFtuYW1lOiBzdHJpbmddOiAoc3RyaW5nIHwgc3RyaW5nW10pIH0pIHtcbiAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIFJlc3RIZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goKHZhbHVlczogc3RyaW5nW10sIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB0aGlzLnNldChuYW1lLCB2YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gKEFycmF5LmlzQXJyYXkoaGVhZGVyc1tuYW1lXSkgPyBoZWFkZXJzW25hbWVdIDogW2hlYWRlcnNbbmFtZV1dKSBhcyBhbnk7XG4gICAgICAgIHRoaXMuZGVsZXRlKG5hbWUpO1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB0aGlzLnNldChuYW1lLCB2YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgUmVzdEhlYWRlcnMgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gRE9NU3RyaW5nIG9mIFJlc3BvbnNlIFJlc3RIZWFkZXJzXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nKGhlYWRlcnNTdHJpbmc6IHN0cmluZyk6IFJlc3RIZWFkZXJzIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IFJlc3RIZWFkZXJzKCk7XG5cbiAgICBoZWFkZXJzU3RyaW5nLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGxpbmUuc2xpY2UoaW5kZXggKyAxKS50cmltKCk7XG4gICAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBoZWFkZXIgdG8gZXhpc3RpbmcgbGlzdCBvZiBoZWFkZXIgdmFsdWVzIGZvciBhIGdpdmVuIGhlYWRlciBuYW1lLlxuICAgKi9cbiAgYXBwZW5kKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlcyA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGhlYWRlciB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgZGVsZXRlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGxjTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLl9ub3JtYWxpemVkTmFtZXMuZGVsZXRlKGxjTmFtZSk7XG4gICAgdGhpcy5faGVhZGVycy5kZWxldGUobGNOYW1lKTtcbiAgfVxuXG4gIGZvckVhY2goZm46ICh2YWx1ZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGhlYWRlcnM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2hlYWRlcnMuZm9yRWFjaChcbiAgICAgICh2YWx1ZXMsIGxjTmFtZSkgPT4gZm4odmFsdWVzLCB0aGlzLl9ub3JtYWxpemVkTmFtZXMuZ2V0KGxjTmFtZSksIHRoaXMuX2hlYWRlcnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZpcnN0IGhlYWRlciB0aGF0IG1hdGNoZXMgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIGV4aXN0ZW5jZSBvZiBoZWFkZXIgYnkgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlcnMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSk7IH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGhlYWRlcnNcbiAgICovXG4gIGtleXMoKTogc3RyaW5nW10geyByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9ub3JtYWxpemVkTmFtZXMudmFsdWVzKCkpOyB9XG5cbiAgLyoqXG4gICAqIFNldHMgb3Igb3ZlcnJpZGVzIGhlYWRlciB2YWx1ZSBmb3IgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9oZWFkZXJzLnNldChuYW1lLnRvTG93ZXJDYXNlKCksIFt2YWx1ZS5qb2luKCcsJyldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGVhZGVycy5zZXQobmFtZS50b0xvd2VyQ2FzZSgpLCBbdmFsdWVdKTtcbiAgICB9XG4gICAgdGhpcy5tYXlCZVNldE5vcm1hbGl6ZWROYW1lKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdmFsdWVzIG9mIGFsbCBoZWFkZXJzLlxuICAgKi9cbiAgdmFsdWVzKCk6IHN0cmluZ1tdW10geyByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9oZWFkZXJzLnZhbHVlcygpKTsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cmluZyBvZiBhbGwgaGVhZGVycy5cbiAgICovXG4gIC8vIFRPRE8odmljYik6IHJldHVybnMge1tuYW1lOiBzdHJpbmddOiBzdHJpbmdbXX1cbiAgdG9KU09OKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBzZXJpYWxpemVkOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgaWYgKCF0aGlzLl9oZWFkZXJzKSB7XG4gICAgICBkZWJ1Z2dlclxuICAgIH1cbiAgICB0aGlzLl9oZWFkZXJzLmZvckVhY2goKHZhbHVlczogc3RyaW5nW10sIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc3BsaXQ6IHN0cmluZ1tdID0gW107XG4gICAgICB2YWx1ZXMuZm9yRWFjaCh2ID0+IHNwbGl0LnB1c2goLi4udi5zcGxpdCgnLCcpKSk7XG4gICAgICBzZXJpYWxpemVkW3RoaXMuX25vcm1hbGl6ZWROYW1lcy5nZXQobmFtZSldID0gc3BsaXQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGxpc3Qgb2YgaGVhZGVyIHZhbHVlcyBmb3IgYSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgZ2V0QWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLl9oZWFkZXJzLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbWF5QmVTZXROb3JtYWxpemVkTmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBsY05hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXRoaXMuX25vcm1hbGl6ZWROYW1lcy5oYXMobGNOYW1lKSkge1xuICAgICAgdGhpcy5fbm9ybWFsaXplZE5hbWVzLnNldChsY05hbWUsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=
|