@fdot/angular-staff
Version:
The angular-staff package wraps service calls to FDOT Staff API and also includes pipes and components based on bootstrap 4. ## Installation The angular staff package use a peer dependency of ng-bootstrap so you will need to also perform an NPM install
329 lines (328 loc) • 38.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable, Inject } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs';
import { HttpHeaders, HttpParams, HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { Config } from './models/config';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
var AngularStaffService = /** @class */ (function () {
function AngularStaffService(http, config) {
this.http = http;
this.config = config;
this.staffByIdCache = new Map();
this.staffByRacfIdCache = new Map();
this.staffSearchCache = new Map();
if (!config) {
throw Error('Call AngularStaffmodule with for root passing in the config object');
}
}
/**
* @param {?} staff
* @param {?} format
* @return {?}
*/
AngularStaffService.prototype.Format = /**
* @param {?} staff
* @param {?} format
* @return {?}
*/
function (staff, format) {
if (format) {
var /** @type {?} */ formattedStr = format.replace('{firstName}', staff.firstName);
formattedStr = formattedStr.replace('{lastName}', staff.lastName);
formattedStr = formattedStr.replace('{racfId}', staff.racfId);
formattedStr = formattedStr.replace('{emailAddress}', staff.emailAddress);
formattedStr = formattedStr.replace('{phone}', staff.phone);
return formattedStr;
}
return staff.firstName + " " + staff.lastName;
};
/**
* Method GetStaffById
* @param {?} id Id for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
AngularStaffService.prototype.GetStaffById = /**
* Method GetStaffById
* @param {?} id Id for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
function (id) {
var _this = this;
if (!this.staffByIdCache.get(id)) {
this.staffByIdCache.set(id, new BehaviorSubject(null));
var /** @type {?} */ uri = "/GetStaffById";
var /** @type {?} */ headers = new HttpHeaders();
var /** @type {?} */ params = new HttpParams();
if (id !== undefined && id !== null) {
params = params.set('id', id + '');
}
this.sendRequest('get', uri, headers, params, null).toPromise().then(function (r) {
if (r && r.body) {
_this.staffByIdCache.get(id).next(r.body);
}
});
}
return this.staffByIdCache.get(id);
};
/**
* Method GetStaffByIds
* @param {?} id Id for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
AngularStaffService.prototype.GetStaffByIds = /**
* Method GetStaffByIds
* @param {?} id Id for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
function (id) {
var /** @type {?} */ uri = "/GetStaffByIds";
var /** @type {?} */ headers = new HttpHeaders();
var /** @type {?} */ params = new HttpParams();
if (id !== undefined && id !== null) {
params = params.set('id', id + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(map(function (r) {
if (r && r.body) {
return r.body;
}
}));
};
/**
* Method GetStaffByRacfId
* @param {?} racfId RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
AngularStaffService.prototype.GetStaffByRacfId = /**
* Method GetStaffByRacfId
* @param {?} racfId RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
function (racfId) {
var _this = this;
if (!this.staffByRacfIdCache.get(racfId)) {
this.staffByRacfIdCache.set(racfId, new BehaviorSubject(null));
var /** @type {?} */ uri = "/GetStaffByRacfId";
var /** @type {?} */ headers = new HttpHeaders();
var /** @type {?} */ params = new HttpParams();
if (racfId !== undefined && racfId !== null) {
params = params.set('racfId', racfId + '');
}
this.sendRequest('get', uri, headers, params, null).pipe(map(function (r) {
if (r && r.body) {
_this.staffByRacfIdCache.get(racfId).next(r.body);
}
}));
}
return this.staffByRacfIdCache.get(racfId);
};
/**
* Method GetStaffByRacfIds
* @param {?} racfId RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
AngularStaffService.prototype.GetStaffByRacfIds = /**
* Method GetStaffByRacfIds
* @param {?} racfId RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
function (racfId) {
var /** @type {?} */ uri = "/GetStaffByRacfIds";
var /** @type {?} */ headers = new HttpHeaders();
var /** @type {?} */ params = new HttpParams();
if (racfId !== undefined && racfId !== null) {
params = params.set('racfId', racfId + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(map(function (r) {
if (r && r.body) {
return r.body;
}
}));
};
/**
* Method SearchStaffBySearchCriteriaGet
* @param {?} racfId RacfId for Staff to retrieve
* @param {?} peopleFirstId The people first id to Search for
* @param {?} status The status code to search for
* @param {?} partialName The partial name to search for
* @param {?} firstName The first name to search for
* @param {?} lastName The last name to search for
* @param {?} districtCode The district to search for
* @param {?} positionNumber The position number to search for
* @param {?} organizationalCode The organization code to search for
* @param {?} emailAddress The email address to search for
* @param {?} staffTypeCode The staff type code to search for
* @param {?} staffId The staff id to search for
* @return {?} Full HTTP response as Observable
*/
AngularStaffService.prototype.SearchStaffBySearchCriteriaGet = /**
* Method SearchStaffBySearchCriteriaGet
* @param {?} racfId RacfId for Staff to retrieve
* @param {?} peopleFirstId The people first id to Search for
* @param {?} status The status code to search for
* @param {?} partialName The partial name to search for
* @param {?} firstName The first name to search for
* @param {?} lastName The last name to search for
* @param {?} districtCode The district to search for
* @param {?} positionNumber The position number to search for
* @param {?} organizationalCode The organization code to search for
* @param {?} emailAddress The email address to search for
* @param {?} staffTypeCode The staff type code to search for
* @param {?} staffId The staff id to search for
* @return {?} Full HTTP response as Observable
*/
function (racfId, peopleFirstId, status, partialName, firstName, lastName, districtCode, positionNumber, organizationalCode, emailAddress, staffTypeCode, staffId) {
var /** @type {?} */ uri = "/SearchStaffBySearchCriteria";
var /** @type {?} */ headers = new HttpHeaders();
var /** @type {?} */ params = new HttpParams();
if (racfId !== undefined && racfId !== null) {
params = params.set('racfId', racfId + '');
}
if (peopleFirstId !== undefined && peopleFirstId !== null) {
params = params.set('peopleFirstId', peopleFirstId + '');
}
if (status !== undefined && status !== null) {
params = params.set('status', status + '');
}
if (partialName !== undefined && partialName !== null) {
params = params.set('partialName', partialName + '');
}
if (firstName !== undefined && firstName !== null) {
params = params.set('firstName', firstName + '');
}
if (lastName !== undefined && lastName !== null) {
params = params.set('lastName', lastName + '');
}
if (districtCode !== undefined && districtCode !== null) {
params = params.set('districtCode', districtCode + '');
}
if (positionNumber !== undefined && positionNumber !== null) {
params = params.set('positionNumber', positionNumber + '');
}
if (organizationalCode !== undefined && organizationalCode !== null) {
params = params.set('organizationalCode', organizationalCode + '');
}
if (emailAddress !== undefined && emailAddress !== null) {
params = params.set('emailAddress', emailAddress + '');
}
if (staffTypeCode !== undefined && staffTypeCode !== null) {
params = params.set('staffTypeCode', staffTypeCode + '');
}
if (staffId !== undefined && staffId !== null) {
params = params.set('staffId', staffId + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(map(function (r) {
if (r && r.body) {
return r.body;
}
}));
};
/**
* @param {?} name
* @return {?}
*/
AngularStaffService.prototype.SearchActiveStaffByName = /**
* @param {?} name
* @return {?}
*/
function (name) {
var _this = this;
if (!this.staffSearchCache.get(name)) {
this.staffSearchCache.set(name, new BehaviorSubject([]));
this.SearchStaffBySearchCriteriaGet(null, null, 'active', name, null, null, null, null, null, null, null, null).toPromise().then(function (results) {
_this.staffSearchCache.get(name).next(results);
});
}
return this.staffSearchCache.get(name);
};
/**
* Method SearchStaffBySearchCriteriaPost
* @param {?} searchCriteria RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
AngularStaffService.prototype.SearchStaffBySearchCriteriaPost = /**
* Method SearchStaffBySearchCriteriaPost
* @param {?} searchCriteria RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
function (searchCriteria) {
var /** @type {?} */ uri = "/SearchStaffBySearchCriteria";
var /** @type {?} */ headers = new HttpHeaders();
var /** @type {?} */ params = new HttpParams();
return this.sendRequest('post', uri, headers, params, JSON.stringify(searchCriteria));
};
/**
* @template T
* @param {?} method
* @param {?} uri
* @param {?} headers
* @param {?} params
* @param {?} body
* @return {?}
*/
AngularStaffService.prototype.sendRequest = /**
* @template T
* @param {?} method
* @param {?} uri
* @param {?} headers
* @param {?} params
* @param {?} body
* @return {?}
*/
function (method, uri, headers, params, body) {
headers = headers.set('Ocp-Apim-Subscription-Key', this.config.apiKey);
if (method === 'get') {
return this.http.get(this.config.host + uri, { headers: headers.set('Accept', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'put') {
return this.http.put(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'post') {
return this.http.post(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'delete') {
return this.http.delete(this.config.host + uri, { headers: headers, params: params, observe: 'response' });
}
else {
console.error('Unsupported request: ' + method);
return Observable.throw('Unsupported request: ' + method);
}
};
AngularStaffService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
AngularStaffService.ctorParameters = function () { return [
{ type: HttpClient, },
{ type: Config, decorators: [{ type: Inject, args: ['config',] },] },
]; };
/** @nocollapse */ AngularStaffService.ngInjectableDef = i0.defineInjectable({ factory: function AngularStaffService_Factory() { return new AngularStaffService(i0.inject(i1.HttpClient), i0.inject("config")); }, token: AngularStaffService, providedIn: "root" });
return AngularStaffService;
}());
export { AngularStaffService };
function AngularStaffService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
AngularStaffService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
AngularStaffService.ctorParameters;
/** @type {?} */
AngularStaffService.prototype.staffByIdCache;
/** @type {?} */
AngularStaffService.prototype.staffByRacfIdCache;
/** @type {?} */
AngularStaffService.prototype.staffSearchCache;
/** @type {?} */
AngularStaffService.prototype.http;
/** @type {?} */
AngularStaffService.prototype.config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zdGFmZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZkb3QvYW5ndWxhci1zdGFmZi8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLXN0YWZmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBZ0IsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0lBVXZDLDZCQUFvQixJQUFnQixFQUE0QjtRQUE1QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQTRCLFdBQU0sR0FBTixNQUFNOzhCQUo3QyxJQUFJLEdBQUcsRUFBd0M7a0NBQzNDLElBQUksR0FBRyxFQUF3QztnQ0FDakQsSUFBSSxHQUFHLEVBQTBDO1FBRzFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNaLE1BQU0sS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7U0FDbkY7S0FDRjs7Ozs7O0lBRU0sb0NBQU07Ozs7O2NBQUMsS0FBa0IsRUFBRSxNQUFjO1FBQzlDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDWCxxQkFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRWxFLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEUsWUFBWSxHQUFHLFlBQVksQ0FB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SSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDL0c7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDM0Q7OztnQkEvTkosVUFBVSxTQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7OztnQkFOK0MsVUFBVTtnQkFFakQsTUFBTSx1QkFVMEIsTUFBTSxTQUFDLFFBQVE7Ozs4QkFmeEQ7O1NBVWEsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU3RhZmZNZW1iZXIsIFNlYXJjaENyaXRlcmlhIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBIdHRwUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vbW9kZWxzL2NvbmZpZyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyU3RhZmZTZXJ2aWNlIHtcclxuICBwcml2YXRlIHN0YWZmQnlJZENhY2hlID0gbmV3IE1hcDxudW1iZXIsIEJlaGF2aW9yU3ViamVjdDxTdGFmZk1lbWJlcj4+KCk7XHJcbiAgcHJpdmF0ZSBzdGFmZkJ5UmFjZklkQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyPj4oKTtcclxuICBwcml2YXRlIHN0YWZmU2VhcmNoQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyW10+PigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIEBJbmplY3QoJ2NvbmZpZycpIHByaXZhdGUgY29uZmlnOiBDb25maWcpIHtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdDYWxsIEFuZ3VsYXJTdGFmZm1vZHVsZSB3aXRoIGZvciByb290IHBhc3NpbmcgaW4gdGhlIGNvbmZpZyBvYmplY3QnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBGb3JtYXQoc3RhZmY6IFN0YWZmTWVtYmVyLCBmb3JtYXQ6IHN0cmluZykge1xyXG4gICAgaWYgKGZvcm1hdCkge1xyXG4gICAgICBsZXQgZm9ybWF0dGVkU3RyID0gZm9ybWF0LnJlcGxhY2UoJ3tmaXJzdE5hbWV9Jywgc3RhZmYuZmlyc3ROYW1lKTtcclxuXHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7bGFzdE5hbWV9Jywgc3RhZmYubGFzdE5hbWUpO1xyXG4gICAgICBmb3JtYXR0ZWRTdHIgPSBmb3JtYXR0ZWRTdHIucmVwbGFjZSgne3JhY2ZJZH0nLCBzdGFmZi5yYWNmSWQpO1xyXG4gICAgICBmb3JtYXR0ZWRTdHIgPSBmb3JtYXR0ZWRTdHIucmVwbGFjZSgne2VtYWlsQWRkcmVzc30nLCBzdGFmZi5lbWFpbEFkZHJlc3MpO1xyXG4gICAgICBmb3JtYXR0ZWRTdHIgPSBmb3JtYXR0ZWRTdHIucmVwbGFjZSgne3Bob25lfScsIHN0YWZmLnBob25lKTtcclxuXHJcbiAgICAgIHJldHVybiBmb3JtYXR0ZWRTdHI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAke3N0YWZmLmZpcnN0TmFtZX0gJHtzdGFmZi5sYXN0TmFtZX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0U3RhZmZCeUlkXHJcbiAgKiBAcGFyYW0gaWQgSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeUlkKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyPiB7XHJcbiAgICBpZiAoIXRoaXMuc3RhZmZCeUlkQ2FjaGUuZ2V0KGlkKSkge1xyXG4gICAgICB0aGlzLnN0YWZmQnlJZENhY2hlLnNldChpZCwgbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFmZk1lbWJlcj4obnVsbCkpO1xyXG5cclxuICAgICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5SWRgO1xyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2lkJywgaWQgKyAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZW5kUmVxdWVzdDxTdGFmZk1lbWJlcj4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS50b1Byb21pc2UoKS50aGVuKHIgPT4ge1xyXG4gICAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgICAgdGhpcy5zdGFmZkJ5SWRDYWNoZS5nZXQoaWQpLm5leHQoci5ib2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnN0YWZmQnlJZENhY2hlLmdldChpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRTdGFmZkJ5SWRzXHJcbiAgKiBAcGFyYW0gaWQgSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeUlkcyhpZDogbnVtYmVyW10pOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyW10+IHtcclxuICAgIGNvbnN0IHVyaSA9IGAvR2V0U3RhZmZCeUlkc2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2lkJywgaWQgKyAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkucGlwZShtYXAociA9PiB7XHJcbiAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgIHJldHVybiByLmJvZHk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFN0YWZmQnlSYWNmSWRcclxuICAqIEBwYXJhbSByYWNmSWQgUmFjZklkIGZvciBTdGFmZiB0byByZXRyaWV2ZVxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIEdldFN0YWZmQnlSYWNmSWQocmFjZklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyPiB7XHJcbiAgICBpZiAoIXRoaXMuc3RhZmZCeVJhY2ZJZENhY2hlLmdldChyYWNmSWQpKSB7XHJcbiAgICAgIHRoaXMuc3RhZmZCeVJhY2ZJZENhY2hlLnNldChyYWNmSWQsIG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXI+KG51bGwpKTtcclxuICAgICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5UmFjZklkYDtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgICAgaWYgKHJhY2ZJZCAhPT0gdW5kZWZpbmVkICYmIHJhY2ZJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3JhY2ZJZCcsIHJhY2ZJZCArICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZW5kUmVxdWVzdDxTdGFmZk1lbWJlcj4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS5waXBlKG1hcChyID0+IHtcclxuICAgICAgICBpZiAociAmJiByLmJvZHkpIHtcclxuICAgICAgICAgIHRoaXMuc3RhZmZCeVJhY2ZJZENhY2hlLmdldChyYWNmSWQpLm5leHQoci5ib2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuZ2V0KHJhY2ZJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRTdGFmZkJ5UmFjZklkc1xyXG4gICogQHBhcmFtIHJhY2ZJZCBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeVJhY2ZJZHMocmFjZklkOiBudW1iZXJbXSk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXJbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5UmFjZklkc2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChyYWNmSWQgIT09IHVuZGVmaW5lZCAmJiByYWNmSWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmFjZklkJywgcmFjZklkICsgJycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8YW55PignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUobWFwKHIgPT4ge1xyXG4gICAgICBpZiAociAmJiByLmJvZHkpIHtcclxuICAgICAgICByZXR1cm4gci5ib2R5O1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBTZWFyY2hTdGFmZkJ5U2VhcmNoQ3JpdGVyaWFHZXRcclxuICAqIEBwYXJhbSByYWNmSWQgUmFjZklkIGZvciBTdGFmZiB0byByZXRyaWV2ZVxyXG4gICogQHBhcmFtIHBlb3BsZUZpcnN0SWQgVGhlIHBlb3BsZSBmaXJzdCBpZCB0byBTZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gc3RhdHVzIFRoZSBzdGF0dXMgY29kZSB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gcGFydGlhbE5hbWUgVGhlIHBhcnRpYWwgbmFtZSB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gZmlyc3ROYW1lIFRoZSBmaXJzdCBuYW1lIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBsYXN0TmFtZSBUaGUgbGFzdCBuYW1lIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBkaXN0cmljdENvZGUgVGhlIGRpc3RyaWN0IHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBwb3NpdGlvbk51bWJlciBUaGUgcG9zaXRpb24gbnVtYmVyIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBvcmdhbml6YXRpb25hbENvZGUgVGhlIG9yZ2FuaXphdGlvbiBjb2RlIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBlbWFpbEFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIHN0YWZmVHlwZUNvZGUgVGhlIHN0YWZmIHR5cGUgY29kZSB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gc3RhZmZJZCBUaGUgc3RhZmYgaWQgdG8gc2VhcmNoIGZvclxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIFNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYUdldChyYWNmSWQ6IG51bWJlcltdLCBwZW9wbGVGaXJzdElkOiBzdHJpbmcsIHN0YXR1czogc3RyaW5nLCBwYXJ0aWFsTmFtZTogc3RyaW5nLFxyXG4gICAgZmlyc3ROYW1lOiBzdHJpbmcsIGxhc3ROYW1lOiBzdHJpbmcsIGRpc3RyaWN0Q29kZTogc3RyaW5nLCBwb3NpdGlvbk51bWJlcjogc3RyaW5nLCBvcmdhbml6YXRpb25hbENvZGU6IHN0cmluZyxcclxuICAgIGVtYWlsQWRkcmVzczogc3RyaW5nLCBzdGFmZlR5cGVDb2RlOiBzdHJpbmcsIHN0YWZmSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXJbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9TZWFyY2hTdGFmZkJ5U2VhcmNoQ3JpdGVyaWFgO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAocmFjZklkICE9PSB1bmRlZmluZWQgJiYgcmFjZklkICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3JhY2ZJZCcsIHJhY2ZJZCArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChwZW9wbGVGaXJzdElkICE9PSB1bmRlZmluZWQgJiYgcGVvcGxlRmlyc3RJZCAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwZW9wbGVGaXJzdElkJywgcGVvcGxlRmlyc3RJZCArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChzdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXMgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhdHVzJywgc3RhdHVzICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcnRpYWxOYW1lICE9PSB1bmRlZmluZWQgJiYgcGFydGlhbE5hbWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncGFydGlhbE5hbWUnLCBwYXJ0aWFsTmFtZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChmaXJzdE5hbWUgIT09IHVuZGVmaW5lZCAmJiBmaXJzdE5hbWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZmlyc3ROYW1lJywgZmlyc3ROYW1lICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxhc3ROYW1lICE9PSB1bmRlZmluZWQgJiYgbGFzdE5hbWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGFzdE5hbWUnLCBsYXN0TmFtZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChkaXN0cmljdENvZGUgIT09IHVuZGVmaW5lZCAmJiBkaXN0cmljdENvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZGlzdHJpY3RDb2RlJywgZGlzdHJpY3RDb2RlICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBvc2l0aW9uTnVtYmVyICE9PSB1bmRlZmluZWQgJiYgcG9zaXRpb25OdW1iZXIgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncG9zaXRpb25OdW1iZXInLCBwb3NpdGlvbk51bWJlciArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChvcmdhbml6YXRpb25hbENvZGUgIT09IHVuZGVmaW5lZCAmJiBvcmdhbml6YXRpb25hbENvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnb3JnYW5pemF0aW9uYWxDb2RlJywgb3JnYW5pemF0aW9uYWxDb2RlICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGVtYWlsQWRkcmVzcyAhPT0gdW5kZWZpbmVkICYmIGVtYWlsQWRkcmVzcyAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdlbWFpbEFkZHJlc3MnLCBlbWFpbEFkZHJlc3MgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhZmZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIHN0YWZmVHlwZUNvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhZmZUeXBlQ29kZScsIHN0YWZmVHlwZUNvZGUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhZmZJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWZmSWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhZmZJZCcsIHN0YWZmSWQgKyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8YW55PignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUobWFwKHIgPT4ge1xyXG4gICAgICBpZiAociAmJiByLmJvZHkpIHtcclxuICAgICAgICByZXR1cm4gci5ib2R5O1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgU2VhcmNoQWN0aXZlU3RhZmZCeU5hbWUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxTdGFmZk1lbWJlcltdPiB7XHJcbiAgICBpZiAoIXRoaXMuc3RhZmZTZWFyY2hDYWNoZS5nZXQobmFtZSkpIHtcclxuICAgICAgdGhpcy5zdGFmZlNlYXJjaENhY2hlLnNldChuYW1lLCBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyW10+KFtdKSk7XHJcblxyXG4gICAgICB0aGlzLlNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYUdldChudWxsLCBudWxsLCAnYWN0aXZlJywgbmFtZSxcclxuICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKS50b1Byb21pc2UoKS50aGVuKChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0YWZmU2VhcmNoQ2FjaGUuZ2V0KG5hbWUpLm5leHQocmVzdWx0cyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGFmZlNlYXJjaENhY2hlLmdldChuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIFNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYVBvc3RcclxuICAqIEBwYXJhbSBzZWFyY2hDcml0ZXJpYSBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhUG9zdChzZWFyY2hDcml0ZXJpYTogU2VhcmNoQ3JpdGVyaWEpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PiB7XHJcbiAgICBjb25zdCB1cmkgPSBgL1NlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8YW55PigncG9zdCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBKU09OLnN0cmluZ2lmeShzZWFyY2hDcml0ZXJpYSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kUmVxdWVzdDxUPihtZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcsIGhlYWRlcnM6IEh0dHBIZWFkZXJzLCBwYXJhbXM6IEh0dHBQYXJhbXMsIGJvZHk6IGFueSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFQ+PiB7XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ09jcC1BcGltLVN1YnNjcmlwdGlvbi1LZXknLCB0aGlzLmNvbmZpZy5hcGlLZXkpO1xyXG4gICAgaWYgKG1ldGhvZCA9PT0gJ2dldCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAncHV0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwb3N0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSwgYm9keSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnZGVsZXRlJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCB7IGhlYWRlcnM6IGhlYWRlcnMsIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgcmVxdWVzdDogJyArIG1ldGhvZCk7XHJcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19