UNPKG

@slmdevs/celeraone

Version:

This is a NPM Package to use for all the CeleraOne interactions.

270 lines 31 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.changeUserLoginAlias = exports.getUserSingleProperty = exports.searchUser = exports.getUserIdFromSessionId = exports.purgeUser = exports.updateUserMasterData = exports.updateUserLogin = exports.updateUserPassword = exports.findUser = exports.deleteUserProperty = exports.addUserProperty = exports.importUser = void 0; const API_1 = __importStar(require("../API")); const printf_1 = __importDefault(require("printf")); const ServiceId_1 = __importDefault(require("../ServiceId")); const UrlUtil_1 = require("../Utils/UrlUtil"); const PasswordType_1 = __importDefault(require("./PasswordType")); /** * Import a new user into CeleraOne * * @param { UserInterface } user The user object that should be imported * @returns { Promise<ImportUserResponse> } */ exports.importUser = async (user) => { const bodyReq = { login: user.email, login_alias: user.socialSecurityNumber, contractor_id: user.contractorId, hash_algorithm: 'default', active: true, activated_services: [ServiceId_1.default.GP, ServiceId_1.default.HN, ServiceId_1.default.HP, ServiceId_1.default.TT, ServiceId_1.default.BN, ServiceId_1.default.ST, ServiceId_1.default.AT], master_data: { first_name: user.firstName, last_name: user.lastName, email: user.email } }; if (user.passwordType === PasswordType_1.default.HASHED) { bodyReq.hashed_password = user.password; } else if (user.passwordType === PasswordType_1.default.PLAIN) { bodyReq.password = user.password; } const request = await API_1.default(API_1.Endpoints.IMPORT_USER, 'POST', bodyReq); const response = await request.json(); if (request.status === 200) { return response.data.user_id; } throw response.errors; }; /** * Add a property to the user in CeleraOne * * @param { string } userId The userId of the CeleraOne user * @param { string } name The name of the property * @param { string } value The value of the property * @throws { InternalErrorResponse[] } * @returns { Promise<UserPropertyResponse> } a boolean if the operation was successfull or not */ exports.addUserProperty = async (userId, name, value) => { const apiUrl = printf_1.default(API_1.Endpoints.SAVE_USER_PROPERTY, userId, 'GP'); const request = await API_1.default(apiUrl, 'POST', { name, value }); const response = await request.json(); if (request.status === 200) { return true; } throw response.errors; }; /** * Delete a property from the user in CeleraOne * * @param { string } userId The userId of the CeleraOne user * @param { string } name The name of the property * @returns { Promise<boolean> } a boolean if the operation was successfull or not */ exports.deleteUserProperty = async (userId, name) => { const apiUrl = printf_1.default(API_1.Endpoints.DELETE_USER_PROPERTY, userId, 'GP', name); const request = await API_1.default(apiUrl, 'DELETE'); return request.status === 204; }; /** * Find and return a user object from CeleraOne * * @param { string } contractorId The contractorId of the user * @throws { InternalErrorResponse[] } * @returns { Promise<UserResponse> } Promise object of UserResponse type */ exports.findUser = async (contractorId) => { const apiUrl = printf_1.default(API_1.Endpoints.FIND_USER, contractorId); const request = await API_1.default(apiUrl, 'GET'); const response = await request.json(); if (request.status === 200) { const { user_id, login, account_state, login_alias } = response.data.user; const { first_name, last_name, email } = response.data.user.masterdata; return { userId: user_id, login, accountState: account_state, socialSecurityNumber: login_alias, firstName: first_name, lastName: last_name, email }; } throw response.errors; }; /** * Update the users password with a new bcrypt hash in CeleraOne * * @param userId The userId of the CeleraOne user * @param passwordHash The bcrypt password hash * @throws { InternalErrorResponse[] } * @returns { Promise<boolean> } a boolean if the operation as successfull or not */ exports.updateUserPassword = async (userId, passwordType, password) => { const endpointType = passwordType === PasswordType_1.default.HASHED ? 'password_hash' : 'password'; const apiUrl = printf_1.default(API_1.Endpoints.UPDATE_USER_PASSWORD, userId, endpointType); let reqParams; if (passwordType === PasswordType_1.default.HASHED) { reqParams = { password_hash: password, hash_algorithm: 'default' }; } else if (passwordType === PasswordType_1.default.PLAIN) { reqParams = { new_password: password }; } const request = await API_1.default(apiUrl, 'PUT', reqParams); if (request.status === 200) { return true; } return false; }; /** * Update the users login * * @param { string } userId The userId of the CeleraOne user * @param { string } newLogin The new login for the user * @throws { InternalErrorResponse[] } * @returns { Promise<boolean> } a boolean if the operation was successfull or not */ exports.updateUserLogin = async (userId, newLogin) => { const apiUrl = printf_1.default(API_1.Endpoints.UPDATE_USER_LOGIN, userId); const request = await API_1.default(apiUrl, 'PUT', { login: newLogin }); if (request.status === 200) { return true; } const response = await request.json(); throw response.errors; }; /** * Update the MasterData for the selected CeleraOne user * * @param { string } userId The userId of the CeleraOne user * @param { MasterDataInterface } data The data that will be updated for the user * @throws { InternalErrorResponse[] } * @returns { Promise<boolean> } a boolean if the operation was successfull or not */ exports.updateUserMasterData = async (userId, data) => { const apiUrl = printf_1.default(API_1.Endpoints.UPDATE_USER_MASTER_DATA, userId); const request = await API_1.default(apiUrl, 'PATCH', data); if (request.status === 200) { return true; } const response = await request.json(); throw response.errors; }; /** * Purge/Delete the user from CeleraOne * * @param { string } userId The userId of the CeleraOne user * @throws { InternalErrorResponse[] } * @returns { Promise<boolean> } a boolean if the operation was successfull or not */ exports.purgeUser = async (userId) => { const apiUrl = printf_1.default(API_1.Endpoints.PURGE_USER, userId); const request = await API_1.default(apiUrl, 'POST'); if (request.status === 200) { return true; } return false; }; /** * Get the userId via the users session_id value * * @param { string } sessionId The users CeleraOne session_id * @param { ServiceId } serviceId CeleraOne's service_id * @throws { InternalErrorResponse[] } * @returns { Promise<string> } the userId for the user */ exports.getUserIdFromSessionId = async (sessionId, serviceId) => { const apiUrl = printf_1.default(API_1.Endpoints.USER_SESSION, serviceId, sessionId); const request = await API_1.default(apiUrl, 'GET'); if (request.status === 200) { const response = await request.json(); const userId = response.data.session.user.id; return userId; } return ''; }; /** * Search for users in CeleraOne * * @param { SearchUserOptions } query Query parameters * @throws { InternalErrorResponse[] } * @returns { Promise<SearchUserResponse> } a object of the users and total found */ exports.searchUser = async (query) => { const apiUrl = UrlUtil_1.buildQueryString(API_1.Endpoints.SEARCH_USER, query); const request = await API_1.default(apiUrl, 'GET'); if (request.status === 200) { const response = await request.json(); const result = { count: response.data.count_total, users: response.data.users }; return result; } return { count: 0, users: [] }; }; /** * Get a single User Property of a CeleraOne User * * @param { string } userId The CelereaOne userId * @param { string } property The User Propety * @throws { InternalErrorResponse[] } * @returns { Promise<string> } a string of the User Property value */ exports.getUserSingleProperty = async (userId, property) => { const apiUrl = printf_1.default(API_1.Endpoints.GET_USER_SINGLE_PROPERTY, userId, property); const request = await API_1.default(apiUrl, 'GET'); if (request.status === 200) { const response = await request.json(); return response.data.value; } return ''; }; /** * Change the Login Alias for the CeleraOne User * * @param userId The CeleraOne userID * @param loginAlias The Login Alias that the user will change to * @throws { InternalErrorResponse[] } * @returns { Promise<string> } a string if the operation was successfull */ exports.changeUserLoginAlias = async (userId, login_alias) => { const apiUrl = printf_1.default(API_1.Endpoints.CHANGE_USER_LOGIN_ALIAS, userId); const request = await API_1.default(apiUrl, 'PUT', { login_alias }); if (request.status === 200) { const response = await request.json(); return response.status; } return ''; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVXNlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUF1QztBQUd2QyxvREFBMkI7QUFHM0IsNkRBQW9DO0FBR3BDLDhDQUFtRDtBQUNuRCxrRUFBeUM7QUFFekM7Ozs7O0dBS0c7QUFDVSxRQUFBLFVBQVUsR0FBRyxLQUFLLEVBQUUsSUFBbUIsRUFBbUIsRUFBRTtJQUN4RSxNQUFNLE9BQU8sR0FBUTtRQUNwQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7UUFDdEMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZO1FBQ2hDLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLE1BQU0sRUFBRSxJQUFJO1FBQ1osa0JBQWtCLEVBQUUsQ0FBQyxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsQ0FBQztRQUN0SCxXQUFXLEVBQUU7WUFDWixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNqQjtLQUNELENBQUE7SUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssc0JBQVksQ0FBQyxNQUFNLEVBQUU7UUFDOUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO0tBQ3ZDO1NBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLHNCQUFZLENBQUMsS0FBSyxFQUFFO1FBQ3BELE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtLQUNoQztJQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBRyxDQUFDLGVBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO0lBRXJDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDM0IsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtLQUM1QjtJQUVELE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQTtBQUN0QixDQUFDLENBQUE7QUFFRDs7Ozs7Ozs7R0FRRztBQUNVLFFBQUEsZUFBZSxHQUFHLEtBQUssRUFBRSxNQUFjLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFBb0IsRUFBRTtJQUN0RyxNQUFNLE1BQU0sR0FBRyxnQkFBTSxDQUFDLGVBQVMsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQzFELE1BQU0sUUFBUSxHQUE0QixNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUU5RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO1FBQzNCLE9BQU8sSUFBSSxDQUFBO0tBQ1g7SUFFRCxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUE7QUFDdEIsQ0FBQyxDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ1UsUUFBQSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBb0IsRUFBRTtJQUMxRixNQUFNLE1BQU0sR0FBRyxnQkFBTSxDQUFDLGVBQVMsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMzQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFBO0FBQzlCLENBQUMsQ0FBQTtBQUVEOzs7Ozs7R0FNRztBQUNVLFFBQUEsUUFBUSxHQUFHLEtBQUssRUFBRSxZQUFvQixFQUF5QixFQUFFO0lBQzdFLE1BQU0sTUFBTSxHQUFHLGdCQUFNLENBQUMsZUFBUyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFckMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtRQUMzQixNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDMUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFBO1FBRXRFLE9BQU87WUFDTixNQUFNLEVBQUUsT0FBTztZQUNmLEtBQUs7WUFDTCxZQUFZLEVBQUUsYUFBYTtZQUMzQixvQkFBb0IsRUFBRSxXQUFXO1lBQ2pDLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFFBQVEsRUFBRSxTQUFTO1lBQ25CLEtBQUs7U0FDVyxDQUFBO0tBQ2pCO0lBRUQsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFBO0FBQ3RCLENBQUMsQ0FBQTtBQUVEOzs7Ozs7O0dBT0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHLEtBQUssRUFBRSxNQUFjLEVBQUUsWUFBMEIsRUFBRSxRQUFnQixFQUFvQixFQUFFO0lBQzFILE1BQU0sWUFBWSxHQUFHLFlBQVksS0FBSyxzQkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7SUFDeEYsTUFBTSxNQUFNLEdBQUcsZ0JBQU0sQ0FBQyxlQUFTLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBRTNFLElBQUksU0FBUyxDQUFBO0lBQ2IsSUFBSSxZQUFZLEtBQUssc0JBQVksQ0FBQyxNQUFNLEVBQUU7UUFDekMsU0FBUyxHQUFHO1lBQ1gsYUFBYSxFQUFFLFFBQVE7WUFDdkIsY0FBYyxFQUFFLFNBQVM7U0FDekIsQ0FBQTtLQUNEO1NBQU0sSUFBSSxZQUFZLEtBQUssc0JBQVksQ0FBQyxLQUFLLEVBQUU7UUFDL0MsU0FBUyxHQUFHO1lBQ1gsWUFBWSxFQUFFLFFBQVE7U0FDdEIsQ0FBQTtLQUNEO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUVuRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO1FBQzNCLE9BQU8sSUFBSSxDQUFBO0tBQ1g7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNiLENBQUMsQ0FBQTtBQUVEOzs7Ozs7O0dBT0c7QUFDVSxRQUFBLGVBQWUsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLFFBQWdCLEVBQW9CLEVBQUU7SUFDM0YsTUFBTSxNQUFNLEdBQUcsZ0JBQU0sQ0FBQyxlQUFTLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDMUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTdELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUE7S0FDWDtJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3JDLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQTtBQUN0QixDQUFDLENBQUE7QUFFRDs7Ozs7OztHQU9HO0FBQ1UsUUFBQSxvQkFBb0IsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLElBQXlCLEVBQW9CLEVBQUU7SUFDekcsTUFBTSxNQUFNLEdBQUcsZ0JBQU0sQ0FBQyxlQUFTLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUVoRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO1FBQzNCLE9BQU8sSUFBSSxDQUFBO0tBQ1g7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNyQyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUE7QUFDdEIsQ0FBQyxDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ1UsUUFBQSxTQUFTLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBb0IsRUFBRTtJQUNuRSxNQUFNLE1BQU0sR0FBRyxnQkFBTSxDQUFDLGVBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbkQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBRXpDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUE7S0FDWDtJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2IsQ0FBQyxDQUFBO0FBRUQ7Ozs7Ozs7R0FPRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsS0FBSyxFQUFFLFNBQWlCLEVBQUUsU0FBb0IsRUFBbUIsRUFBRTtJQUN4RyxNQUFNLE1BQU0sR0FBRyxnQkFBTSxDQUFDLGVBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUV4QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO1FBQzNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUE7UUFFNUMsT0FBTyxNQUFNLENBQUE7S0FDYjtJQUVELE9BQU8sRUFBRSxDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ1UsUUFBQSxVQUFVLEdBQUcsS0FBSyxFQUFFLEtBQXdCLEVBQStCLEVBQUU7SUFDekYsTUFBTSxNQUFNLEdBQUcsMEJBQWdCLENBQUMsZUFBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUM3RCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFFeEMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtRQUMzQixNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUVyQyxNQUFNLE1BQU0sR0FBdUI7WUFDbEMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVztZQUNoQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLO1NBQzFCLENBQUE7UUFFRCxPQUFPLE1BQU0sQ0FBQTtLQUNiO0lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFBO0FBQy9CLENBQUMsQ0FBQTtBQUVEOzs7Ozs7O0dBT0c7QUFDVSxRQUFBLHFCQUFxQixHQUFHLEtBQUssRUFBRSxNQUFjLEVBQUUsUUFBZ0IsRUFBbUIsRUFBRTtJQUNoRyxNQUFNLE1BQU0sR0FBRyxnQkFBTSxDQUFDLGVBQVMsQ0FBQyx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDM0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXhDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDckMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQTtLQUMxQjtJQUVELE9BQU8sRUFBRSxDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUQ7Ozs7Ozs7R0FPRztBQUNVLFFBQUEsb0JBQW9CLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBRSxXQUFtQixFQUFtQixFQUFFO0lBQ2xHLE1BQU0sTUFBTSxHQUFHLGdCQUFNLENBQUMsZUFBUyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBRXpELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDckMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFBO0tBQ3RCO0lBRUQsT0FBTyxFQUFFLENBQUE7QUFDVixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQVBJLCB7IEVuZHBvaW50cyB9IGZyb20gJy4uL0FQSSdcbmltcG9ydCBVc2VySW50ZXJmYWNlIGZyb20gJy4uL0FQSS9JbnRlcm5hbC9Vc2VySW50ZXJmYWNlJ1xuaW1wb3J0IEFkZFVzZXJQcm9wZXJ0eVJlc3BvbnNlIGZyb20gJy4uL0FQSS9JbnRlcm5hbC9BZGRVc2VyUHJvcGVydHlSZXNwb25zZSdcbmltcG9ydCBwcmludGYgZnJvbSAncHJpbnRmJ1xuaW1wb3J0IFVzZXJSZXNwb25zZSBmcm9tICcuL1VzZXJSZXNwb25zZSdcbmltcG9ydCBNYXN0ZXJEYXRhSW50ZXJmYWNlIGZyb20gJy4uL0FQSS9JbnRlcm5hbC9NYXN0ZXJEYXRhSW50ZXJmYWNlJ1xuaW1wb3J0IFNlcnZpY2VJZCBmcm9tICcuLi9TZXJ2aWNlSWQnXG5pbXBvcnQgU2VhcmNoVXNlck9wdGlvbnMgZnJvbSAnLi4vQVBJL0ludGVybmFsL1NlYXJjaFVzZXJPcHRpb25zJ1xuaW1wb3J0IFNlYXJjaFVzZXJSZXNwb25zZSBmcm9tICcuL1NlYXJjaFVzZXJSZXNwb25zZSdcbmltcG9ydCB7IGJ1aWxkUXVlcnlTdHJpbmcgfSBmcm9tICcuLi9VdGlscy9VcmxVdGlsJ1xuaW1wb3J0IFBhc3N3b3JkVHlwZSBmcm9tICcuL1Bhc3N3b3JkVHlwZSdcblxuLyoqXG4gKiBJbXBvcnQgYSBuZXcgdXNlciBpbnRvIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB7IFVzZXJJbnRlcmZhY2UgfSB1c2VyIFRoZSB1c2VyIG9iamVjdCB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZFxuICogQHJldHVybnMgeyBQcm9taXNlPEltcG9ydFVzZXJSZXNwb25zZT4gfVxuICovXG5leHBvcnQgY29uc3QgaW1wb3J0VXNlciA9IGFzeW5jICh1c2VyOiBVc2VySW50ZXJmYWNlKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcblx0Y29uc3QgYm9keVJlcTogYW55ID0ge1xuXHRcdGxvZ2luOiB1c2VyLmVtYWlsLFxuXHRcdGxvZ2luX2FsaWFzOiB1c2VyLnNvY2lhbFNlY3VyaXR5TnVtYmVyLFxuXHRcdGNvbnRyYWN0b3JfaWQ6IHVzZXIuY29udHJhY3RvcklkLFxuXHRcdGhhc2hfYWxnb3JpdGhtOiAnZGVmYXVsdCcsXG5cdFx0YWN0aXZlOiB0cnVlLFxuXHRcdGFjdGl2YXRlZF9zZXJ2aWNlczogW1NlcnZpY2VJZC5HUCwgU2VydmljZUlkLkhOLCBTZXJ2aWNlSWQuSFAsIFNlcnZpY2VJZC5UVCwgU2VydmljZUlkLkJOLCBTZXJ2aWNlSWQuU1QsIFNlcnZpY2VJZC5BVF0sXG5cdFx0bWFzdGVyX2RhdGE6IHtcblx0XHRcdGZpcnN0X25hbWU6IHVzZXIuZmlyc3ROYW1lLFxuXHRcdFx0bGFzdF9uYW1lOiB1c2VyLmxhc3ROYW1lLFxuXHRcdFx0ZW1haWw6IHVzZXIuZW1haWxcblx0XHR9XG5cdH1cblxuXHRpZiAodXNlci5wYXNzd29yZFR5cGUgPT09IFBhc3N3b3JkVHlwZS5IQVNIRUQpIHtcblx0XHRib2R5UmVxLmhhc2hlZF9wYXNzd29yZCA9IHVzZXIucGFzc3dvcmRcblx0fSBlbHNlIGlmICh1c2VyLnBhc3N3b3JkVHlwZSA9PT0gUGFzc3dvcmRUeXBlLlBMQUlOKSB7XG5cdFx0Ym9keVJlcS5wYXNzd29yZCA9IHVzZXIucGFzc3dvcmRcblx0fVxuXHRjb25zdCByZXF1ZXN0ID0gYXdhaXQgQVBJKEVuZHBvaW50cy5JTVBPUlRfVVNFUiwgJ1BPU1QnLCBib2R5UmVxKVxuXHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuanNvbigpXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRyZXR1cm4gcmVzcG9uc2UuZGF0YS51c2VyX2lkXG5cdH1cblxuXHR0aHJvdyByZXNwb25zZS5lcnJvcnNcbn1cblxuLyoqXG4gKiBBZGQgYSBwcm9wZXJ0eSB0byB0aGUgdXNlciBpbiBDZWxlcmFPbmVcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSB7IHN0cmluZyB9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0geyBzdHJpbmcgfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPFVzZXJQcm9wZXJ0eVJlc3BvbnNlPiB9IGEgYm9vbGVhbiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZFVzZXJQcm9wZXJ0eSA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuU0FWRV9VU0VSX1BST1BFUlRZLCB1c2VySWQsICdHUCcpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnUE9TVCcsIHsgbmFtZSwgdmFsdWUgfSlcblx0Y29uc3QgcmVzcG9uc2U6IEFkZFVzZXJQcm9wZXJ0eVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblxuXHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuXHRcdHJldHVybiB0cnVlXG5cdH1cblxuXHR0aHJvdyByZXNwb25zZS5lcnJvcnNcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBwcm9wZXJ0eSBmcm9tIHRoZSB1c2VyIGluIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB7IHN0cmluZyB9IHVzZXJJZCBUaGUgdXNlcklkIG9mIHRoZSBDZWxlcmFPbmUgdXNlclxuICogQHBhcmFtIHsgc3RyaW5nIH0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEByZXR1cm5zIHsgUHJvbWlzZTxib29sZWFuPiB9IGEgYm9vbGVhbiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXJQcm9wZXJ0eSA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuREVMRVRFX1VTRVJfUFJPUEVSVFksIHVzZXJJZCwgJ0dQJywgbmFtZSlcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdERUxFVEUnKVxuXHRyZXR1cm4gcmVxdWVzdC5zdGF0dXMgPT09IDIwNFxufVxuXG4vKipcbiAqIEZpbmQgYW5kIHJldHVybiBhIHVzZXIgb2JqZWN0IGZyb20gQ2VsZXJhT25lXG4gKlxuICogQHBhcmFtIHsgc3RyaW5nIH0gY29udHJhY3RvcklkIFRoZSBjb250cmFjdG9ySWQgb2YgdGhlIHVzZXJcbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8VXNlclJlc3BvbnNlPiB9IFByb21pc2Ugb2JqZWN0IG9mIFVzZXJSZXNwb25zZSB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBmaW5kVXNlciA9IGFzeW5jIChjb250cmFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8VXNlclJlc3BvbnNlPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuRklORF9VU0VSLCBjb250cmFjdG9ySWQpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnR0VUJylcblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0Y29uc3QgeyB1c2VyX2lkLCBsb2dpbiwgYWNjb3VudF9zdGF0ZSwgbG9naW5fYWxpYXMgIH0gPSByZXNwb25zZS5kYXRhLnVzZXJcblx0XHRjb25zdCB7IGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgZW1haWwgfSA9IHJlc3BvbnNlLmRhdGEudXNlci5tYXN0ZXJkYXRhXG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcklkOiB1c2VyX2lkLFxuXHRcdFx0bG9naW4sXG5cdFx0XHRhY2NvdW50U3RhdGU6IGFjY291bnRfc3RhdGUsXG5cdFx0XHRzb2NpYWxTZWN1cml0eU51bWJlcjogbG9naW5fYWxpYXMsXG5cdFx0XHRmaXJzdE5hbWU6IGZpcnN0X25hbWUsXG5cdFx0XHRsYXN0TmFtZTogbGFzdF9uYW1lLFxuXHRcdFx0ZW1haWxcblx0XHR9IGFzIFVzZXJSZXNwb25zZVxuXHR9XG5cblx0dGhyb3cgcmVzcG9uc2UuZXJyb3JzXG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSB1c2VycyBwYXNzd29yZCB3aXRoIGEgbmV3IGJjcnlwdCBoYXNoIGluIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSBwYXNzd29yZEhhc2ggVGhlIGJjcnlwdCBwYXNzd29yZCBoYXNoXG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPGJvb2xlYW4+IH0gYSBib29sZWFuIGlmIHRoZSBvcGVyYXRpb24gYXMgc3VjY2Vzc2Z1bGwgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVVc2VyUGFzc3dvcmQgPSBhc3luYyAodXNlcklkOiBzdHJpbmcsIHBhc3N3b3JkVHlwZTogUGFzc3dvcmRUeXBlLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGVuZHBvaW50VHlwZSA9IHBhc3N3b3JkVHlwZSA9PT0gUGFzc3dvcmRUeXBlLkhBU0hFRCA/ICdwYXNzd29yZF9oYXNoJyA6ICdwYXNzd29yZCdcblx0Y29uc3QgYXBpVXJsID0gcHJpbnRmKEVuZHBvaW50cy5VUERBVEVfVVNFUl9QQVNTV09SRCwgdXNlcklkLCBlbmRwb2ludFR5cGUpXG5cblx0bGV0IHJlcVBhcmFtc1xuXHRpZiAocGFzc3dvcmRUeXBlID09PSBQYXNzd29yZFR5cGUuSEFTSEVEKSB7XG5cdFx0cmVxUGFyYW1zID0ge1xuXHRcdFx0cGFzc3dvcmRfaGFzaDogcGFzc3dvcmQsXG5cdFx0XHRoYXNoX2FsZ29yaXRobTogJ2RlZmF1bHQnXG5cdFx0fVxuXHR9IGVsc2UgaWYgKHBhc3N3b3JkVHlwZSA9PT0gUGFzc3dvcmRUeXBlLlBMQUlOKSB7XG5cdFx0cmVxUGFyYW1zID0ge1xuXHRcdFx0bmV3X3Bhc3N3b3JkOiBwYXNzd29yZFxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnUFVUJywgcmVxUGFyYW1zKVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0cmV0dXJuIHRydWVcblx0fVxuXG5cdHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgdXNlcnMgbG9naW5cbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSB7IHN0cmluZyB9IG5ld0xvZ2luIFRoZSBuZXcgbG9naW4gZm9yIHRoZSB1c2VyXG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPGJvb2xlYW4+IH0gYSBib29sZWFuIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWxsIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlckxvZ2luID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCBuZXdMb2dpbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuVVBEQVRFX1VTRVJfTE9HSU4sIHVzZXJJZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdQVVQnLCB7IGxvZ2luOiBuZXdMb2dpbiB9KVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0cmV0dXJuIHRydWVcblx0fVxuXG5cdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblx0dGhyb3cgcmVzcG9uc2UuZXJyb3JzXG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBNYXN0ZXJEYXRhIGZvciB0aGUgc2VsZWN0ZWQgQ2VsZXJhT25lIHVzZXJcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSB7IE1hc3RlckRhdGFJbnRlcmZhY2UgfSBkYXRhIFRoZSBkYXRhIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGZvciB0aGUgdXNlclxuICogQHRocm93cyB7IEludGVybmFsRXJyb3JSZXNwb25zZVtdIH1cbiAqIEByZXR1cm5zIHsgUHJvbWlzZTxib29sZWFuPiB9IGEgYm9vbGVhbiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVVzZXJNYXN0ZXJEYXRhID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCBkYXRhOiBNYXN0ZXJEYXRhSW50ZXJmYWNlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuVVBEQVRFX1VTRVJfTUFTVEVSX0RBVEEsIHVzZXJJZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdQQVRDSCcsIGRhdGEpXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRyZXR1cm4gdHJ1ZVxuXHR9XG5cblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuXHR0aHJvdyByZXNwb25zZS5lcnJvcnNcbn1cblxuLyoqXG4gKiBQdXJnZS9EZWxldGUgdGhlIHVzZXIgZnJvbSBDZWxlcmFPbmVcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8Ym9vbGVhbj4gfSBhIGJvb2xlYW4gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bGwgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBwdXJnZVVzZXIgPSBhc3luYyAodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcblx0Y29uc3QgYXBpVXJsID0gcHJpbnRmKEVuZHBvaW50cy5QVVJHRV9VU0VSLCB1c2VySWQpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnUE9TVCcpXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRyZXR1cm4gdHJ1ZVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogR2V0IHRoZSB1c2VySWQgdmlhIHRoZSB1c2VycyBzZXNzaW9uX2lkIHZhbHVlXG4gKlxuICogQHBhcmFtIHsgc3RyaW5nIH0gc2Vzc2lvbklkIFRoZSB1c2VycyBDZWxlcmFPbmUgc2Vzc2lvbl9pZFxuICogQHBhcmFtIHsgU2VydmljZUlkIH0gc2VydmljZUlkIENlbGVyYU9uZSdzIHNlcnZpY2VfaWRcbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8c3RyaW5nPiB9IHRoZSB1c2VySWQgZm9yIHRoZSB1c2VyXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRVc2VySWRGcm9tU2Vzc2lvbklkID0gYXN5bmMgKHNlc3Npb25JZDogc3RyaW5nLCBzZXJ2aWNlSWQ6IFNlcnZpY2VJZCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuVVNFUl9TRVNTSU9OLCBzZXJ2aWNlSWQsIHNlc3Npb25JZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdHRVQnKVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuXHRcdGNvbnN0IHVzZXJJZCA9IHJlc3BvbnNlLmRhdGEuc2Vzc2lvbi51c2VyLmlkXG5cblx0XHRyZXR1cm4gdXNlcklkXG5cdH1cblxuXHRyZXR1cm4gJydcbn1cblxuLyoqXG4gKiBTZWFyY2ggZm9yIHVzZXJzIGluIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB7IFNlYXJjaFVzZXJPcHRpb25zIH0gcXVlcnkgUXVlcnkgcGFyYW1ldGVyc1xuICogQHRocm93cyB7IEludGVybmFsRXJyb3JSZXNwb25zZVtdIH1cbiAqIEByZXR1cm5zIHsgUHJvbWlzZTxTZWFyY2hVc2VyUmVzcG9uc2U+IH0gYSBvYmplY3Qgb2YgdGhlIHVzZXJzIGFuZCB0b3RhbCBmb3VuZFxuICovXG5leHBvcnQgY29uc3Qgc2VhcmNoVXNlciA9IGFzeW5jIChxdWVyeTogU2VhcmNoVXNlck9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFVzZXJSZXNwb25zZT4gPT4ge1xuXHRjb25zdCBhcGlVcmwgPSBidWlsZFF1ZXJ5U3RyaW5nKEVuZHBvaW50cy5TRUFSQ0hfVVNFUiwgcXVlcnkpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnR0VUJylcblxuXHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblxuXHRcdGNvbnN0IHJlc3VsdDogU2VhcmNoVXNlclJlc3BvbnNlID0ge1xuXHRcdFx0Y291bnQ6IHJlc3BvbnNlLmRhdGEuY291bnRfdG90YWwsXG5cdFx0XHR1c2VyczogcmVzcG9uc2UuZGF0YS51c2Vyc1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHRcblx0fVxuXG5cdHJldHVybiB7IGNvdW50OiAwLCB1c2VyczogW10gfVxufVxuXG4vKipcbiAqIEdldCBhIHNpbmdsZSBVc2VyIFByb3BlcnR5IG9mIGEgQ2VsZXJhT25lIFVzZXJcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIENlbGVyZWFPbmUgdXNlcklkXG4gKiBAcGFyYW0geyBzdHJpbmcgfSBwcm9wZXJ0eSBUaGUgVXNlciBQcm9wZXR5XG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPHN0cmluZz4gfSBhIHN0cmluZyBvZiB0aGUgVXNlciBQcm9wZXJ0eSB2YWx1ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0VXNlclNpbmdsZVByb3BlcnR5ID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcblx0Y29uc3QgYXBpVXJsID0gcHJpbnRmKEVuZHBvaW50cy5HRVRfVVNFUl9TSU5HTEVfUFJPUEVSVFksIHVzZXJJZCwgcHJvcGVydHkpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnR0VUJylcblxuXHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblx0XHRyZXR1cm4gcmVzcG9uc2UuZGF0YS52YWx1ZVxuXHR9XG5cblx0cmV0dXJuICcnXG59XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBMb2dpbiBBbGlhcyBmb3IgdGhlIENlbGVyYU9uZSBVc2VyXG4gKlxuICogQHBhcmFtIHVzZXJJZCBUaGUgQ2VsZXJhT25lIHVzZXJJRFxuICogQHBhcmFtIGxvZ2luQWxpYXMgVGhlIExvZ2luIEFsaWFzIHRoYXQgdGhlIHVzZXIgd2lsbCBjaGFuZ2UgdG9cbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8c3RyaW5nPiB9IGEgc3RyaW5nIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWxsXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFuZ2VVc2VyTG9naW5BbGlhcyA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgbG9naW5fYWxpYXM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuQ0hBTkdFX1VTRVJfTE9HSU5fQUxJQVMsIHVzZXJJZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdQVVQnLCB7IGxvZ2luX2FsaWFzIH0pXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuanNvbigpXG5cdFx0cmV0dXJuIHJlc3BvbnNlLnN0YXR1c1xuXHR9XG5cblx0cmV0dXJuICcnXG59Il19