1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/app/pages/roles/rolePermissions.tsx");if (!window.$RefreshReg$) throw new Error("React refresh preamble was not loaded. Something is wrong."); 2const prevRefreshReg = window.$RefreshReg$; 3const prevRefreshSig = window.$RefreshSig$; 4window.$RefreshReg$ = RefreshRuntime.getRefreshReg("/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx"); 5window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform; 6 7import * as RefreshRuntime from "/@react-refresh"; 8 9import __vite__cjsImport1_react_jsxDevRuntime from "/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=e8ce80ae"; const _jsxDEV = __vite__cjsImport1_react_jsxDevRuntime["jsxDEV"]; 10var _s = $RefreshSig$(); 11import __vite__cjsImport2_react from "/node_modules/.vite/deps/react.js?v=e8ce80ae"; const React = __vite__cjsImport2_react.__esModule ? __vite__cjsImport2_react.default : __vite__cjsImport2_react; const useEffect = __vite__cjsImport2_react["useEffect"]; const useState = __vite__cjsImport2_react["useState"]; 12import { Link, useLocation, useNavigate } from "/node_modules/.vite/deps/react-router-dom.js?v=e8ce80ae"; 13import axios from "/node_modules/.vite/deps/axios.js?v=e8ce80ae"; 14import { CUREENT_COMPANY_NAME, GET_PERMISSIONS_BY_ROLE_ID, POST_ROLE_PERMISSIONS_BY_ROLE_ID } from "/src/app/Constants.tsx"; 15import { TextField } from "/node_modules/.vite/deps/@mui_material.js?v=e8ce80ae"; 16import { Content } from "/src/config/layout/components/Content.tsx"; 17import "/src/app/pages/roles/css/rolePermissions.scss"; 18import { disableSplashScreen, enableSplashScreen } from "/src/app/pages/common/CommonUtilities.tsx"; 19import { useAxiosInterceptor } from "/src/app/useAxiosInterceptor.ts"; 20export function EditRolePermissions() { 21 _s(); 22 useAxiosInterceptor(); 23 const location = useLocation(); 24 const queryParams = new URLSearchParams(location.search); 25 let roleId = queryParams.get('roleId'); 26 // State to hold role details 27 const [roleDetails, setRoleDetails] = useState(null); 28 const [originalPermissions, setOriginalPermissions] = useState([]); 29 const [removedPermissions, setRemovedPermissions] = useState([]); // Store UUIDs of removed permissions 30 const [addedPermissions, setAddedPermissions] = useState([]); 31 const navigate = useNavigate(); 32 useEffect(()=>{ 33 const fetchRoleDetails = async (roleId)=>{ 34 if (!roleId) { 35 console.error("roleId is null."); 36 return; 37 } 38 try { 39 enableSplashScreen(); 40 const url = GET_PERMISSIONS_BY_ROLE_ID(CUREENT_COMPANY_NAME).replace('{roleId}', roleId); 41 const response = await axios.get(url); 42 setRoleDetails(response.data); // Set the fetched data to state 43 // Set original permissions to only those that are selected 44 const selectedPermissions = response.data.permissionDetailsDTO.filter((dto)=>dto.isSelected); 45 setOriginalPermissions(selectedPermissions); // Set original permissions 46 } catch (error) { 47 console.error("Error fetching role details:", error); 48 } finally{ 49 disableSplashScreen(); 50 } 51 }; 52 fetchRoleDetails(roleId); 53 }, [ 54 roleId 55 ]); // Dependency array to re-run effect if roleId changes 56 // Handle change for the role name 57 const handleRoleNameChange = (newName)=>{ 58 if (roleDetails) { 59 setRoleDetails({ 60 ...roleDetails, 61 name: newName 62 }); 63 } 64 }; 65 const handleCheckboxChange = (id)=>{ 66 if (roleDetails) { 67 const updatedPermissions = roleDetails.permissionDetailsDTO.map((dto)=>dto.id === id ? { 68 ...dto, 69 isSelected: !dto.isSelected 70 } : dto); 71 setRoleDetails({ 72 ...roleDetails, 73 permissionDetailsDTO: updatedPermissions 74 }); 75 const permission = updatedPermissions.find((dto)=>dto.id === id); 76 if (permission) { 77 if (!permission.isSelected) { 78 // If the permission is being unchecked 79 const originalPermission = originalPermissions.find((original)=>original.id === permission.id); 80 if (originalPermission) { 81 // If it exists in originalPermissions, add it to removedPermissions 82 setRemovedPermissions((prev)=>[ 83 ...prev, 84 originalPermission.uuid 85 ]); 86 } 87 } else { 88 // If the permission is being checked 89 setRemovedPermissions((prev)=>prev.filter((uuid)=>uuid !== permission.uuid)); 90 } 91 } 92 // Determine added permissions 93 const addedPermissions = updatedPermissions.filter((updated)=>updated.isSelected && !originalPermissions.some((original)=>original.id === updated.id)); 94 setAddedPermissions(addedPermissions.map((p)=>p.uuid)); 95 } 96 }; 97 const handleSave = async ()=>{ 98 console.log("added Permissions are " + addedPermissions); 99 console.log("removed Permissions are " + removedPermissions); 100 if (!roleId) { 101 console.error("roleId is null."); 102 return; 103 } 104 try { 105 enableSplashScreen();
106 let url = POST_ROLE_PERMISSIONS_BY_ROLE_ID(CUREENT_COMPANY_NAME).replace('{roleId}', roleId); 107 console.log("Updated roleApiUrl: ", url); 108 // Create a new object to send 109 const dataToSend = { 110 ...roleDetails, 111 addPermissions: addedPermissions, 112 removePermissions: removedPermissions // Add the removedPermissions 113 }; 114 const response = await axios.post(url, dataToSend); 115 console.log("Response:", response.data); 116 if (response.status === 200) { 117 console.log("permissions updated"); 118 navigate(`/${CUREENT_COMPANY_NAME}/administration/roles?role=${roleDetails?.name}`); 119 } 120 } catch (error) { 121 console.error("Error saving permissions:", error); 122 } finally{ 123 disableSplashScreen(); 124 } 125 }; 126 return /*#__PURE__*/ _jsxDEV(Content, { 127 children: /*#__PURE__*/ _jsxDEV("div", { 128 className: "container-fluid role-permissions", 129 children: roleDetails ? /*#__PURE__*/ _jsxDEV("form", { 130 children: [ 131 /*#__PURE__*/ _jsxDEV("div", { 132 className: "container", 133 children: [ 134 /*#__PURE__*/ _jsxDEV("h3", { 135 className: "edit_heading", 136 children: [ 137 "Edit Role of ", 138 roleDetails.name || '' 139 ] 140 }, void 0, true, { 141 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 142 lineNumber: 154, 143 columnNumber: 29 144 }, this), 145 /*#__PURE__*/ _jsxDEV("div", { 146 className: "role_name", 147 children: /*#__PURE__*/ _jsxDEV(TextField, { 148 type: "text", 149 value: roleDetails.name || '', 150 name: "rolename", 151 label: "Role Name", 152 onChange: (e)=>handleRoleNameChange(e.target.value) 153 }, void 0, false, { 154 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 155 lineNumber: 156, 156 columnNumber: 33 157 }, this) 158 }, void 0, false, { 159 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 160 lineNumber: 155, 161 columnNumber: 29 162 }, this), 163 /*#__PURE__*/ _jsxDEV("div", { 164 className: "permissions", 165 children: roleDetails.permissionDetailsDTO.map((dto)=>/*#__PURE__*/ _jsxDEV("div", { 166 className: "permission_name", 167 children: [ 168 /*#__PURE__*/ _jsxDEV("input", { 169 type: "checkbox", 170 name: "permissionValue", 171 className: "permission_checkbox", 172 checked: dto.isSelected, 173 onChange: ()=>handleCheckboxChange(dto.id) 174 }, void 0, false, { 175 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 176 lineNumber: 167, 177 columnNumber: 41 178 }, this), 179 /*#__PURE__*/ _jsxDEV("label", { 180 children: dto.name 181 }, void 0, false, { 182 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 183 lineNumber: 174, 184 columnNumber: 41 185 }, this) 186 ] 187 }, dto.id, true, { 188 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 189 lineNumber: 166, 190 columnNumber: 37 191 }, this)) 192 }, void 0, false, { 193 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 194 lineNumber: 164, 195 columnNumber: 29 196 }, this) 197 ] 198 }, void 0, true, { 199 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 200 lineNumber: 152, 201 columnNumber: 25 202 }, this), 203 /*#__PURE__*/ _jsxDEV("div", { 204 className: "action-btns", 205 children: [ 206 /*#__PURE__*/ _jsxDEV("div", { 207 className: "btn btn-primary mx-3", 208 onClick: handleSave, 209 children: "Save" 210 }, void 0, false, { 211 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 212 lineNumber: 181, 213 columnNumber: 29 214 }, this), 215 /*#__PURE__*/ _jsxDEV(Link, { 216 className: "btn btn-dark", 217 to: `/${CUREENT_COMPANY_NAME}/administration/roles`, 218 children: "Cancel" 219 }, void 0, false, { 220 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 221 lineNumber: 182, 222 columnNumber: 29 223 }, this) 224 ] 225 }, void 0, true, { 226 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 227 lineNumber: 180, 228 columnNumber: 25 229 }, this) 230 ] 231 }, void 0, true, { 232 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 233 lineNumber: 151, 234 columnNumber: 21 235 }, this) : /*#__PURE__*/ _jsxDEV("p", {
236 children: "No Permissions assigned to this role." 237 }, void 0, false, { 238 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 239 lineNumber: 188, 240 columnNumber: 21 241 }, this) 242 }, void 0, false, { 243 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 244 lineNumber: 149, 245 columnNumber: 13 246 }, this) 247 }, void 0, false, { 248 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", 249 lineNumber: 148, 250 columnNumber: 9 251 }, this); 252} 253_s(EditRolePermissions, "qnxw/xgGFs3vf+ppRC215VXHdic=", false, function() { 254 return [ 255 useAxiosInterceptor, 256 useLocation, 257 useNavigate 258 ]; 259}); 260_c = EditRolePermissions; 261var _c; 262$RefreshReg$(_c, "EditRolePermissions"); 263 264 265window.$RefreshReg$ = prevRefreshReg; 266window.$RefreshSig$ = prevRefreshSig; 267 268RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => { 269 RefreshRuntime.registerExportsForReactRefresh("/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", currentExports); 270 import.meta.hot.accept((nextExports) => { 271 if (!nextExports) return; 272 const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", currentExports, nextExports); 273 if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage); 274 }); 275}); 276 277//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJvbGVQZXJtaXNzaW9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rLCB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyAgQ1VSRUVOVF9DT01QQU5ZX05BTUUsIEdFVF9QRVJNSVNTSU9OU19CWV9ST0xFX0lELCBQT1NUX1JPTEVfUEVSTUlTU0lPTlNfQllfUk9MRV9JRCB9IGZyb20gJy4uLy4uL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IENvbnRlbnQgfSBmcm9tICcuLi8uLi8uLi9jb25maWcvbGF5b3V0L2NvbXBvbmVudHMvQ29udGVudCc7XG5pbXBvcnQgXCIuL2Nzcy9yb2xlUGVybWlzc2lvbnMuc2Nzc1wiO1xuaW1wb3J0IHsgZGlzYWJsZVNwbGFzaFNjcmVlbiwgZW5hYmxlU3BsYXNoU2NyZWVuIH0gZnJvbSAnLi4vY29tbW9uL0NvbW1vblV0aWxpdGllcyc7XG5pbXBvcnQgeyB1c2VBeGlvc0ludGVyY2VwdG9yIH0gZnJvbSAnLi4vLi4vdXNlQXhpb3NJbnRlcmNlcHRvcic7XG5cblxuXG50eXBlIFBlcm1pc3Npb25EZXRhaWxzRFRPID0ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgdXVpZDogc3RyaW5nOyAvLyBBc3N1bWluZyB5b3UgaGF2ZSBhIFVVSUQgZmllbGQgaW4geW91ciBwZXJtaXNzaW9uIGRldGFpbHNcbn07XG5cbnR5cGUgUm9sZURldGFpbHNEVE8gPSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uRGV0YWlsc0RUTzogUGVybWlzc2lvbkRldGFpbHNEVE9bXTtcbiAgICBhZGRQZXJtaXNzaW9uczpbXTtcbiAgICByZW1vdmVQZXJtaXNzaW9uczpbXTtcbn07XG5cblxuZXhwb3J0IGZ1bmN0aW9uIEVkaXRSb2xlUGVybWlzc2lvbnMoKSB7XG4gICAgdXNlQXhpb3NJbnRlcmNlcHRvcigpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICBsZXQgcm9sZUlkID0gcXVlcnlQYXJhbXMuZ2V0KCdyb2xlSWQnKTtcblxuICAgIC8vIFN0YXRlIHRvIGhvbGQgcm9sZSBkZXRhaWxzXG4gICAgY29uc3QgW3JvbGVEZXRhaWxzLCBzZXRSb2xlRGV0YWlsc10gPSB1c2VTdGF0ZTxSb2xlRGV0YWlsc0RUTyB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IFtvcmlnaW5hbFBlcm1pc3Npb25zLCBzZXRPcmlnaW5hbFBlcm1pc3Npb25zXSA9IHVzZVN0YXRlPFBlcm1pc3Npb25EZXRhaWxzRFRPW10+KFtdKTtcbiAgICBjb25zdCBbcmVtb3ZlZFBlcm1pc3Npb25zLCBzZXRSZW1vdmVkUGVybWlzc2lvbnNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTsgLy8gU3RvcmUgVVVJRHMgb2YgcmVtb3ZlZCBwZXJtaXNzaW9uc1xuICAgIGNvbnN0IFthZGRlZFBlcm1pc3Npb25zLCBzZXRBZGRlZFBlcm1pc3Npb25zXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gICAgXG5cbiAgICBjb25zdCAgbmF2aWdhdGU9dXNlTmF2aWdhdGUoKTtcblxuICAgIFxuICAgIFxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZldGNoUm9sZURldGFpbHMgPSBhc3luYyAocm9sZUlkOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvbGVJZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJyb2xlSWQgaXMgbnVsbC5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbmFibGVTcGxhc2hTY3JlZW4oKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBHRVRfUEVSTUlTU0lPTlNfQllfUk9MRV9JRChDVVJFRU5UX0NPTVBBTllfTkFNRSkucmVwbGFjZSgne3JvbGVJZH0nLCByb2xlSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KHVybCk7XG4gICAgICAgICAgICAgICAgc2V0Um9sZURldGFpbHMocmVzcG9uc2UuZGF0YSk7IC8vIFNldCB0aGUgZmV0Y2hlZCBkYXRhIHRvIHN0YXRlICAgICAgICAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBvcmlnaW5hbCBwZXJtaXNzaW9ucyB0byBvbmx5IHRob3NlIHRoYXQgYXJlIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQZXJtaXNzaW9ucyA9IHJlc3BvbnNlLmRhdGEucGVybWlzc2lvbkRldGFpbHNEVE8uZmlsdGVyKChkdG86IF
277Blcm1pc3Npb25EZXRhaWxzRFRPKSA9PiBkdG8uaXNTZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgc2V0T3JpZ2luYWxQZXJtaXNzaW9ucyhzZWxlY3RlZFBlcm1pc3Npb25zKTsgLy8gU2V0IG9yaWdpbmFsIHBlcm1pc3Npb25zXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyByb2xlIGRldGFpbHM6XCIsIGVycm9yKTsgICBcbiAgICAgICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlU3BsYXNoU2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZmV0Y2hSb2xlRGV0YWlscyhyb2xlSWQpO1xuICAgIH0sIFtyb2xlSWRdKTsgLy8gRGVwZW5kZW5jeSBhcnJheSB0byByZS1ydW4gZWZmZWN0IGlmIHJvbGVJZCBjaGFuZ2VzXG5cbiAgICAvLyBIYW5kbGUgY2hhbmdlIGZvciB0aGUgcm9sZSBuYW1lXG4gICAgY29uc3QgaGFuZGxlUm9sZU5hbWVDaGFuZ2UgPSAobmV3TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChyb2xlRGV0YWlscykge1xuICAgICAgICAgICAgc2V0Um9sZURldGFpbHMoeyAuLi5yb2xlRGV0YWlscywgbmFtZTogbmV3TmFtZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgXG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUNoZWNrYm94Q2hhbmdlID0gKGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHJvbGVEZXRhaWxzKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkUGVybWlzc2lvbnMgPSByb2xlRGV0YWlscy5wZXJtaXNzaW9uRGV0YWlsc0RUTy5tYXAoKGR0bykgPT5cbiAgICAgICAgICAgICAgICBkdG8uaWQgPT09IGlkID8geyAuLi5kdG8sIGlzU2VsZWN0ZWQ6ICFkdG8uaXNTZWxlY3RlZCB9IDogZHRvXG4gICAgICAgICAgICApO1xuICAgIFxuICAgICAgICAgICAgc2V0Um9sZURldGFpbHMoeyAuLi5yb2xlRGV0YWlscywgcGVybWlzc2lvbkRldGFpbHNEVE86IHVwZGF0ZWRQZXJtaXNzaW9ucyB9KTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB1cGRhdGVkUGVybWlzc2lvbnMuZmluZChkdG8gPT4gZHRvLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmICghcGVybWlzc2lvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwZXJtaXNzaW9uIGlzIGJlaW5nIHVuY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFBlcm1pc3Npb24gPSBvcmlnaW5hbFBlcm1pc3Npb25zLmZpbmQob3JpZ2luYWwgPT4gb3JpZ2luYWwuaWQgPT09IHBlcm1pc3Npb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBleGlzdHMgaW4gb3JpZ2luYWxQZXJtaXNzaW9ucywgYWRkIGl0IHRvIHJlbW92ZWRQZXJtaXNzaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVtb3ZlZFBlcm1pc3Npb25zKHByZXYgPT4gWy4uLnByZXYsIG9yaWdpbmFsUGVybWlzc2lvbi51dWlkXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGVybWlzc2lvbiBpcyBiZWluZyBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgIHNldFJlbW92ZWRQZXJtaXNzaW9ucyhwcmV2ID0+IHByZXYuZmlsdGVyKHV1aWQgPT4gdXVpZCAhPT0gcGVybWlzc2lvbi51dWlkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGFkZGVkIHBlcm1pc3Npb25zXG4gICAgICAgICAgICAgY29uc3QgYWRkZWRQZXJtaXNzaW9ucyA9IHVwZGF0ZWRQZXJtaXNzaW9ucy5maWx0ZXIodXBkYXRlZCA9PiB1cGRhdGVkLmlzU2VsZWN0ZWQgJiYgIW9yaWdpbmFsUGVybWlzc2lvbnMuc29tZShvcmlnaW5hbCA9PiBvcmlnaW5hbC5pZCA9PT0gdXBkYXRlZC5pZCkpO1xuICAgICAgICAgICAgIHNldEFkZGVkUGVybWlzc2lvbnMoYWRkZWRQZXJtaXNzaW9ucy5tYXAocCA9PiBwLnV1aWQpKTsgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgIFxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4geyAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImFkZGVkIFBlcm1pc3Npb25zIGFyZSBcIithZGRlZFBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVtb3ZlZCBQZXJtaXNzaW9ucyBhcmUgXCIrcmVtb3ZlZFBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGlmICghcm9sZUlkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcInJvbGVJZCBpcyBudWxsLlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlU3BsYXNoU2NyZWVuKCk7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IFBPU1RfUk9MRV9QRVJNSVNTSU9OU19CWV9ST0xFX0lEKENVUkVFTlRfQ09NUEFOWV9OQU1FKS5yZXBsYWNlKCd7cm9sZUlkfScsIHJvbGVJZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVcGRhdGVkIHJvbGVBcGlVcmw6IFwiLCB1cmwpOyAgIFxuICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHRvIHNlbmRcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVG9TZW5kID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5yb2xlRGV0YWlscywgLy8gU3ByZWFkIHRoZSByb2xlRGV0YWlscyBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgYWRkUGVybWlzc2lvbnM6IGFkZGVkUGVybWlzc2lvbnMsIC8vIEFkZCB0aGUgYWRkZWRQZXJtaXNzaW9uc1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVQZXJtaXNzaW9uczogcmVtb3ZlZFBlcm1pc3Npb25zIC8vIEFkZCB0aGUgcmVtb3ZlZFBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QodXJsLCBkYXRhVG9TZW5kKTtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVzcG9uc2U6XCIsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJwZXJtaXNzaW9ucyB1cGRhdGVkXCIpO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRlKGAvJHtDVVJFRU5UX0NPTVBBTllfTkFNRX0vYWRtaW5pc3RyYXRpb24vcm9sZXM/cm9sZT0ke3JvbGVEZXRhaWxzPy5uYW1lfWApO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc2F2aW5nIHBlcm1pc3Npb25zOlwiLCBlcnJvcik7XG4gICAgICAgICAgICB9ZmluYWxseXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlU3BsYXNoU2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8Q29udGVudD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyLWZsdWlkIHJvbGUtcGVybWlzc2lvbnNcIj4gICAgICAgICBcbiAgICAgICAgICAgICAgICB7cm9sZURldGFpbHMgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSdlZGl0X2hlYWRpbmcnPkVkaXQgUm9sZSBvZiB7cm9sZURldGFpbHMubmFtZSB8fCAnJ308L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb2xlX25hbWUnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eX
277BlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cm9sZURldGFpbHMubmFtZSB8fCAnJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJyb2xlbmFtZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJSb2xlIE5hbWVcIiAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBoYW5kbGVSb2xlTmFtZUNoYW5nZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Blcm1pc3Npb25zJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JvbGVEZXRhaWxzLnBlcm1pc3Npb25EZXRhaWxzRFRPLm1hcChkdG8gPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2R0by5pZH0gY2xhc3NOYW1lPSdwZXJtaXNzaW9uX25hbWUnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGVybWlzc2lvblZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwZXJtaXNzaW9uX2NoZWNrYm94JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtkdG8uaXNTZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eygpID0+IGhhbmRsZUNoZWNrYm94Q2hhbmdlKGR0by5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e2R0by5uYW1lfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdhY3Rpb24tYnRucyc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2J0biBidG4tcHJpbWFyeSBteC0zJyAgb25DbGljaz17aGFuZGxlU2F2ZX0+U2F2ZTwvZGl2PiAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmsgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kYXJrXCIgdG89e2AvJHtDVVJFRU5UX0NPTVBBTllfTkFNRX0vYWRtaW5pc3RyYXRpb24vcm9sZXNgfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPHA+Tm8gUGVybWlzc2lvbnMgYXNzaWduZWQgdG8gdGhpcyByb2xlLjwvcD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvQ29udGVudD5cbiAgICApO1xufSJdLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiTGluayIsInVzZUxvY2F0aW9uIiwidXNlTmF2aWdhdGUiLCJheGlvcyIsIkNVUkVFTlRfQ09NUEFOWV9OQU1FIiwiR0VUX1BFUk1JU1NJT05TX0JZX1JPTEVfSUQiLCJQT1NUX1JPTEVfUEVSTUlTU0lPTlNfQllfUk9MRV9JRCIsIlRleHRGaWVsZCIsIkNvbnRlbnQiLCJkaXNhYmxlU3BsYXNoU2NyZWVuIiwiZW5hYmxlU3BsYXNoU2NyZWVuIiwidXNlQXhpb3NJbnRlcmNlcHRvciIsIkVkaXRSb2xlUGVybWlzc2lvbnMiLCJsb2NhdGlvbiIsInF1ZXJ5UGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwic2VhcmNoIiwicm9sZUlkIiwiZ2V0Iiwicm9sZURldGFpbHMiLCJzZXRSb2xlRGV0YWlscyIsIm9yaWdpbmFsUGVybWlzc2lvbnMiLCJzZXRPcmlnaW5hbFBlcm1pc3Npb25zIiwicmVtb3ZlZFBlcm1pc3Npb25zIiwic2V0UmVtb3ZlZFBlcm1pc3Npb25zIiwiYWRkZWRQZXJtaXNzaW9ucyIsInNldEFkZGVkUGVybWlzc2lvbnMiLCJuYXZpZ2F0ZSIsImZldGNoUm9sZURldGFpbHMiLCJjb25zb2xlIiwiZXJyb3IiLCJ1cmwiLCJyZXBsYWNlIiwicmVzcG9uc2UiLCJkYXRhIiwic2VsZWN0ZWRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25EZXRhaWxzRFRPIiwiZmlsdGVyIiwiZHRvIiwiaXNTZWxlY3RlZCIsImhhbmRsZVJvbGVOYW1lQ2hhbmdlIiwibmV3TmFtZSIsIm5hbWUiLCJoYW5kbGVDaGVja2JveENoYW5nZSIsImlkIiwidXBkYXRlZFBlcm1pc3Npb25zIiwibWFwIiwicGVybWlzc2lvbiIsImZpbmQiLCJvcmlnaW5hbFBlcm1pc3Npb24iLCJvcmlnaW5hbCIsInByZXYiLCJ1dWlkIiwidXBkYXRlZCIsInNvbWUiLCJwIiwiaGFuZGxlU2F2ZSIsImxvZyIsImRhdGFUb1NlbmQiLCJhZGRQZXJtaXNzaW9ucyIsInJlbW92ZVBlcm1pc3Npb25zIiwicG9zdCIsInN0YXR1cyIsImRpdiIsImNsYXNzTmFtZSIsImZvcm0iLCJoMyIsInR5cGUiLCJ2YWx1ZSIsImxhYmVsIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwiaW5wdXQiLCJjaGVja2VkIiwib25DbGljayIsInRvIl0sInJhbmdlTWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsT0FBT0EsU0FBU0MsU0FBUyxFQUFFQyxRQUFRLFFBQVEsUUFBUTtBQUNuRCxTQUFTQyxJQUFJLEVBQUVDLFdBQVcsRUFBRUMsV0FBVyxRQUFRLG1CQUFtQjtBQUNsRSxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBVUMsb0JBQW9CLEVBQUVDLDBCQUEwQixFQUFFQyxnQ0FBZ0MsUUFBUSxrQkFBa0I7QUFDdEgsU0FBU0MsU0FBUyxRQUFRLGdCQUFnQjtBQUMxQyxTQUFTQyxPQUFPLFFBQVEsNENBQTRDO0FBQ3BFLE9BQU8sNkJBQTZCO0FBQ3BDLFNBQVNDLG1CQUFtQixFQUFFQyxrQkFBa0IsUUFBUSw0QkFBNEI7QU
277FDcEYsU0FBU0MsbUJBQW1CLFFBQVEsNEJBQTRCO0FBcUJoRSxPQUFPLFNBQVNDOztJQUNaRDtJQUNBLE1BQU1FLFdBQVdaO0lBQ2pCLE1BQU1hLGNBQWMsSUFBSUMsZ0JBQWdCRixTQUFTRyxNQUFNO0lBQ3ZELElBQUlDLFNBQVNILFlBQVlJLEdBQUcsQ0FBQztJQUU3Qiw2QkFBNkI7SUFDN0IsTUFBTSxDQUFDQyxhQUFhQyxlQUFlLEdBQUdyQixTQUFnQztJQUN0RSxNQUFNLENBQUNzQixxQkFBcUJDLHVCQUF1QixHQUFHdkIsU0FBaUMsRUFBRTtJQUN6RixNQUFNLENBQUN3QixvQkFBb0JDLHNCQUFzQixHQUFHekIsU0FBbUIsRUFBRSxHQUFHLHFDQUFxQztJQUNqSCxNQUFNLENBQUMwQixrQkFBa0JDLG9CQUFvQixHQUFHM0IsU0FBbUIsRUFBRTtJQUdyRSxNQUFPNEIsV0FBU3pCO0lBSWhCSixVQUFVO1FBQ04sTUFBTThCLG1CQUFtQixPQUFPWDtZQUM1QixJQUFJLENBQUNBLFFBQVE7Z0JBQ1RZLFFBQVFDLEtBQUssQ0FBQztnQkFDZDtZQUNKO1lBQ0EsSUFBSTtnQkFDQXBCO2dCQUNBLE1BQU1xQixNQUFNMUIsMkJBQTJCRCxzQkFBc0I0QixPQUFPLENBQUMsWUFBWWY7Z0JBQ2pGLE1BQU1nQixXQUFXLE1BQU05QixNQUFNZSxHQUFHLENBQUNhO2dCQUNqQ1gsZUFBZWEsU0FBU0MsSUFBSSxHQUFHLCtDQUErQztnQkFFOUUsMkRBQTJEO2dCQUMzRCxNQUFNQyxzQkFBc0JGLFNBQVNDLElBQUksQ0FBQ0Usb0JBQW9CLENBQUNDLE1BQU0sQ0FBQyxDQUFDQyxNQUE4QkEsSUFBSUMsVUFBVTtnQkFDbkhqQix1QkFBdUJhLHNCQUFzQiwyQkFBMkI7WUFDNUUsRUFBRSxPQUFPTCxPQUFPO2dCQUNaRCxRQUFRQyxLQUFLLENBQUMsZ0NBQWdDQTtZQUNsRCxTQUFTO2dCQUNMckI7WUFDSjtRQUNKO1FBRUFtQixpQkFBaUJYO0lBQ3JCLEdBQUc7UUFBQ0E7S0FBTyxHQUFHLHNEQUFzRDtJQUVwRSx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
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.