@circle-fin/circle-sdk
Version:
Node.js SDK for Circle API
364 lines • 60.4 kB
JavaScript
"use strict";
/* tslint:disable */
/* eslint-disable */
/**
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CardsApi = exports.CardsApiFactory = exports.CardsApiFp = exports.CardsApiAxiosParamCreator = void 0;
const axios_1 = __importDefault(require("axios"));
// Some imports not used depending on template conditions
// @ts-ignore
const common_1 = require("../common");
// @ts-ignore
const base_1 = require("../base");
/**
* CardsApi - axios parameter creator
* @export
*/
const CardsApiAxiosParamCreator = function (configuration) {
return {
/**
*
* @summary Create a card
* @param {CardCreationRequest} [cardCreationRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
createCard: (cardCreationRequest, options = {}) => __awaiter(this, void 0, void 0, function* () {
const localVarPath = `/v1/cards`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = Object.assign(Object.assign({ method: "POST" }, baseOptions), options);
const localVarHeaderParameter = {};
const localVarQueryParameter = {};
// authentication bearerAuth required
// http bearer authentication required
yield (0, common_1.setBearerAuthToObject)(localVarHeaderParameter, configuration);
localVarHeaderParameter["Content-Type"] = "application/json";
(0, common_1.setSearchParams)(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers);
localVarRequestOptions.data = (0, common_1.serializeDataIfNeeded)(cardCreationRequest, localVarRequestOptions, configuration);
return {
url: (0, common_1.toPathString)(localVarUrlObj),
options: localVarRequestOptions
};
}),
/**
*
* @summary Get a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getCard: (id, options = {}) => __awaiter(this, void 0, void 0, function* () {
// verify required parameter 'id' is not null or undefined
(0, common_1.assertParamExists)("getCard", "id", id);
const localVarPath = `/v1/cards/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(id)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = Object.assign(Object.assign({ method: "GET" }, baseOptions), options);
const localVarHeaderParameter = {};
const localVarQueryParameter = {};
// authentication bearerAuth required
// http bearer authentication required
yield (0, common_1.setBearerAuthToObject)(localVarHeaderParameter, configuration);
(0, common_1.setSearchParams)(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers);
return {
url: (0, common_1.toPathString)(localVarUrlObj),
options: localVarRequestOptions
};
}),
/**
*
* @summary List all cards
* @param {string} [pageBefore] A collection ID value used for pagination. It marks the exclusive end of a page. When provided, the collection resource will return the next `n` items before the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageAfter.
* @param {string} [pageAfter] A collection ID value used for pagination. It marks the exclusive begin of a page. When provided, the collection resource will return the next `n` items after the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageBefore.
* @param {number} [pageSize] Limits the number of items to be returned. Some collections have a strict upper bound that will disregard this value. In case the specified value is higher than the allowed limit, the collection limit will be used. If avoided, the collection will determine the page size itself.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listCards: (pageBefore, pageAfter, pageSize, options = {}) => __awaiter(this, void 0, void 0, function* () {
const localVarPath = `/v1/cards`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = Object.assign(Object.assign({ method: "GET" }, baseOptions), options);
const localVarHeaderParameter = {};
const localVarQueryParameter = {};
// authentication bearerAuth required
// http bearer authentication required
yield (0, common_1.setBearerAuthToObject)(localVarHeaderParameter, configuration);
if (pageBefore !== undefined) {
localVarQueryParameter["pageBefore"] = pageBefore;
}
if (pageAfter !== undefined) {
localVarQueryParameter["pageAfter"] = pageAfter;
}
if (pageSize !== undefined) {
localVarQueryParameter["pageSize"] = pageSize;
}
(0, common_1.setSearchParams)(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers);
return {
url: (0, common_1.toPathString)(localVarUrlObj),
options: localVarRequestOptions
};
}),
/**
*
* @summary Update a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {CardUpdate} [cardUpdate]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
updateCard: (id, cardUpdate, options = {}) => __awaiter(this, void 0, void 0, function* () {
// verify required parameter 'id' is not null or undefined
(0, common_1.assertParamExists)("updateCard", "id", id);
const localVarPath = `/v1/cards/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(id)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = Object.assign(Object.assign({ method: "PUT" }, baseOptions), options);
const localVarHeaderParameter = {};
const localVarQueryParameter = {};
// authentication bearerAuth required
// http bearer authentication required
yield (0, common_1.setBearerAuthToObject)(localVarHeaderParameter, configuration);
localVarHeaderParameter["Content-Type"] = "application/json";
(0, common_1.setSearchParams)(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers);
localVarRequestOptions.data = (0, common_1.serializeDataIfNeeded)(cardUpdate, localVarRequestOptions, configuration);
return {
url: (0, common_1.toPathString)(localVarUrlObj),
options: localVarRequestOptions
};
})
};
};
exports.CardsApiAxiosParamCreator = CardsApiAxiosParamCreator;
/**
* CardsApi - functional programming interface
* @export
*/
const CardsApiFp = function (configuration) {
const localVarAxiosParamCreator = (0, exports.CardsApiAxiosParamCreator)(configuration);
return {
/**
*
* @summary Create a card
* @param {CardCreationRequest} [cardCreationRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
createCard(cardCreationRequest, options) {
return __awaiter(this, void 0, void 0, function* () {
const localVarAxiosArgs = yield localVarAxiosParamCreator.createCard(cardCreationRequest, options);
return (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration);
});
},
/**
*
* @summary Get a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getCard(id, options) {
return __awaiter(this, void 0, void 0, function* () {
const localVarAxiosArgs = yield localVarAxiosParamCreator.getCard(id, options);
return (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration);
});
},
/**
*
* @summary List all cards
* @param {string} [pageBefore] A collection ID value used for pagination. It marks the exclusive end of a page. When provided, the collection resource will return the next `n` items before the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageAfter.
* @param {string} [pageAfter] A collection ID value used for pagination. It marks the exclusive begin of a page. When provided, the collection resource will return the next `n` items after the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageBefore.
* @param {number} [pageSize] Limits the number of items to be returned. Some collections have a strict upper bound that will disregard this value. In case the specified value is higher than the allowed limit, the collection limit will be used. If avoided, the collection will determine the page size itself.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listCards(pageBefore, pageAfter, pageSize, options) {
return __awaiter(this, void 0, void 0, function* () {
const localVarAxiosArgs = yield localVarAxiosParamCreator.listCards(pageBefore, pageAfter, pageSize, options);
return (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration);
});
},
/**
*
* @summary Update a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {CardUpdate} [cardUpdate]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
updateCard(id, cardUpdate, options) {
return __awaiter(this, void 0, void 0, function* () {
const localVarAxiosArgs = yield localVarAxiosParamCreator.updateCard(id, cardUpdate, options);
return (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration);
});
}
};
};
exports.CardsApiFp = CardsApiFp;
/**
* CardsApi - factory interface
* @export
*/
const CardsApiFactory = function (configuration, basePath, axios) {
const localVarFp = (0, exports.CardsApiFp)(configuration);
return {
/**
*
* @summary Create a card
* @param {CardCreationRequest} [cardCreationRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
createCard(cardCreationRequest, options) {
return localVarFp
.createCard(cardCreationRequest, options)
.then((request) => request(axios, basePath));
},
/**
*
* @summary Get a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getCard(id, options) {
return localVarFp
.getCard(id, options)
.then((request) => request(axios, basePath));
},
/**
*
* @summary List all cards
* @param {string} [pageBefore] A collection ID value used for pagination. It marks the exclusive end of a page. When provided, the collection resource will return the next `n` items before the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageAfter.
* @param {string} [pageAfter] A collection ID value used for pagination. It marks the exclusive begin of a page. When provided, the collection resource will return the next `n` items after the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageBefore.
* @param {number} [pageSize] Limits the number of items to be returned. Some collections have a strict upper bound that will disregard this value. In case the specified value is higher than the allowed limit, the collection limit will be used. If avoided, the collection will determine the page size itself.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listCards(pageBefore, pageAfter, pageSize, options) {
return localVarFp
.listCards(pageBefore, pageAfter, pageSize, options)
.then((request) => request(axios, basePath));
},
/**
*
* @summary Update a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {CardUpdate} [cardUpdate]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
updateCard(id, cardUpdate, options) {
return localVarFp
.updateCard(id, cardUpdate, options)
.then((request) => request(axios, basePath));
}
};
};
exports.CardsApiFactory = CardsApiFactory;
/**
* CardsApi - object-oriented interface
* @export
* @class CardsApi
* @extends {BaseAPI}
*/
class CardsApi extends base_1.BaseAPI {
/**
*
* @summary Create a card
* @param {CardCreationRequest} [cardCreationRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof CardsApi
*/
createCard(cardCreationRequest, options) {
return (0, exports.CardsApiFp)(this.configuration)
.createCard(cardCreationRequest, options)
.then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary Get a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof CardsApi
*/
getCard(id, options) {
return (0, exports.CardsApiFp)(this.configuration)
.getCard(id, options)
.then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary List all cards
* @param {string} [pageBefore] A collection ID value used for pagination. It marks the exclusive end of a page. When provided, the collection resource will return the next `n` items before the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageAfter.
* @param {string} [pageAfter] A collection ID value used for pagination. It marks the exclusive begin of a page. When provided, the collection resource will return the next `n` items after the id, with `n` being specified by `pageSize`. The items will be returned in the natural order of the collection. The resource will return the first page if neither `pageAfter` nor `pageBefore` are specified. SHOULD NOT be used in conjuction with pageBefore.
* @param {number} [pageSize] Limits the number of items to be returned. Some collections have a strict upper bound that will disregard this value. In case the specified value is higher than the allowed limit, the collection limit will be used. If avoided, the collection will determine the page size itself.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof CardsApi
*/
listCards(pageBefore, pageAfter, pageSize, options) {
return (0, exports.CardsApiFp)(this.configuration)
.listCards(pageBefore, pageAfter, pageSize, options)
.then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary Update a card
* @param {string} id Universally unique identifier (UUID v4) of a resource.
* @param {CardUpdate} [cardUpdate]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof CardsApi
*/
updateCard(id, cardUpdate, options) {
return (0, exports.CardsApiFp)(this.configuration)
.updateCard(id, cardUpdate, options)
.then((request) => request(this.axios, this.basePath));
}
}
exports.CardsApi = CardsApi;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZHMtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dlbmVyYXRlZC9hcGlzL2NhcmRzLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7OztHQUlHOzs7Ozs7Ozs7Ozs7Ozs7QUFFSCxrREFJZTtBQUVmLHlEQUF5RDtBQUN6RCxhQUFhO0FBQ2Isc0NBUW1CO0FBQ25CLGFBQWE7QUFDYixrQ0FNaUI7QUFtQmpCOzs7R0FHRztBQUNJLE1BQU0seUJBQXlCLEdBQUcsVUFDdkMsYUFBNkI7SUFFN0IsT0FBTztRQUNMOzs7Ozs7V0FNRztRQUNILFVBQVUsRUFBRSxDQUNWLG1CQUF5QyxFQUN6QyxVQUE4QixFQUFFLEVBQ1YsRUFBRTtZQUN4QixNQUFNLFlBQVksR0FBRyxXQUFXLENBQUM7WUFDakMsb0ZBQW9GO1lBQ3BGLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSx1QkFBYyxDQUFDLENBQUM7WUFDN0QsSUFBSSxXQUFXLENBQUM7WUFDaEIsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLFdBQVcsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDO2FBQ3pDO1lBRUQsTUFBTSxzQkFBc0IsaUNBQzFCLE1BQU0sRUFBRSxNQUFNLElBQ1gsV0FBVyxHQUNYLE9BQU8sQ0FDWCxDQUFDO1lBQ0YsTUFBTSx1QkFBdUIsR0FBRyxFQUFTLENBQUM7WUFDMUMsTUFBTSxzQkFBc0IsR0FBRyxFQUFTLENBQUM7WUFFekMscUNBQXFDO1lBQ3JDLHNDQUFzQztZQUN0QyxNQUFNLElBQUEsOEJBQXFCLEVBQUMsdUJBQXVCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFcEUsdUJBQXVCLENBQUMsY0FBYyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7WUFFN0QsSUFBQSx3QkFBZSxFQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3hELElBQUksc0JBQXNCLEdB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QUFhLENBQUM7YUFDbEMsU0FBUyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQzthQUNuRCxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLFVBQVUsQ0FDZixFQUFVLEVBQ1YsVUFBdUIsRUFDdkIsT0FBNEI7UUFFNUIsT0FBTyxJQUFBLGtCQUFVLEVBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNsQyxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUM7YUFDbkMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0Y7QUF2RUQsNEJBdUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHtcbiAgQXhpb3NQcm9taXNlLFxuICBBeGlvc0luc3RhbmNlLFxuICBBeGlvc1JlcXVlc3RDb25maWdcbn0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb25cIjtcbi8vIFNvbWUgaW1wb3J0cyBub3QgdXNlZCBkZXBlbmRpbmcgb24gdGVtcGxhdGUgY29uZGl0aW9uc1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHtcbiAgRFVNTVlfQkFTRV9VUkwsXG4gIGFzc2VydFBhcmFtRXhpc3RzLFxuICBzZXRCZWFyZXJBdXRoVG9PYmplY3QsXG4gIHNldFNlYXJjaFBhcmFtcyxcbiAgc2VyaWFsaXplRGF0YUlmTmVlZGVkLFxuICB0b1BhdGhTdHJpbmcsXG4gIGNyZWF0ZVJlcXVlc3RGdW5jdGlvblxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQge1xuICBCQVNFX1BBVEgsXG4gIENPTExFQ1RJT05fRk9STUFUUyxcbiAgUmVxdWVzdEFyZ3MsXG4gIEJhc2VBUEksXG4gIFJlcXVpcmVkRXJyb3Jcbn0gZnJvbSBcIi4uL2Jhc2VcIjtcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJhZFJlcXVlc3QgfSBmcm9tIFwiLi4vbW9kZWxzXCI7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBDYXJkQ3JlYXRpb25SZXF1ZXN0IH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQ2FyZFVwZGF0ZSB9IGZyb20gXCIuLi9tb2RlbHNcIjtcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IENyZWF0ZUNhcmRSZXNwb25zZSB9IGZyb20gXCIuLi9tb2RlbHNcIjtcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEdldENhcmRSZXNwb25zZSB9IGZyb20gXCIuLi9tb2RlbHNcIjtcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IExpc3RDYXJkc1Jlc3BvbnNlIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgTm90QXV0aG9yaXplZCB9IGZyb20gXCIuLi9tb2RlbHNcIjtcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IE5vdEZvdW5kIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVXBkYXRlQ2FyZFJlc3BvbnNlIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuLyoqXG4gKiBDYXJkc0FwaSAtIGF4aW9zIHBhcmFtZXRlciBjcmVhdG9yXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBDYXJkc0FwaUF4aW9zUGFyYW1DcmVhdG9yID0gZnVuY3Rpb24gKFxuICBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvblxuKSB7XG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBjYXJkXG4gICAgICogQHBhcmFtIHtDYXJkQ3JlYXRpb25SZXF1ZXN0fSBbY2FyZENyZWF0aW9uUmVxdWVzdF1cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICovXG4gICAgY3JlYXRlQ2FyZDogYXN5bmMgKFxuICAgICAgY2FyZENyZWF0aW9uUmVxdWVzdD86IENhcmRDcmVhdGlvblJlcXVlc3QsXG4gICAgICBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7fVxuICAgICk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdjEvY2FyZHNgO1xuICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIC4uLmJhc2VPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9O1xuICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAvLyBhdXRoZW50aWNhdGlvbiBiZWFyZXJBdXRoIHJlcXVpcmVkXG4gICAgICAvLyBodHRwIGJlYXJlciBhdXRoZW50aWNhdGlvbiByZXF1aXJlZFxuICAgICAgYXdhaXQgc2V0QmVhcmVyQXV0aFRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBjb25maWd1cmF0aW9uKTtcblxuICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcblxuICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID1cbiAgICAgICAgYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsXG4gICAgICAgIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVyc1xuICAgICAgfTtcbiAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChcbiAgICAgICAgY2FyZENyZWF0aW9uUmVxdWVzdCxcbiAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgY29uZmlndXJhdGlvblxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zXG4gICAgICB9O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBjYXJkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIChVVUlEIHY0KSBvZiBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKi9cbiAgICBnZXRDYXJkOiBhc3luYyAoXG4gICAgICBpZDogc3RyaW5nLFxuICAgICAgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge31cbiAgICApOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICBhc3NlcnRQYXJhbUV4aXN0cyhcImdldENhcmRcIiwgXCJpZFwiLCBpZCk7XG4gICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3YxL2NhcmRzL3tpZH1gLnJlcGxhY2UoXG4gICAgICAgIGB7JHtcImlkXCJ9fWAsXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKVxuICAgICAgKTtcbiAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIC4uLmJhc2VPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9O1xuICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAvLyBhdXRoZW50aWNhdGlvbiBiZWFyZXJBdXRoIHJlcXVpcmVkXG4gICAgICAvLyBodHRwIGJlYXJlciBhdXRoZW50aWNhdGlvbiByZXF1aXJlZFxuICAgICAgYXdhaXQgc2V0QmVhcmVyQXV0aFRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBjb25maWd1cmF0aW9uKTtcblxuICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID1cbiAgICAgICAgYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsXG4gICAgICAgIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVyc1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zXG4gICAgICB9O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGFsbCBjYXJkc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFnZUJlZm9yZV0gQSBjb2xsZWN0aW9uIElEIHZhbHVlIHVzZWQgZm9yIHBhZ2luYXRpb24uICBJdCBtYXJrcyB0aGUgZXhjbHVzaXZlIGVuZCBvZiBhIHBhZ2UuIFdoZW4gcHJvdmlkZWQsIHRoZSBjb2xsZWN0aW9uIHJlc291cmNlIHdpbGwgcmV0dXJuIHRoZSBuZXh0ICYjeDYwO24mI3g2MDsgaXRlbXMgYmVmb3JlIHRoZSBpZCwgd2l0aCAmI3g2MDtuJiN4NjA7IGJlaW5nIHNwZWNpZmllZCBieSAmI3g2MDtwYWdlU2l6ZSYjeDYwOy4gIFRoZSBpdGVtcyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBuYXR1cmFsIG9yZGVyIG9mIHRoZSBjb2xsZWN0aW9uLiAgVGhlIHJlc291cmNlIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBwYWdlIGlmIG5laXRoZXIgJiN4NjA7cGFnZUFmdGVyJiN4NjA7IG5vciAmI3g2MDtwYWdlQmVmb3JlJiN4NjA7IGFyZSBzcGVjaWZpZWQuICBTSE9VTEQgTk9UIGJlIHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIHBhZ2VBZnRlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhZ2VBZnRlcl0gQSBjb2xsZWN0aW9uIElEIHZhbHVlIHVzZWQgZm9yIHBhZ2luYXRpb24uICBJdCBtYXJrcyB0aGUgZXhjbHVzaXZlIGJlZ2luIG9mIGEgcGFnZS4gV2hlbiBwcm92aWRlZCwgdGhlIGNvbGxlY3Rpb24gcmVzb3VyY2Ugd2lsbCByZXR1cm4gdGhlIG5leHQgJiN4NjA7biYjeDYwOyBpdGVtcyBhZnRlciB0aGUgaWQsIHdpdGggJiN4NjA7biYjeDYwOyBiZWluZyBzcGVjaWZpZWQgYnkgJiN4NjA7cGFnZVNpemUmI3g2MDsuICBUaGUgaXRlbXMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgbmF0dXJhbCBvcmRlciBvZiB0aGUgY29sbGVjdGlvbi4gIFRoZSByZXNvdXJjZSB3aWxsIHJldHVybiB0aGUgZmlyc3QgcGFnZSBpZiBuZWl0aGVyICYjeDYwO3BhZ2VBZnRlciYjeDYwOyBub3IgJiN4NjA7cGFnZUJlZm9yZSYjeDYwOyBhcmUgc3BlY2lmaWVkLiAgU0hPVUxEIE5PVCBiZSB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBwYWdlQmVmb3JlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZVNpemVdIExpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJldHVybmVkLiAgU29tZSBjb2xsZWN0aW9ucyBoYXZlIGEgc3RyaWN0IHVwcGVyIGJvdW5kIHRoYXQgd2lsbCBkaXNyZWdhcmQgdGhpcyB2YWx1ZS4gSW4gY2FzZSB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGhpZ2hlciB0aGFuIHRoZSBhbGxvd2VkIGxpbWl0LCB0aGUgY29sbGVjdGlvbiBsaW1pdCB3aWxsIGJlIHVzZWQuICBJZiBhdm9pZGVkLCB0aGUgY29sbGVjdGlvbiB3aWxsIGRldGVybWluZSB0aGUgcGFnZSBzaXplIGl0c2VsZi5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICovXG4gICAgbGlzdENhcmRzOiBhc3luYyAoXG4gICAgICBwYWdlQmVmb3JlPzogc3RyaW5nLFxuICAgICAgcGFnZUFmdGVyPzogc3RyaW5nLFxuICAgICAgcGFnZVNpemU/OiBudW1iZXIsXG4gICAgICBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7fVxuICAgICk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdjEvY2FyZHNgO1xuICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgLi4uYmFzZU9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH07XG4gICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGJlYXJlckF1dGggcmVxdWlyZWRcbiAgICAgIC8vIGh0dHAgYmVhcmVyIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkXG4gICAgICBhd2FpdCBzZXRCZWFyZXJBdXRoVG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIGNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICBpZiAocGFnZUJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJbXCJwYWdlQmVmb3JlXCJdID0gcGFnZUJlZm9yZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZ2VBZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJbXCJwYWdlQWZ0ZXJcIl0gPSBwYWdlQWZ0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYWdlU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJbXCJwYWdlU2l6ZVwiXSA9IHBhZ2VTaXplO1xuICAgICAgfVxuXG4gICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIpO1xuICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPVxuICAgICAgICBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlcixcbiAgICAgICAgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnNcbiAgICAgIH07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIGNhcmRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQgdjQpIG9mIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtDYXJkVXBkYXRlfSBbY2FyZFVwZGF0ZV1cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICovXG4gICAgdXBkYXRlQ2FyZDogYXN5bmMgKFxuICAgICAgaWQ6IHN0cmluZyxcbiAgICAgIGNhcmRVcGRhdGU/OiBDYXJkVXBkYXRlLFxuICAgICAgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge31cbiAgICApOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICBhc3NlcnRQYXJhbUV4aXN0cyhcInVwZGF0ZUNhcmRcIiwgXCJpZFwiLCBpZCk7XG4gICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3YxL2NhcmRzL3tpZH1gLnJlcGxhY2UoXG4gICAgICAgIGB7JHtcImlkXCJ9fWAsXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKVxuICAgICAgKTtcbiAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIC4uLmJhc2VPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9O1xuICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAvLyBhdXRoZW50aWNhdGlvbiBiZWFyZXJBdXRoIHJlcXVpcmVkXG4gICAgICAvLyBodHRwIGJlYXJlciBhdXRoZW50aWNhdGlvbiByZXF1aXJlZFxuICAgICAgYXdhaXQgc2V0QmVhcmVyQXV0aFRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBjb25maWd1cmF0aW9uKTtcblxuICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcblxuICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID1cbiAgICAgICAgYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsXG4gICAgICAgIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVyc1xuICAgICAgfTtcbiAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChcbiAgICAgICAgY2FyZFVwZGF0ZSxcbiAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgY29uZmlndXJhdGlvblxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQ2FyZHNBcGkgLSBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ2FyZHNBcGlGcCA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICBjb25zdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yID0gQ2FyZHNBcGlBeGlvc1BhcmFtQ3JlYXRvcihjb25maWd1cmF0aW9uKTtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGNhcmRcbiAgICAgKiBAcGFyYW0ge0NhcmRDcmVhdGlvblJlcXVlc3R9IFtjYXJkQ3JlYXRpb25SZXF1ZXN0XVxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVDYXJkKFxuICAgICAgY2FyZENyZWF0aW9uUmVxdWVzdD86IENhcmRDcmVhdGlvblJlcXVlc3QsXG4gICAgICBvcHRpb25zPzogQXhpb3NSZXF1ZXN0Q29uZmlnXG4gICAgKTogUHJvbWlzZTxcbiAgICAgIChcbiAgICAgICAgYXhpb3M/OiBBeGlvc0luc3RhbmNlLFxuICAgICAgICBiYXNlUGF0aD86IHN0cmluZ1xuICAgICAgKSA9PiBBeGlvc1Byb21pc2U8Q3JlYXRlQ2FyZFJlc3BvbnNlPlxuICAgID4ge1xuICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWF0ZUNhcmQoXG4gICAgICAgIGNhcmRDcmVhdGlvblJlcXVlc3QsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG4gICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKFxuICAgICAgICBsb2NhbFZhckF4aW9zQXJncyxcbiAgICAgICAgZ2xvYmFsQXhpb3MsXG4gICAgICAgIEJBU0VfUEFUSCxcbiAgICAgICAgY29uZmlndXJhdGlvblxuICAgICAgKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHN1bW1hcnkgR2V0IGEgY2FyZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBVbml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciAoVVVJRCB2NCkgb2YgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q2FyZChcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBvcHRpb25zPzogQXhpb3NSZXF1ZXN0Q29uZmlnXG4gICAgKTogUHJvbWlzZTxcbiAgICAgIChcbiAgICAgICAgYXhpb3M/OiBBeGlvc0luc3RhbmNlLFxuICAgICAgICBiYXNlUGF0aD86IHN0cmluZ1xuICAgICAgKSA9PiBBeGlvc1Byb21pc2U8R2V0Q2FyZFJlc3BvbnNlPlxuICAgID4ge1xuICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmdldENhcmQoXG4gICAgICAgIGlkLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihcbiAgICAgICAgbG9jYWxWYXJBeGlvc0FyZ3MsXG4gICAgICAgIGdsb2JhbEF4aW9zLFxuICAgICAgICBCQVNFX1BBVEgsXG4gICAgICAgIGNvbmZpZ3VyYXRpb25cbiAgICAgICk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYWxsIGNhcmRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwYWdlQmVmb3JlXSBBIGNvbGxlY3Rpb24gSUQgdmFsdWUgdXNlZCBmb3IgcGFnaW5hdGlvbi4gIEl0IG1hcmtzIHRoZSBleGNsdXNpdmUgZW5kIG9mIGEgcGFnZS4gV2hlbiBwcm92aWRlZCwgdGhlIGNvbGxlY3Rpb24gcmVzb3VyY2Ugd2lsbCByZXR1cm4gdGhlIG5leHQgJiN4NjA7biYjeDYwOyBpdGVtcyBiZWZvcmUgdGhlIGlkLCB3aXRoICYjeDYwO24mI3g2MDsgYmVpbmcgc3BlY2lmaWVkIGJ5ICYjeDYwO3BhZ2VTaXplJiN4NjA7LiAgVGhlIGl0ZW1zIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIG5hdHVyYWwgb3JkZXIgb2YgdGhlIGNvbGxlY3Rpb24uICBUaGUgcmVzb3VyY2Ugd2lsbCByZXR1cm4gdGhlIGZpcnN0IHBhZ2UgaWYgbmVpdGhlciAmI3g2MDtwYWdlQWZ0ZXImI3g2MDsgbm9yICYjeDYwO3BhZ2VCZWZvcmUmI3g2MDsgYXJlIHNwZWNpZmllZC4gIFNIT1VMRCBOT1QgYmUgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggcGFnZUFmdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFnZUFmdGVyXSBBIGNvbGxlY3Rpb24gSUQgdmFsdWUgdXNlZCBmb3IgcGFnaW5hdGlvbi4gIEl0IG1hcmtzIHRoZSBleGNsdXNpdmUgYmVnaW4gb2YgYSBwYWdlLiBXaGVuIHByb3ZpZGVkLCB0aGUgY29sbGVjdGlvbiByZXNvdXJjZSB3aWxsIHJldHVybiB0aGUgbmV4dCAmI3g2MDtuJiN4NjA7IGl0ZW1zIGFmdGVyIHRoZSBpZCwgd2l0aCAmI3g2MDtuJiN4NjA7IGJlaW5nIHNwZWNpZmllZCBieSAmI3g2MDtwYWdlU2l6ZSYjeDYwOy4gIFRoZSBpdGVtcyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBuYXR1cmFsIG9yZGVyIG9mIHRoZSBjb2xsZWN0aW9uLiAgVGhlIHJlc291cmNlIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBwYWdlIGlmIG5laXRoZXIgJiN4NjA7cGFnZUFmdGVyJiN4NjA7IG5vciAmI3g2MDtwYWdlQmVmb3JlJiN4NjA7IGFyZSBzcGVjaWZpZWQuICBTSE9VTEQgTk9UIGJlIHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIHBhZ2VCZWZvcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwYWdlU2l6ZV0gTGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgcmV0dXJuZWQuICBTb21lIGNvbGxlY3Rpb25zIGhhdmUgYSBzdHJpY3QgdXBwZXIgYm91bmQgdGhhdCB3aWxsIGRpc3JlZ2FyZCB0aGlzIHZhbHVlLiBJbiBjYXNlIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgaGlnaGVyIHRoYW4gdGhlIGFsbG93ZWQgbGltaXQsIHRoZSBjb2xsZWN0aW9uIGxpbWl0IHdpbGwgYmUgdXNlZC4gIElmIGF2b2lkZWQsIHRoZSBjb2xsZWN0aW9uIHdpbGwgZGV0ZXJtaW5lIHRoZSBwYWdlIHNpemUgaXRzZWxmLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0Q2FyZHMoXG4gICAgICBwYWdlQmVmb3JlPzogc3RyaW5nLFxuICAgICAgcGFnZUFmdGVyPzogc3RyaW5nLFxuICAgICAgcGFnZVNpemU/OiBudW1iZXIsXG4gICAgICBvcHRpb25zPzogQXhpb3NSZXF1ZXN0Q29uZmlnXG4gICAgKTogUHJvbWlzZTxcbiAgICAgIChcbiAgICAgICAgYXhpb3M/OiBBeGlvc0luc3RhbmNlLFxuICAgICAgICBiYXNlUGF0aD86IHN0cmluZ1xuICAgICAgKSA9PiBBeGlvc1Byb21pc2U8TGlzdENhcmRzUmVzcG9uc2U+XG4gICAgPiB7XG4gICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlzdENhcmRzKFxuICAgICAgICBwYWdlQmVmb3JlLFxuICAgICAgICBwYWdlQWZ0ZXIsXG4gICAgICAgIHBhZ2VTaXplLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihcbiAgICAgICAgbG9jYWxWYXJBeGlvc0FyZ3MsXG4gICAgICAgIGdsb2JhbEF4aW9zLFxuICAgICAgICBCQVNFX1BBVEgsXG4g