UNPKG

@kkoehn/ngx-resource-core

Version:
271 lines 37 kB
import { ResourceQueryMappingMethod, ResourceRequestBodyType } from './Declarations'; export class ResourceHelper { static isRunningInBrowser() { if (this.isBrowser !== null) { return this.isBrowser; } try { this.isBrowser = !!window; } catch (e) { this.isBrowser = false; } return this.isBrowser; } static getRealTypeOf(data) { if (!data) { return ResourceRequestBodyType.NONE; } if (this.isRunningInBrowser()) { if (FormData && data instanceof FormData) { return ResourceRequestBodyType.FORM_DATA; } if (Blob && data instanceof Blob) { return ResourceRequestBodyType.BLOB; } } if (data instanceof ArrayBuffer) { return ResourceRequestBodyType.ARRAY_BUFFER; } if (['string', 'number'].indexOf(typeof data) > -1) { return ResourceRequestBodyType.TEXT; } return ResourceRequestBodyType.JSON; } static defaults(dst, src) { if (!dst) { dst = {}; } Object.keys(src) .forEach((key) => { if (dst[key] === undefined) { dst[key] = src[key]; } }); return dst; } static isNullOrUndefined(value) { return value === null || value === undefined; } static cleanData(obj) { if (Array.isArray(obj)) { return this.cleanDataArray(obj); } else { return this.cleanDataObject(obj); } } static cleanDataArray(obj) { obj = obj.filter(value => typeof value !== 'function'); return obj; } static cleanDataObject(obj) { const cleanedObj = {}; for (const propName in obj) { if (typeof obj[propName] !== 'function' && this.cleanDataFields.indexOf(propName) === -1) { cleanedObj[propName] = obj[propName]; } } return cleanedObj; } static defineReturnDataPropertiesResolvedAbort(returnData) { Object.defineProperty(returnData, '$resolved', { enumerable: false, configurable: true, writable: true, value: false }); Object.defineProperty(returnData, '$abort', { enumerable: false, configurable: true, writable: true, value: () => { // does nothing for now } }); } static defineReturnDataPropertiesPromise(returnData, value) { Object.defineProperty(returnData, '$promise', { enumerable: false, configurable: true, writable: true, value }); } static getRequestOptionsOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'requestOptions'); return value; } // tslint:disable-next-line: no-identical-functions static getResolvedOptionsOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'resolvedOptions'); return value; } // tslint:disable-next-line: no-identical-functions static getActionAttributesOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'actionAttributes'); return value; } // tslint:disable-next-line: no-identical-functions static getActionOptionsOrThrow(options) { // tslint:disable-next-line: prefer-immediate-return const value = this.getResourceActionInnerOrThrow(options, 'actionOptions'); return value; } static setRequestOptionsUrlParams(requestOptions, resolvedOptions, actionAttributes, usedInPath) { if (!requestOptions.url) { throw new Error('setRequestOptionsUrlParams options.requestOptions.url missing'); } const params = this.defaults(actionAttributes.params, resolvedOptions.params); const pathParams = requestOptions.url.match(/{([^}]*)}/g) || []; for (const pathParam of pathParams) { let pathKey = pathParam.substr(1, pathParam.length - 2); const isMandatory = pathKey[0] === '!'; if (isMandatory) { pathKey = pathKey.substr(1); } const onlyPathParam = pathKey[0] === ':'; if (onlyPathParam) { pathKey = pathKey.substr(1); } if (actionAttributes.query && actionAttributes.query === actionAttributes.params) { usedInPath[pathKey] = true; } const value = params[pathKey]; if (onlyPathParam) { delete params[pathKey]; } // Replacing in the url requestOptions.url = this.setRequestOptionsUrlParamsNewUrl(value, isMandatory, pathParam, requestOptions); } } static setRequestOptionsUrlParamsNewUrl(value, isMandatory, pathParam, requestOptions) { if (!requestOptions.url) { throw new Error('setRequestOptionsUrlParamsNewUrl requestOptions.url missing'); } if (this.isNullOrUndefined(value)) { if (isMandatory) { const consoleMsg = `Mandatory ${pathParam} path parameter is missing`; console.warn(consoleMsg); throw new Error(consoleMsg); } return requestOptions.url.substr(0, requestOptions.url.indexOf(pathParam)); } return requestOptions.url.replace(pathParam, value); } static createRequestOptionsFormDataBody(body, actionOptions) { const newBody = new FormData(); Object.keys(body).forEach((key) => { const value = body[key]; if (body.hasOwnProperty(key) && typeof value !== 'function') { const isArrayOfFiles = value instanceof Array && value.reduce((acc, elem) => acc && elem instanceof File, true); if (isArrayOfFiles) { value.forEach((f, index) => { newBody.append(`${key}[${index}]`, f, f.name); }); } else if (value instanceof File) { newBody.append(key, value, value.name); } else if (!actionOptions.rootNode) { newBody.append(key, value); } } }); if (actionOptions.rootNode) { newBody.append(actionOptions.rootNode, JSON.stringify(body)); } return newBody; } static appendQueryParams(query, key, value, queryMappingMethod) { if (value instanceof Date) { query[key] = value.toISOString(); return; } if (typeof value === 'object') { switch (queryMappingMethod) { case ResourceQueryMappingMethod.Plain: this.appendQueryParamsMappingMethodPlain(query, key, value); return; case ResourceQueryMappingMethod.Bracket: /// Convert object and arrays to query params this.appendQueryParamsMappingMethodBracket(query, key, value, queryMappingMethod); return; case ResourceQueryMappingMethod.JQueryParamsBracket: /// Convert object and arrays to query params according to $.params this.appendQueryParamsMappingMethodJQueryParamsBracket(query, key, value, queryMappingMethod); return; } } query[key] = value; } static appendQueryParamsMappingMethodPlain(query, key, value) { if (Array.isArray(value)) { query[key] = value.join(','); } else { if (value && typeof value === 'object') { /// Convert dates to ISO format string if (value instanceof Date) { value = value.toISOString(); } else { value = JSON.stringify(value); } } query[key] = value; } } static appendQueryParamsMappingMethodBracket(query, key, value, queryMappingMethod) { for (const k in value) { if (value.hasOwnProperty(k)) { this.appendQueryParams(query, `${key}[${k}]`, value[k], queryMappingMethod); } } } static appendQueryParamsMappingMethodJQueryParamsBracket(query, key, value, queryMappingMethod) { for (const k in value) { if (value.hasOwnProperty(k)) { let path = `${key}[${k}]`; if (Array.isArray(value) && typeof value[k] !== 'object') { path = `${key}[]`; } this.appendQueryParams(query, path, value[k], queryMappingMethod); } } } /** * Creates new abort method from subscription */ static createNewAbortMethod(options) { if (options.returnData && options.subscription) { const abort = options.returnData.abort; options.returnData.abort = () => { if (abort) { abort(); } if (options.subscription) { options.subscription.unsubscribe(); options.subscription = null; } }; } } static getResourceActionInnerOrThrow(options, param) { if (options[param]) { return options[param]; } throw new Error('getResourceActionInnerOrThrow options.' + param + ' missing'); } } ResourceHelper.cleanDataFields = [ '$resolved', '$promise', '$abort', '$resource' ]; ResourceHelper.isBrowser = null; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzb3VyY2VIZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzb3VyY2UvY29yZS9zcmMvbGliL1Jlc291cmNlSGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFNTCwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3hCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxPQUFPLGNBQWM7SUFZekIsTUFBTSxDQUFDLGtCQUFrQjtRQUV2QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN2QjtRQUVELElBQUk7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQVM7UUFDNUIsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtZQUM3QixJQUFJLFFBQVEsSUFBSSxJQUFJLFlBQVksUUFBUSxFQUFFO2dCQUN4QyxPQUFPLHVCQUF1QixDQUFDLFNBQVMsQ0FBQzthQUMxQztZQUVELElBQUksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLEVBQUU7Z0JBQ2hDLE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDO2FBQ3JDO1NBQ0Y7UUFFRCxJQUFJLElBQUksWUFBWSxXQUFXLEVBQUU7WUFDL0IsT0FBTyx1QkFBdUIsQ0FBQyxZQUFZLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2xELE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDO1NBQ3JDO1FBRUQsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBUSxFQUFFLEdBQVE7UUFFaEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLEdBQUcsR0FBRyxFQUFFLENBQUM7U0FDVjtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQ2IsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUMxQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxPQUFPLEdBQUcsQ0FBQztJQUViLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBVTtRQUNqQyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFRO1FBRXZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDakM7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsQztJQUVILENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQVU7UUFFOUIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FBQztRQUV2RCxPQUFPLEdBQUcsQ0FBQztJQUViLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQVE7UUFDN0IsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBRTNCLEtBQUssTUFBTSxRQUFRLElBQUksR0FBRyxFQUFFO1lBRTFCLElBQUksT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUN4RixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RDO1NBRUY7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLHVDQUF1QyxDQUFDLFVBQWU7UUFDNUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFO1lBQzdDLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUU7WUFDMUMsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLHVCQUF1QjtZQUN6QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFlLEVBQUUsS0FBVTtRQUNsRSxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUU7WUFDNUMsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxPQUE2QjtRQUMzRCxvREFBb0Q7UUFDcEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTVFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxNQUFNLENBQUMseUJBQXlCLENBQUMsT0FBNkI7UUFDNUQsb0RBQW9EO1FBQ3BELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUU3RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsTUFBTSxDQUFDLDBCQUEwQixDQUFDLE9BQTZCO1FBQzdELG9EQUFvRDtRQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFOUUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsbURBQW1EO0lBQ25ELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxPQUE2QjtRQUMxRCxvREFBb0Q7UUFDcEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUUzRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsMEJBQTBCLENBQUMsY0FBZ0MsRUFDaEMsZUFBb0MsRUFDcEMsZ0JBQTJDLEVBQzNDLFVBQXNDO1FBRXRFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztTQUNsRjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RSxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFaEUsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7WUFFbEMsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ3ZDLElBQUksV0FBVyxFQUFFO2dCQUNmLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdCO1lBRUQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztZQUN6QyxJQUFJLGFBQWEsRUFBRTtnQkFDakIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0I7WUFFRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxFQUFFO2dCQUNoRixVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTlCLElBQUksYUFBYSxFQUFFO2dCQUNqQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QjtZQUVELHVCQUF1QjtZQUN2QixjQUFjLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUUzRztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsZ0NBQWdDLENBQUMsS0FBVSxFQUNWLFdBQW9CLEVBQ3BCLFNBQWlCLEVBQ2pCLGNBQWdDO1FBRXRFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztTQUNoRjtRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLElBQUksV0FBVyxFQUFFO2dCQUNmLE1BQU0sVUFBVSxHQUFHLGFBQWEsU0FBUyw0QkFBNEIsQ0FBQztnQkFDdEUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM3QjtZQUVELE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FFNUU7UUFFRCxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLElBQVMsRUFBRSxhQUE4QjtRQUUvRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBRS9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFFeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXhCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUU7Z0JBRTNELE1BQU0sY0FBYyxHQUFHLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUVoSCxJQUFJLGNBQWMsRUFBRTtvQkFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU8sRUFBRSxLQUFhLEVBQUUsRUFBRTt3QkFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRCxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTSxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUU7b0JBQ2hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3hDO3FCQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO29CQUNsQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUI7YUFDRjtRQUVILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUVqQixDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQXlDLEVBQ3pDLEdBQVcsRUFDWCxLQUFVLEVBQ1Ysa0JBQStDO1FBRXRFLElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtZQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRWpDLE9BQU87U0FDUjtRQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBRTdCLFFBQVEsa0JBQWtCLEVBQUU7Z0JBRTFCLEtBQUssMEJBQTBCLENBQUMsS0FBSztvQkFDbkMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRTVELE9BQU87Z0JBRVQsS0FBSywwQkFBMEIsQ0FBQyxPQUFPO29CQUNyQyw2Q0FBNkM7b0JBQzdDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO29CQUVsRixPQUFPO2dCQUVULEtBQUssMEJBQTBCLENBQUMsbUJBQW1CO29CQUNqRCxtRUFBbUU7b0JBQ25FLElBQUksQ0FBQyxpREFBaUQsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO29CQUU5RixPQUFPO2FBRVY7U0FFRjtRQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxLQUE4QixFQUFFLEdBQVcsRUFBRSxLQUFVO1FBRWhHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBRUwsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUN0QyxzQ0FBc0M7Z0JBQ3RDLElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtvQkFDekIsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDN0I7cUJBQU07b0JBQ0wsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7WUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxLQUE4QixFQUM5QixHQUFXLEVBQ1gsS0FBVSxFQUNWLGtCQUE4QztRQUV6RixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRTtZQUNyQixJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7YUFDN0U7U0FDRjtJQUVILENBQUM7SUFFRCxNQUFNLENBQUMsaURBQWlELENBQUMsS0FBOEIsRUFDOUIsR0FBVyxFQUNYLEtBQVUsRUFDVixrQkFBOEM7UUFFckcsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUU7WUFDckIsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUMzQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFFMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDeEQsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7aUJBQ25CO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2FBQ25FO1NBQ0Y7SUFFSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQUMsT0FBNkI7UUFDdkQsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFFOUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFFdkMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFO2dCQUU5QixJQUFJLEtBQUssRUFBRTtvQkFDVCxLQUFLLEVBQUUsQ0FBQztpQkFDVDtnQkFFRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7b0JBQ3hCLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ25DLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUM3QjtZQUVILENBQUMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUdPLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxPQUE2QixFQUFFLEtBQWE7UUFDdkYsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkI7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxHQUFHLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNqRixDQUFDOztBQTVYTSw4QkFBZSxHQUFhO0lBQ2pDLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7Q0FDWixDQUFDO0FBR2Esd0JBQVMsR0FBbUIsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBJUmVzb3VyY2VBY3Rpb24sXHJcbiAgSVJlc291cmNlQWN0aW9uQXR0cmlidXRlcyxcclxuICBJUmVzb3VyY2VBY3Rpb25Jbm5lcixcclxuICBJUmVzb3VyY2VQYXJhbXNCYXNlLFxyXG4gIElSZXNvdXJjZVJlcXVlc3QsXHJcbiAgUmVzb3VyY2VRdWVyeU1hcHBpbmdNZXRob2QsXHJcbiAgUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGVcclxufSBmcm9tICcuL0RlY2xhcmF0aW9ucyc7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VIZWxwZXIge1xyXG5cclxuICBzdGF0aWMgY2xlYW5EYXRhRmllbGRzOiBzdHJpbmdbXSA9IFtcclxuICAgICckcmVzb2x2ZWQnLFxyXG4gICAgJyRwcm9taXNlJyxcclxuICAgICckYWJvcnQnLFxyXG4gICAgJyRyZXNvdXJjZSdcclxuICBdO1xyXG5cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaXNCcm93c2VyOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBpc1J1bm5pbmdJbkJyb3dzZXIoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzQnJvd3NlcjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnJvd3NlciA9ICEhd2luZG93O1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLmlzQnJvd3NlciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmlzQnJvd3NlcjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRSZWFsVHlwZU9mKGRhdGE6IGFueSk6IFJlc291cmNlUmVxdWVzdEJvZHlUeXBlIHtcclxuICAgIGlmICghZGF0YSkge1xyXG4gICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuTk9ORTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1J1bm5pbmdJbkJyb3dzZXIoKSkge1xyXG4gICAgICBpZiAoRm9ybURhdGEgJiYgZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlc291cmNlUmVxdWVzdEJvZHlUeXBlLkZPUk1fREFUQTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKEJsb2IgJiYgZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuQkxPQjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcclxuICAgICAgcmV0dXJuIFJlc291cmNlUmVxdWVzdEJvZHlUeXBlLkFSUkFZX0JVRkZFUjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoWydzdHJpbmcnLCAnbnVtYmVyJ10uaW5kZXhPZih0eXBlb2YgZGF0YSkgPiAtMSkge1xyXG4gICAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuVEVYVDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUuSlNPTjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWZhdWx0cyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xyXG5cclxuICAgIGlmICghZHN0KSB7XHJcbiAgICAgIGRzdCA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIE9iamVjdC5rZXlzKHNyYylcclxuICAgICAgLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGRzdFtrZXldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZHN0O1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc051bGxPclVuZGVmaW5lZCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjbGVhbkRhdGEob2JqOiBhbnkpOiBhbnkge1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2xlYW5EYXRhQXJyYXkob2JqKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNsZWFuRGF0YU9iamVjdChvYmopO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjbGVhbkRhdGFBcnJheShvYmo6IGFueVtdKTogYW55W10ge1xyXG5cclxuICAgIG9iaiA9IG9iai5maWx0ZXIodmFsdWUgPT4gdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKTtcclxuXHJcbiAgICByZXR1cm4gb2JqO1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjbGVhbkRhdGFPYmplY3Qob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3QgY2xlYW5lZE9iajogYW55ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBvYmopIHtcclxuXHJcbiAgICAgIGlmICh0eXBlb2Ygb2JqW3Byb3BOYW1lXSAhPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLmNsZWFuRGF0YUZpZWxkcy5pbmRleE9mKHByb3BOYW1lKSA9PT0gLTEpIHtcclxuICAgICAgICBjbGVhbmVkT2JqW3Byb3BOYW1lXSA9IG9ialtwcm9wTmFtZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsZWFuZWRPYmo7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGVmaW5lUmV0dXJuRGF0YVByb3BlcnRpZXNSZXNvbHZlZEFib3J0KHJldHVybkRhdGE6IGFueSkge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldHVybkRhdGEsICckcmVzb2x2ZWQnLCB7XHJcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXHJcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxyXG4gICAgICB2YWx1ZTogZmFsc2VcclxuICAgIH0pO1xyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXR1cm5EYXRhLCAnJGFib3J0Jywge1xyXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcclxuICAgICAgdmFsdWU6ICgpID0+IHtcclxuICAgICAgICAvLyBkb2VzIG5vdGhpbmcgZm9yIG5vd1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWZpbmVSZXR1cm5EYXRhUHJvcGVydGllc1Byb21pc2UocmV0dXJuRGF0YTogYW55LCB2YWx1ZTogYW55KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0dXJuRGF0YSwgJyRwcm9taXNlJywge1xyXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcclxuICAgICAgdmFsdWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFJlcXVlc3RPcHRpb25zT3JUaHJvdyhvcHRpb25zOiBJUmVzb3VyY2VBY3Rpb25Jbm5lcik6IElSZXNvdXJjZVJlcXVlc3Qge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItaW1tZWRpYXRlLXJldHVyblxyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFJlc291cmNlQWN0aW9uSW5uZXJPclRocm93KG9wdGlvbnMsICdyZXF1ZXN0T3B0aW9ucycpO1xyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taWRlbnRpY2FsLWZ1bmN0aW9uc1xyXG4gIHN0YXRpYyBnZXRSZXNvbHZlZE9wdGlvbnNPclRocm93KG9wdGlvbnM6IElSZXNvdXJjZUFjdGlvbklubmVyKTogSVJlc291cmNlUGFyYW1zQmFzZSB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHByZWZlci1pbW1lZGlhdGUtcmV0dXJuXHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VBY3Rpb25Jbm5lck9yVGhyb3cob3B0aW9ucywgJ3Jlc29sdmVkT3B0aW9ucycpO1xyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taWRlbnRpY2FsLWZ1bmN0aW9uc1xyXG4gIHN0YXRpYyBnZXRBY3Rpb25BdHRyaWJ1dGVzT3JUaHJvdyhvcHRpb25zOiBJUmVzb3VyY2VBY3Rpb25Jbm5lcik6IElSZXNvdXJjZUFjdGlvbkF0dHJpYnV0ZXMge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItaW1tZWRpYXRlLXJldHVyblxyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFJlc291cmNlQWN0aW9uSW5uZXJPclRocm93KG9wdGlvbnMsICdhY3Rpb25BdHRyaWJ1dGVzJyk7XHJcblxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pZGVudGljYWwtZnVuY3Rpb25zXHJcbiAgc3RhdGljIGdldEFjdGlvbk9wdGlvbnNPclRocm93KG9wdGlvbnM6IElSZXNvdXJjZUFjdGlvbklubmVyKTogSVJlc291cmNlQWN0aW9uIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLWltbWVkaWF0ZS1yZXR1cm5cclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRSZXNvdXJjZUFjdGlvbklubmVyT3JUaHJvdyhvcHRpb25zLCAnYWN0aW9uT3B0aW9ucycpO1xyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRSZXF1ZXN0T3B0aW9uc1VybFBhcmFtcyhyZXF1ZXN0T3B0aW9uczogSVJlc291cmNlUmVxdWVzdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRPcHRpb25zOiBJUmVzb3VyY2VQYXJhbXNCYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25BdHRyaWJ1dGVzOiBJUmVzb3VyY2VBY3Rpb25BdHRyaWJ1dGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkSW5QYXRoOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSkge1xyXG5cclxuICAgIGlmICghcmVxdWVzdE9wdGlvbnMudXJsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVxdWVzdE9wdGlvbnNVcmxQYXJhbXMgb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy51cmwgbWlzc2luZycpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZGVmYXVsdHMoYWN0aW9uQXR0cmlidXRlcy5wYXJhbXMsIHJlc29sdmVkT3B0aW9ucy5wYXJhbXMpO1xyXG4gICAgY29uc3QgcGF0aFBhcmFtcyA9IHJlcXVlc3RPcHRpb25zLnVybC5tYXRjaCgveyhbXn1dKil9L2cpIHx8IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgcGF0aFBhcmFtIG9mIHBhdGhQYXJhbXMpIHtcclxuXHJcbiAgICAgIGxldCBwYXRoS2V5ID0gcGF0aFBhcmFtLnN1YnN0cigxLCBwYXRoUGFyYW0ubGVuZ3RoIC0gMik7XHJcbiAgICAgIGNvbnN0IGlzTWFuZGF0b3J5ID0gcGF0aEtleVswXSA9PT0gJyEnO1xyXG4gICAgICBpZiAoaXNNYW5kYXRvcnkpIHtcclxuICAgICAgICBwYXRoS2V5ID0gcGF0aEtleS5zdWJzdHIoMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG9ubHlQYXRoUGFyYW0gPSBwYXRoS2V5WzBdID09PSAnOic7XHJcbiAgICAgIGlmIChvbmx5UGF0aFBhcmFtKSB7XHJcbiAgICAgICAgcGF0aEtleSA9IHBhdGhLZXkuc3Vic3RyKDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYWN0aW9uQXR0cmlidXRlcy5xdWVyeSAmJiBhY3Rpb25BdHRyaWJ1dGVzLnF1ZXJ5ID09PSBhY3Rpb25BdHRyaWJ1dGVzLnBhcmFtcykge1xyXG4gICAgICAgIHVzZWRJblBhdGhbcGF0aEtleV0gPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtc1twYXRoS2V5XTtcclxuXHJcbiAgICAgIGlmIChvbmx5UGF0aFBhcmFtKSB7XHJcbiAgICAgICAgZGVsZXRlIHBhcmFtc1twYXRoS2V5XTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVwbGFjaW5nIGluIHRoZSB1cmxcclxuICAgICAgcmVxdWVzdE9wdGlvbnMudXJsID0gdGhpcy5zZXRSZXF1ZXN0T3B0aW9uc1VybFBhcmFtc05ld1VybCh2YWx1ZSwgaXNNYW5kYXRvcnksIHBhdGhQYXJhbSwgcmVxdWVzdE9wdGlvbnMpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRSZXF1ZXN0T3B0aW9uc1VybFBhcmFtc05ld1VybCh2YWx1ZTogYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01hbmRhdG9yeTogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhcmFtOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiBJUmVzb3VyY2VSZXF1ZXN0KTogc3RyaW5nIHtcclxuXHJcbiAgICBpZiAoIXJlcXVlc3RPcHRpb25zLnVybCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJlcXVlc3RPcHRpb25zVXJsUGFyYW1zTmV3VXJsIHJlcXVlc3RPcHRpb25zLnVybCBtaXNzaW5nJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XHJcbiAgICAgIGlmIChpc01hbmRhdG9yeSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnNvbGVNc2cgPSBgTWFuZGF0b3J5ICR7cGF0aFBhcmFtfSBwYXRoIHBhcmFtZXRlciBpcyBtaXNzaW5nYDtcclxuICAgICAgICBjb25zb2xlLndhcm4oY29uc29sZU1zZyk7XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjb25zb2xlTXNnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHJlcXVlc3RPcHRpb25zLnVybC5zdWJzdHIoMCwgcmVxdWVzdE9wdGlvbnMudXJsLmluZGV4T2YocGF0aFBhcmFtKSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXF1ZXN0T3B0aW9ucy51cmwucmVwbGFjZShwYXRoUGFyYW0sIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVSZXF1ZXN0T3B0aW9uc0Zvcm1EYXRhQm9keShib2R5OiBhbnksIGFjdGlvbk9wdGlvbnM6IElSZXNvdXJjZUFjdGlvbik6IEZvcm1EYXRhIHtcclxuXHJcbiAgICBjb25zdCBuZXdCb2R5ID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgT2JqZWN0LmtleXMoYm9keSkuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlID0gYm9keVtrZXldO1xyXG5cclxuICAgICAgaWYgKGJvZHkuaGFzT3duUHJvcGVydHkoa2V5KSAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaXNBcnJheU9mRmlsZXMgPSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIHZhbHVlLnJlZHVjZSgoYWNjLCBlbGVtKSA9PiBhY2MgJiYgZWxlbSBpbnN0YW5jZW9mIEZpbGUsIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoaXNBcnJheU9mRmlsZXMpIHtcclxuICAgICAgICAgIHZhbHVlLmZvckVhY2goKGY6IEZpbGUsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgbmV3Qm9keS5hcHBlbmQoYCR7a2V5fVske2luZGV4fV1gLCBmLCBmLm5hbWUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcclxuICAgICAgICAgIG5ld0JvZHkuYXBwZW5kKGtleSwgdmFsdWUsIHZhbHVlLm5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWFjdGlvbk9wdGlvbnMucm9vdE5vZGUpIHtcclxuICAgICAgICAgIG5ld0JvZHkuYXBwZW5kKGtleSwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChhY3Rpb25PcHRpb25zLnJvb3ROb2RlKSB7XHJcbiAgICAgIG5ld0JvZHkuYXBwZW5kKGFjdGlvbk9wdGlvbnMucm9vdE5vZGUsIEpTT04uc3RyaW5naWZ5KGJvZHkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3Qm9keTtcclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYXBwZW5kUXVlcnlQYXJhbXMocXVlcnk6IHsgW3Byb3A6IHN0cmluZ106IHN0cmluZyB8IGFueVtdIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeU1hcHBpbmdNZXRob2Q/OiBSZXNvdXJjZVF1ZXJ5TWFwcGluZ01ldGhvZCk6IHZvaWQge1xyXG5cclxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcXVlcnlba2V5XSA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuXHJcbiAgICAgIHN3aXRjaCAocXVlcnlNYXBwaW5nTWV0aG9kKSB7XHJcblxyXG4gICAgICAgIGNhc2UgUmVzb3VyY2VRdWVyeU1hcHBpbmdNZXRob2QuUGxhaW46XHJcbiAgICAgICAgICB0aGlzLmFwcGVuZFF1ZXJ5UGFyYW1zTWFwcGluZ01ldGhvZFBsYWluKHF1ZXJ5LCBrZXksIHZhbHVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgUmVzb3VyY2VRdWVyeU1hcHBpbmdNZXRob2QuQnJhY2tldDpcclxuICAgICAgICAgIC8vLyBDb252ZXJ0IG9iamVjdCBhbmQgYXJyYXlzIHRvIHF1ZXJ5IHBhcmFtc1xyXG4gICAgICAgICAgdGhpcy5hcHBlbmRRdWVyeVBhcmFtc01hcHBpbmdNZXRob2RCcmFja2V0KHF1ZXJ5LCBrZXksIHZhbHVlLCBxdWVyeU1hcHBpbmdNZXRob2QpO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY2FzZSBSZXNvdXJjZVF1ZXJ5TWFwcGluZ01ldGhvZC5KUXVlcnlQYXJhbXNCcmFja2V0OlxyXG4gICAgICAgICAgLy8vIENvbnZlcnQgb2JqZWN0IGFuZCBhcnJheXMgdG8gcXVlcnkgcGFyYW1zIGFjY29yZGluZyB0byAkLnBhcmFtc1xyXG4gICAgICAgICAgdGhpcy5hcHBlbmRRdWVyeVBhcmFtc01hcHBpbmdNZXRob2RKUXVlcnlQYXJhbXNCcmFja2V0KHF1ZXJ5LCBrZXksIHZhbHVlLCBxdWVyeU1hcHBpbmdNZXRob2QpO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcXVlcnlba2V5XSA9IHZhbHVlO1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBhcHBlbmRRdWVyeVBhcmFtc01hcHBpbmdNZXRob2RQbGFpbihxdWVyeTogeyBbcHJvcDogc3RyaW5nXTogYW55IH0sIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHF1ZXJ5W2tleV0gPSB2YWx1ZS5qb2luKCcsJyk7XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAvLy8gQ29udmVydCBkYXRlcyB0byBJU08gZm9ybWF0IHN0cmluZ1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9JU09TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBxdWVyeVtrZXldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYXBwZW5kUXVlcnlQYXJhbXNNYXBwaW5nTWV0aG9kQnJhY2tldChxdWVyeTogeyBbcHJvcDogc3RyaW5nXTogYW55IH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeU1hcHBpbmdNZXRob2Q6IFJlc291cmNlUXVlcnlNYXBwaW5nTWV0aG9kKSB7XHJcblxyXG4gICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XHJcbiAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrKSkge1xyXG4gICAgICAgIHRoaXMuYXBwZW5kUXVlcnlQYXJhbXMocXVlcnksIGAke2tleX1bJHtrfV1gLCB2YWx1ZVtrXSwgcXVlcnlNYXBwaW5nTWV0aG9kKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBhcHBlbmRRdWVyeVBhcmFtc01hcHBpbmdNZXRob2RKUXVlcnlQYXJhbXNCcmFja2V0KHF1ZXJ5OiB7IFtwcm9wOiBzdHJpbmddOiBhbnkgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5TWFwcGluZ01ldGhvZDogUmVzb3VyY2VRdWVyeU1hcHBpbmdNZXRob2QpIHtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcclxuICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGspKSB7XHJcbiAgICAgICAgbGV0IHBhdGggPSBgJHtrZXl9WyR7a31dYDtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiB2YWx1ZVtrXSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgIHBhdGggPSBgJHtrZXl9W11gO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFwcGVuZFF1ZXJ5UGFyYW1zKHF1ZXJ5LCBwYXRoLCB2YWx1ZVtrXSwgcXVlcnlNYXBwaW5nTWV0aG9kKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgbmV3IGFib3J0IG1ldGhvZCBmcm9tIHN1YnNjcmlwdGlvblxyXG4gICAqL1xyXG4gIHN0YXRpYyBjcmVhdGVOZXdBYm9ydE1ldGhvZChvcHRpb25zOiBJUmVzb3VyY2VBY3Rpb25Jbm5lcikge1xyXG4gICAgaWYgKG9wdGlvbnMucmV0dXJuRGF0YSAmJiBvcHRpb25zLnN1YnNjcmlwdGlvbikge1xyXG5cclxuICAgICAgY29uc3QgYWJvcnQgPSBvcHRpb25zLnJldHVybkRhdGEuYWJvcnQ7XHJcblxyXG4gICAgICBvcHRpb25zLnJldHVybkRhdGEuYWJvcnQgPSAoKSA9PiB7XHJcblxyXG4gICAgICAgIGlmIChhYm9ydCkge1xyXG4gICAgICAgICAgYWJvcnQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgb3B0aW9ucy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIG9wdGlvbnMuc3Vic2NyaXB0aW9uID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldFJlc291cmNlQWN0aW9uSW5uZXJPclRocm93KG9wdGlvbnM6IElSZXNvdXJjZUFjdGlvbklubmVyLCBwYXJhbTogc3RyaW5nKTogYW55IHtcclxuICAgIGlmIChvcHRpb25zW3BhcmFtXSkge1xyXG4gICAgICByZXR1cm4gb3B0aW9uc1twYXJhbV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdnZXRSZXNvdXJjZUFjdGlvbklubmVyT3JUaHJvdyBvcHRpb25zLicgKyBwYXJhbSArICcgbWlzc2luZycpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19