{"version":3,"sources":["assets/images/profile.png","assets/images/projects/swol.jpg","assets/images/projects/mystaywell.png","assets/images/projects/rumor.jpg","assets/images/projects/canker.jpg","assets/images/projects/dznuts.jpg","assets/images/projects/brahma.jpg","assets/images/projects/krosswood.jpg","assets/images/projects/foodinsurance.jpg","assets/images/projects/evolutioncard.jpg","assets/images/projects/lochner.jpg","assets/images/projects/fatbob.jpg","assets/images/projects/silversocket.jpg","assets/images/projects/mediamanager.jpg","assets/images/projects/slack-dark.png","assets/images/projects/countdown-solver.png","assets/images/projects/word-finder.png","assets/images/projects/flashcards.png","assets/images/projects/project-omega.png","assets/images/projects/dotnet-react-sandbox.png","assets/images/projects/dotnet-react-generator.png","assets/images/projects/ranked-voting.png","assets/images/projects/node-cli-utils.png","assets/images/projects/environment-settings-dotnet.png","assets/images/projects/db-migrations-dotnet.png","assets/images/svg/StayWell.svg","assets/images/MikeAndHolly300x225.png","assets/images/projects/ia_intranet.jpg","assets/images/projects/devautologin.jpg","assets/images/projects/whs-betteryourself.png","assets/images/svg/Rumor.svg","assets/images/svg/InteriorArchitects.svg","assets/images/svg/CankerComplete.svg","assets/images/svg/dznuts.svg","assets/images/svg/Brahma.svg","assets/images/svg/Krosswood.svg","assets/images/svg/FoodInsurance.svg","assets/images/svg/Evolutioncard.svg","assets/images/svg/Lochner.svg","assets/images/svg/FatBobsGarage.svg","assets/images/svg/SilverSocket.svg","assets/images/svg/ChromeAutoLogin.svg","assets/images/svg/MediaManager.svg","assets/images/svg/SlackDarkTheme.svg","assets/images/svg/CountdownSolver.svg","assets/images/svg/WordFinder.svg","assets/images/svg/WHS.svg","assets/images/svg/Flashcards.svg","assets/images/svg/ProjectOmega.svg","assets/images/svg/DotnetReactSandbox.svg","assets/images/svg/DotnetReactGenerator.svg","assets/images/svg/RankedVoting.svg","assets/images/svg/NodeCliUtils.svg","assets/images/svg/DotnetEnvironmentSettings.svg","assets/images/svg/DotnetDbMigrations.svg","assets/images/projects/academica.jpg","assets/images/projects/aries.jpg","assets/images/projects/bodyfitwellness.jpg","assets/images/projects/dailybread.jpg","assets/images/projects/nerveci.jpg","assets/images/projects/octanner.jpg","assets/images/projects/onetel.jpg","assets/images/projects/display_boys.jpg","assets/images/projects/ia.jpg","assets/images/projects/ia_intranet_442.jpg","assets/images/projects/ia_corp_store_442.jpg","assets/images/projects/peoria_eastern_bypass.jpg","assets/images/projects/silversocket-animation.gif","assets/images/projects/TestUserAutoLoginDemo.gif","assets/images/projects/mediamanager_contextmenu.jpg","assets/images/projects/mediamanager_upload.jpg","assets/images/projects/mediamanager_gallery.jpg","assets/images/projects/healthtracker-aux-diagram.png","assets/images/projects/snapshot-diagram.png","assets/images/projects/engagement-diagram.png","components/TopBar.js","components/FooterInvite.js","components/DefaultLayout.js","utils/initNavUnderline.js","assets/images/frontend-icon.svg","assets/images/backend-icon.svg","assets/images/other-skills-icon.svg","components/About.js","skillData.js","components/ProjectCard.js","projectData.js","components/Projects.js","utils/initIsotope.js","components/Resume.js","components/Contact.js","components/projects/ProjectHeader.js","components/CenteredImage.js","components/projects/GoBackToProjects.js","components/projects/RumorMisc.js","assets/images/carousel-left.svg","assets/images/carousel-right.svg","components/projects/RumorBlurb.js","components/projects/InteriorArchitects.js","components/NotFound.js","components/projects/CankerComplete.js","components/projects/DZNuts.js","components/projects/Brahma.js","components/projects/KrosswoodDoors.js","components/projects/Foodinsurance.js","components/projects/Evolutioncard.js","components/projects/Lochner.js","components/projects/FatBobsGarage.js","components/projects/SilverSocket.js","components/StyledParagraphListLabel.js","components/StyledUl.js","components/StyledLi.js","components/StyledSectionTitle.js","components/StyledProjectSection.js","components/projects/DevAutoLogin.js","components/projects/MediaManager.js","components/projects/SlackDarkTheme.js","components/projects/StayWellBackground.js","components/projects/StayWellOnline.js","components/projects/MyStayWell.js","components/GenericError.js","components/projects/WHS.js","components/projects/CountdownSolver.js","components/projects/WordFinder.js","components/projects/Flashcards.js","components/projects/ProjectOmega.js","components/projects/DotnetReactSandbox.js","components/projects/DotnetReactGenerator.js","components/projects/RankedVoting.js","components/projects/NodeCliUtils.js","components/projects/EnvironmentSettingsDotnet.js","components/projects/DbMigrationsDotnet.js","App.js","serviceWorker.js","assets/plugins/back-to-top.js","components/ScrollToTop.js","index.js"],"names":["module","exports","TopBar","props","className","type","data-toggle","data-target","aria-controls","aria-expanded","aria-label","id","getNavLinkItem","linkText","relativePath","activeClass","location","pathname","exact","to","activeClassName","FooterInvite","src","profileImage","alt","DefaultLayout","useEffect","$nav","$","$slideLine","$currentItem","window","on","css","width","position","left","find","hover","this","initNavUnderline","headerChildren","contentChildren","hideFooterInvite","Date","getFullYear","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_ref2","createElement","_ref3","_ref4","_ref5","stroke","strokeWidth","fill","fillRule","strokeLinecap","strokeLinejoin","transform","d","points","_ref","svgRef","title","height","viewBox","ref","undefined","ForwardRef","forwardRef","About","getHeader","getContent","getCheckmarkLi","text","skillData","name","ProjectCard","projectData","cardImg","svgImg","techUsed","join","cardTitle","projectKey","cardOverlayTitle","cardOverlayText","map","s","tech","includes","SkillPill","cardImage","Projects","jQueryBridget","Isotope","imagesLoaded","makeJQueryPlugin","$container","isotope","itemSelector","layoutMode","filterValue","attr","filter","each","typeGroup","$typeGroup","removeClass","addClass","initIsotope","productDataForKey","pd","data-filter","imgWhs","svgWhs","imgMyStaywell","svgStayWell","imgStaywellOnline","imgWordFinder","svgWordFinder","imgFlashcards","svgFlashcards","imgProjectOmega","svgProjectOmega","imgDotnetReactSandbox","svgDotnetReactSandbox","imgDotnetReactGenerator","svgDotnetReactGenerator","imgRankedVoting","svgRankedVoting","imgNodeCliUtils","svgNodeCliUtils","imgEnvironmentSettingsDotnet","svgEnvironmentSettingsDotnet","imgDbMigrationsDotnet","svgDbMigrationsDotnet","imgRumor","svgRumor","imgIa","svgInteriorArchitects","imgCanker","svgCankerComplete","imgDzNuts","svgDznuts","imgBrahma","svgBrahma","imgKrosswood","svgKrosswood","imgFoodinsurance","svgFoodInsurance","imgEvolutioncard","svgEvolutioncard","imgLochner","svgLochner","imgFatbob","svgFatBobsGarage","imgSilverSocket","svgSilverSocket","imgDevAutoLogin","svgChromeAutoLogin","imgMediaManager","svgMediaManager","imgSlackDark","svgSlackDarkTheme","imgCountdownSolver","svgCountdownSolver","Resume","href","data-fa-transform","jobTitle","companyName","dateRangeString","roleDesc","achieveIntro","achieveBullets","techList","seeOnlineLinks","WorkExpItem","BulletSkill","Contact","ContactContent","style","margin","rel","ProjectHeader","tagline","CenteredImage","textAlign","GoBackToProjects","paddingBottom","marginBottom","paddingTop","Project","company","img","imgAcademica","imgAries","imgBodyfit","imgDailybread","imgDisplayBoys","imgNerveci","imgOCTanner","imgOnetel","MiscProj","children","InteriorArchitects","data-ride","maxWidth","data-slide-to","imgIaIntranet","imgIaCorpStore","role","data-slide","RumorBlurb","NotFound","fontSize","CankerComplete","DZNuts","Brahma","KrosswoodDoors","Foodinsurance","Evolutioncard","Lochner","imgPeoria","FatBobsGarage","SilverSocket","silversocketAnimation","DevAutoLogin","StyledProjectSection","StyledSectionTitle","StyledParagraphListLabel","StyledUl","StyledLi","MediaManager","imgContextMenu","imgUpload","imgGallery","SlackDarkTheme","StayWellOnline","StayWellBackground","imgHealthTrackerDiagram","imgSnapshotDiagram","imgEngagementDiagram","MyStayWell","GenericError","CountdownSolver","WordFinder","Flashcards","ProjectOmega","DotnetReactSandbox","DotnetReactGenerator","RankedVoting","NodeCliUtils","DotnetEnvironmentSettings","DotnetDbMigrations","App","LayoutWrapper","path","component","Whs","RumorMisc","Boolean","hostname","match","jQuery","scrolltotop","setting","startline","scrollto","scrollduration","fadeduration","controlHTML","controlattrs","offsetx","offsety","anchorkeyword","state","isvisible","shouldvisible","scrollup","cssfixedsupport","$control","opacity","dest","isNaN","parseInt","offset","top","$body","animate","scrollTop","keepfixed","$window","controlx","scrollLeft","controly","togglecontrol","scrolltop","stop","init","document","ready","mainobj","iebrws","all","compatMode","XMLHttpRequest","opera","bottom","right","cursor","click","appendTo","bind","e","withRouter","scrollTo","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename","navigator","serviceWorker","then","registration","unregister","catch","error","console","message"],"mappings":"4HAAAA,EAAOC,QAAU,IAA0B,qC,kBCA3CD,EAAOC,QAAU,IAA0B,kC,gBCA3CD,EAAOC,QAAU,IAA0B,wC,gBCA3CD,EAAOC,QAAU,IAA0B,mC,gBCA3CD,EAAOC,QAAU,IAA0B,oC,gBCA3CD,EAAOC,QAAU,IAA0B,oC,gBCA3CD,EAAOC,QAAU,IAA0B,oC,gBCA3CD,EAAOC,QAAU,IAA0B,uC,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,qC,gBCA3CD,EAAOC,QAAU,IAA0B,oC,gBCA3CD,EAAOC,QAAU,IAA0B,0C,gBCA3CD,EAAOC,QAAU,IAA0B,0C,gBCA3CD,EAAOC,QAAU,IAA0B,wC,gBCA3CD,EAAOC,QAAU,IAA0B,8C,gBCA3CD,EAAOC,QAAU,IAA0B,yC,gBCA3CD,EAAOC,QAAU,IAA0B,wC,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,kD,gBCA3CD,EAAOC,QAAU,IAA0B,oD,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,4C,gBCA3CD,EAAOC,QAAU,IAA0B,yD,gBCA3CD,EAAOC,QAAU,IAA0B,kD,oBCA3CD,EAAOC,QAAU,IAA0B,sC,sBCA3CD,EAAOC,QAAU,IAA0B,iD,oBCA3CD,EAAOC,QAAU,IAA0B,yC,gBCA3CD,EAAOC,QAAU,IAA0B,0C,gBCA3CD,EAAOC,QAAU,IAA0B,gD,gBCA3CD,EAAOC,QAAU,IAA0B,mC,gBCA3CD,EAAOC,QAAU,IAA0B,gD,gBCA3CD,EAAOC,QAAU,IAA0B,4C,gBCA3CD,EAAOC,QAAU,IAA0B,oC,gBCA3CD,EAAOC,QAAU,IAA0B,oC,gBCA3CD,EAAOC,QAAU,IAA0B,uC,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,qC,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,0C,gBCA3CD,EAAOC,QAAU,IAA0B,6C,gBCA3CD,EAAOC,QAAU,IAA0B,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","file":"static/js/main.faa66372.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/profile.f55eff46.png\";","module.exports = __webpack_public_path__ + \"static/media/swol.7f2ac9a5.jpg\";","module.exports = __webpack_public_path__ + \"static/media/mystaywell.ff3f52bf.png\";","module.exports = __webpack_public_path__ + \"static/media/rumor.e72aacb5.jpg\";","module.exports = __webpack_public_path__ + \"static/media/canker.e0abe032.jpg\";","module.exports = __webpack_public_path__ + \"static/media/dznuts.3e455eb3.jpg\";","module.exports = __webpack_public_path__ + \"static/media/brahma.0425725e.jpg\";","module.exports = __webpack_public_path__ + \"static/media/krosswood.6d5b3cf2.jpg\";","module.exports = __webpack_public_path__ + \"static/media/foodinsurance.5c458056.jpg\";","module.exports = __webpack_public_path__ + \"static/media/evolutioncard.b9792ddb.jpg\";","module.exports = __webpack_public_path__ + \"static/media/lochner.d3417133.jpg\";","module.exports = __webpack_public_path__ + \"static/media/fatbob.1b526623.jpg\";","module.exports = __webpack_public_path__ + \"static/media/silversocket.16a36d56.jpg\";","module.exports = __webpack_public_path__ + \"static/media/mediamanager.edbe6194.jpg\";","module.exports = __webpack_public_path__ + \"static/media/slack-dark.e9b68160.png\";","module.exports = __webpack_public_path__ + \"static/media/countdown-solver.bb8e4eac.png\";","module.exports = __webpack_public_path__ + \"static/media/word-finder.1a4f22b5.png\";","module.exports = __webpack_public_path__ + \"static/media/flashcards.9b92a488.png\";","module.exports = __webpack_public_path__ + \"static/media/project-omega.6a600f06.png\";","module.exports = __webpack_public_path__ + \"static/media/dotnet-react-sandbox.26102fb2.png\";","module.exports = __webpack_public_path__ + \"static/media/dotnet-react-generator.e9200216.png\";","module.exports = __webpack_public_path__ + \"static/media/ranked-voting.1c982394.png\";","module.exports = __webpack_public_path__ + \"static/media/node-cli-utils.1390de0b.png\";","module.exports = __webpack_public_path__ + \"static/media/environment-settings-dotnet.0ea30930.png\";","module.exports = __webpack_public_path__ + \"static/media/db-migrations-dotnet.dd17b065.png\";","module.exports = __webpack_public_path__ + \"static/media/StayWell.d07d7633.svg\";","module.exports = __webpack_public_path__ + \"static/media/MikeAndHolly300x225.73fca777.png\";","module.exports = __webpack_public_path__ + \"static/media/ia_intranet.74fe1361.jpg\";","module.exports = __webpack_public_path__ + \"static/media/devautologin.137c3437.jpg\";","module.exports = __webpack_public_path__ + \"static/media/whs-betteryourself.2ed92864.png\";","module.exports = __webpack_public_path__ + \"static/media/Rumor.6173f136.svg\";","module.exports = __webpack_public_path__ + \"static/media/InteriorArchitects.da83257c.svg\";","module.exports = __webpack_public_path__ + \"static/media/CankerComplete.607f1fa5.svg\";","module.exports = __webpack_public_path__ + \"static/media/dznuts.68123b84.svg\";","module.exports = __webpack_public_path__ + \"static/media/Brahma.367efafb.svg\";","module.exports = __webpack_public_path__ + \"static/media/Krosswood.32fed347.svg\";","module.exports = __webpack_public_path__ + \"static/media/FoodInsurance.27b897d2.svg\";","module.exports = __webpack_public_path__ + \"static/media/Evolutioncard.b814c807.svg\";","module.exports = __webpack_public_path__ + \"static/media/Lochner.23bff720.svg\";","module.exports = __webpack_public_path__ + \"static/media/FatBobsGarage.ad36f1de.svg\";","module.exports = __webpack_public_path__ + \"static/media/SilverSocket.bea49b16.svg\";","module.exports = __webpack_public_path__ + \"static/media/ChromeAutoLogin.6f281763.svg\";","module.exports = __webpack_public_path__ + \"static/media/MediaManager.0d8b0957.svg\";","module.exports = __webpack_public_path__ + \"static/media/SlackDarkTheme.e58ae8ca.svg\";","module.exports = __webpack_public_path__ + \"static/media/CountdownSolver.8b2be76f.svg\";","module.exports = __webpack_public_path__ + \"static/media/WordFinder.ed4ead5d.svg\";","module.exports = __webpack_public_path__ + \"static/media/WHS.e2219699.svg\";","module.exports = __webpack_public_path__ + \"static/media/Flashcards.dc5d2920.svg\";","module.exports = __webpack_public_path__ + \"static/media/ProjectOmega.40e19b51.svg\";","module.exports = __webpack_public_path__ + \"static/media/DotnetReactSandbox.55457098.svg\";","module.exports = __webpack_public_path__ + \"static/media/DotnetReactGenerator.b4c0e3e8.svg\";","module.exports = __webpack_public_path__ + \"static/media/RankedVoting.e1b6471b.svg\";","module.exports = __webpack_public_path__ + \"static/media/NodeCliUtils.34a8cd19.svg\";","module.exports = __webpack_public_path__ + \"static/media/DotnetEnvironmentSettings.ce63a8a1.svg\";","module.exports = __webpack_public_path__ + \"static/media/DotnetDbMigrations.b240f64c.svg\";","module.exports = __webpack_public_path__ + \"static/media/academica.ac6aab17.jpg\";","module.exports = __webpack_public_path__ + \"static/media/aries.c0db2c2b.jpg\";","module.exports = __webpack_public_path__ + \"static/media/bodyfitwellness.be7bb159.jpg\";","module.exports = __webpack_public_path__ + \"static/media/dailybread.14dd7bd2.jpg\";","module.exports = __webpack_public_path__ + \"static/media/nerveci.06387640.jpg\";","module.exports = __webpack_public_path__ + \"static/media/octanner.2eabe05e.jpg\";","module.exports = __webpack_public_path__ + \"static/media/onetel.9783515c.jpg\";","module.exports = __webpack_public_path__ + \"static/media/display_boys.ffbd8a71.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ia.1e141a6f.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ia_intranet_442.d43f8531.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ia_corp_store_442.ee64805f.jpg\";","module.exports = __webpack_public_path__ + \"static/media/peoria_eastern_bypass.840f75f9.jpg\";","module.exports = __webpack_public_path__ + \"static/media/silversocket-animation.844f5890.gif\";","module.exports = __webpack_public_path__ + \"static/media/TestUserAutoLoginDemo.024ec631.gif\";","module.exports = __webpack_public_path__ + \"static/media/mediamanager_contextmenu.a89e50a5.jpg\";","module.exports = __webpack_public_path__ + \"static/media/mediamanager_upload.ae549d3a.jpg\";","module.exports = __webpack_public_path__ + \"static/media/mediamanager_gallery.89655f6c.jpg\";","module.exports = __webpack_public_path__ + \"static/media/healthtracker-aux-diagram.6756dd08.png\";","module.exports = __webpack_public_path__ + \"static/media/snapshot-diagram.56bf05b9.png\";","module.exports = __webpack_public_path__ + \"static/media/engagement-diagram.df09f0da.png\";","import React from 'react';\nimport { NavLink } from 'react-router-dom';\n\nexport default function TopBar(props) {\n return (\n <div className=\"top-bar theme-bg-primary-darken\">\n <div className=\"container-fluid\">\n <nav className=\"navbar navbar-expand-lg navbar-dark position-relative\">\n <button className=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navigation\" aria-controls=\"navigation\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n <span className=\"navbar-toggler-icon\"></span>\n </button>\n <div className=\"collapse navbar-collapse text-uppercase\" id=\"navigation\">\n <ul className=\"navbar-nav ml-lg-auto\">\n {getNavLinkItem(props, 'About', '/')}\n {getNavLinkItem(props, 'Projects', '/projects')}\n {/* {getNavLinkItem(props, 'Blog', '/blog')} */}\n {getNavLinkItem(props, 'Resume', '/resume')}\n {getNavLinkItem(props, 'Contact', '/contact')}\n {/* <li className=\"nav-item mr-lg-3\">\n <a className=\"nav-link\" href=\"talks.html\">Talks</a>\n </li>\n <li className=\"nav-item mr-lg-3\">\n <a className=\"nav-link\" href=\"blog.html\">Blog</a>\n </li>\n <li className=\"nav-item mr-lg-3\">\n <a className=\"nav-link\" href=\"resume.html\">Resume</a>\n </li>\n <li className=\"nav-item mr-lg-3\">\n <a className=\"nav-link\" href=\"contact.html\">Contact</a>\n </li> */}\n {/* <li className=\"nav-item dropdown mr-0\">\n <a className=\"nav-link dropdown-toggle\" href=\"#\" id=\"navigationLink\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n Pages\n\t\t\t\t\t\t\t\t </a>\n <div className=\"dropdown-menu dropdown-menu-right text-capitalize shadow-lg\" aria-labelledby=\"navigationLink\">\n <a className=\"dropdown-item\" href=\"project.html\">Project Case Study (1 Column)</a>\n <a className=\"dropdown-item\" href=\"project-alt.html\">Project Case Study (2 Columns)</a>\n <a className=\"dropdown-item\" href=\"blog-post.html\">Blog Post</a>\n </div>\n </li> */}\n </ul>\n <span id=\"slide-line\"></span>\n </div>\n </nav>\n </div>\n </div>\n );\n}\n\nconst getNavLinkItem = (props, linkText, relativePath) => {\n let activeClass = props.location.pathname === relativePath ? ' active' : '';\n return (\n <li className={`nav-item mr-lg-3${activeClass}`}>\n <NavLink {...(relativePath === '/' ? { exact: true } : {})} className=\"nav-link\" to={relativePath} activeClassName=\"active\">{linkText}</NavLink>\n </li>\n );\n}\n","import React from 'react';\nimport profileImage from '../assets/images/profile.png';\nimport { Link } from 'react-router-dom';\n\nexport default function FooterInvite() {\n return (\n <section className=\"section-cta py-5 bg-primary text-white\">\n <div className=\"container\">\n <div className=\"text-center\">\n <img className=\"profile-small d-inline-block mx-auto rounded-circle mb-2\" src={profileImage} alt=\"Mike Thompson\" />\n </div>\n <h3 className=\"section-title font-weight-bold text-center mb-2\">Interested in hiring me for your project?</h3>\n <div className=\"section-intro mx-auto text-center mb-3\">\n Looking for an experienced full-stack developer to build your web app or ship your software product? To start an initial chat use the <Link className=\"link-on-bg\" to=\"/contact\">form on the contact page</Link>.\n\t\t </div>\n <div className=\"text-center\">\n <Link to=\"/contact\" className=\"theme-btn-on-bg btn\">Let's Talk</Link>\n </div>\n </div>\n </section>\n );\n}","import React, { useEffect } from 'react';\nimport TopBar from './TopBar';\nimport initNavUnderline from '../utils/initNavUnderline';\nimport FooterInvite from './FooterInvite';\n\nexport default function DefaultLayout(props) {\n useEffect(() => initNavUnderline());\n\n return (\n <div>\n <header>\n <TopBar location={props.location} />\n {props.headerChildren}\n </header>\n <div>\n {props.contentChildren}\n </div>\n {!props.hideFooterInvite && <FooterInvite />}\n <footer className=\"footer text-light text-center py-2\">\n <small className=\"copyright\">Copyright © {new Date().getFullYear()} Michael Thompson</small>\n </footer>\n </div>\n );\n}\n","import $ from 'jquery';\n\nexport default function () {\n /* ======= Sliding menu underline ====== */\n // Menu has active item\n //Ref: https://codepen.io/digistate/pen/OXXjXM\n\n let $nav = $(\"#navigation\"),\n $slideLine = $(\"#slide-line\"),\n $currentItem = $(\"#navigation li.active\");\n\n\n $(window).on('resize load', function () {\n\n if ($currentItem[0]) {\n $slideLine.css({\n \"width\": $currentItem.width(),\n \"left\": $currentItem.position().left\n });\n }\n });\n\n // Underline transition\n $nav.find(\"li\").hover(\n // Hover on\n function () {\n $slideLine.css({\n \"width\": $(this).width(),\n \"left\": $(this).position().left\n });\n },\n // Hover out\n function () {\n if ($currentItem[0]) {\n // Go back to current\n $slideLine.css({\n \"width\": $currentItem.width(),\n \"left\": $currentItem.position().left\n });\n } else {\n // Disapear\n $slideLine.width(0);\n }\n }\n );\n}\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"title\", null, \"frontend-icon\");\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"desc\", null, \"Created with Sketch.\");\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"defs\", null);\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"g\", {\n id: \"Page-1\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Landing\",\n transform: \"translate(-477.000000, -608.000000)\",\n stroke: \"#FFFFFF\",\n strokeWidth: 1.5625\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Section-skills\",\n transform: \"translate(292.000000, 424.000000)\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"content\",\n transform: \"translate(0.000000, 162.000000)\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Col-L\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"icon\",\n transform: \"translate(167.000000, 0.000000)\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"frontend-icon\",\n transform: \"translate(15.000000, 15.000000)\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M46.09375,16.40625 L3.90625,16.40625 L46.09375,16.40625 Z\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M43.75,8.59375 L6.25,8.59375 C4.95546875,8.59375 3.90625,9.64296875 3.90625,10.9375 L3.90625,40.625 C3.90625,41.9195312 4.95546875,42.96875 6.25,42.96875 L43.75,42.96875 C45.0445313,42.96875 46.09375,41.9195312 46.09375,40.625 L46.09375,10.9375 C46.09375,9.64296875 45.0445313,8.59375 43.75,8.59375 L43.75,8.59375 Z\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M41.40625,12.5 C41.40625,12.9320312 41.0570312,13.28125 40.625,13.28125 C40.1929688,13.28125 39.84375,12.9320312 39.84375,12.5 C39.84375,12.0679688 40.1929688,11.71875 40.625,11.71875 C41.0570312,11.71875 41.40625,12.0679688 41.40625,12.5 L41.40625,12.5 Z\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M36.71875,12.5 C36.71875,12.9320312 36.3695312,13.28125 35.9375,13.28125 C35.5054688,13.28125 35.15625,12.9320312 35.15625,12.5 C35.15625,12.0679688 35.5054688,11.71875 35.9375,11.71875 C36.3695312,11.71875 36.71875,12.0679688 36.71875,12.5 L36.71875,12.5 Z\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M32.03125,12.5 C32.03125,12.9320312 31.6820312,13.28125 31.25,13.28125 C30.8179688,13.28125 30.46875,12.9320312 30.46875,12.5 C30.46875,12.0679688 30.8179688,11.71875 31.25,11.71875 C31.6820312,11.71875 32.03125,12.0679688 32.03125,12.5 L32.03125,12.5 Z\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"polyline\", {\n id: \"Path\",\n points: \"19.53125 25.78125 14.84375 29.6875 19.53125 33.59375\"\n}), /*#__PURE__*/React.createElement(\"polyline\", {\n id: \"Path\",\n points: \"30.46875 25.78125 35.15625 29.6875 30.46875 33.59375\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M22.65625,36.71875 L27.34375,22.65625 L22.65625,36.71875 Z\",\n id: \"Path\"\n}))))))));\n\nvar SvgFrontendIcon = function SvgFrontendIcon(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"44px\",\n height: \"37px\",\n viewBox: \"0 0 44 37\",\n ref: svgRef\n }, props), title === undefined ? _ref2 : title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref3, _ref4, _ref5);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgFrontendIcon, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/frontend-icon.2b59f34a.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"title\", null, \"db\");\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"desc\", null, \"Created with Sketch.\");\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"defs\", null);\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"g\", {\n id: \"Page-1\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Landing\",\n transform: \"translate(-924.000000, -604.000000)\",\n stroke: \"#FFFFFF\",\n strokeWidth: 1.5625\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Section-skills\",\n transform: \"translate(292.000000, 424.000000)\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"content\",\n transform: \"translate(0.000000, 162.000000)\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Col-R\",\n transform: \"translate(443.000000, 0.000000)\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"icon\",\n transform: \"translate(166.000000, 0.000000)\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"db\",\n transform: \"translate(19.000000, 15.000000)\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M37.8125,8.6875 C37.8125,11.2757812 30.8984375,13.375 21.40625,13.375 C11.9140625,13.375 5,11.2757812 5,8.6875 C5,6.09921875 11.9140625,4 21.40625,4 C30.8984375,4 37.8125,6.09921875 37.8125,8.6875 L37.8125,8.6875 Z\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M37.8125,9 L37.8125,19.9375 C37.8125,22.5257813 30.8984375,24.625 21.40625,24.625 C11.9140625,24.625 5,22.5257813 5,19.9375 L5,9\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M37.8125,30 L37.8125,40.9375 C37.8125,43.5257813 30.8984375,45.625 21.40625,45.625 C11.9140625,45.625 5,43.5257813 5,40.9375 L5,30\",\n id: \"Path\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M37.8125,20 L37.8125,30.9375 C37.8125,33.5257813 30.8984375,35.625 21.40625,35.625 C11.9140625,35.625 5,33.5257813 5,30.9375 L5,20\",\n id: \"Path\"\n}))))))));\n\nvar SvgBackendIcon = function SvgBackendIcon(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"35px\",\n height: \"44px\",\n viewBox: \"0 0 35 44\",\n ref: svgRef\n }, props), title === undefined ? _ref2 : title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref3, _ref4, _ref5);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgBackendIcon, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/backend-icon.419f7469.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"title\", null, \"swiss_army_knife\");\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"desc\", null, \"Created with Sketch.\");\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"defs\", null);\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"g\", {\n id: \"Page-1\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"swiss_army_knife\",\n transform: \"translate(-3.000000, -4.000000)\",\n fill: \"#FFFFFF\",\n fillRule: \"nonzero\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M46.828125,36.4453125 C46.828125,36.4375 46.8203125,36.4375 46.8203125,36.4296875 C46.796875,36.3671875 46.7578125,36.3203125 46.71875,36.2734375 C46.6953125,36.2421875 46.6796875,36.203125 46.65625,36.171875 C46.6171875,36.1328125 46.5703125,36.109375 46.53125,36.078125 C46.4921875,36.0546875 46.4609375,36.015625 46.4140625,36 C46.375,35.984375 46.328125,35.984375 46.2890625,35.96875 C46.234375,35.953125 46.171875,35.9375 46.1171875,35.9375 C46.109375,35.9375 46.109375,35.9375 46.1015625,35.9375 C46.0546875,35.9375 46.0078125,35.953125 45.9609375,35.96875 C45.9140625,35.9765625 45.8671875,35.9765625 45.828125,35.9921875 L44.5546875,36.4609375 L43.4140625,35.7265625 C43.203125,35.59375 42.9453125,35.5625 42.71875,35.6484375 L41.4453125,36.1171875 L40.3046875,35.3828125 C40.1015625,35.25 39.8359375,35.21875 39.609375,35.3046875 L38.3359375,35.7734375 L37.1953125,35.0390625 C36.984375,34.90625 36.7265625,34.875 36.5,34.9609375 L35.2265625,35.4296875 L34.0859375,34.6953125 C33.875,34.5625 33.6171875,34.53125 33.390625,34.6171875 L32.1171875,35.0859375 L30.9765625,34.3515625 C30.765625,34.21875 30.5078125,34.1875 30.28125,34.2734375 L29.0078125,34.7421875 L27.8671875,34.0078125 C27.703125,33.8984375 27.5,33.859375 27.3046875,33.8984375 L27.078125,33.9375 L43.0078125,18.0078125 C44.5,16.546875 45.3125,14.5859375 45.3125,12.5 C45.3125,10.4140625 44.5,8.453125 43.0234375,6.9765625 C41.546875,5.5 39.5859375,4.6875 37.5,4.6875 C35.7890625,4.6875 34.171875,5.2421875 32.828125,6.25 L16.40625,6.25 C8.40625,6.25 3.609375,10.171875 3.40625,10.3359375 C3.2265625,10.484375 3.125,10.703125 3.125,10.9375 C3.125,11.171875 3.2265625,11.390625 3.40625,11.5390625 C3.609375,11.703125 8.40625,15.625 16.40625,15.625 L23.328125,15.625 L6.9765625,31.9765625 C5.5,33.453125 4.6875,35.4140625 4.6875,37.5 C4.6875,39.5859375 5.5,41.546875 6.9765625,43.0234375 C8.453125,44.5 10.4140625,45.3125 12.5,45.3125 C14.2109375,45.3125 15.828125,44.7578125 17.171875,43.75 L46.09375,43.75 C46.5234375,43.75 46.875,43.3984375 46.875,42.96875 L46.875,36.71875 C46.875,36.671875 46.859375,36.625 46.84375,36.578125 C46.8359375,36.5390625 46.84375,36.4921875 46.828125,36.4453125 Z M16.40625,14.0625 C10.8515625,14.0625 6.90625,11.9921875 5.265625,10.9375 C6.9140625,9.8828125 10.859375,7.8125 16.40625,7.8125 L31.140625,7.8125 L24.890625,14.0625 L16.40625,14.0625 Z M8.078125,41.921875 C6.8984375,40.7421875 6.25,39.171875 6.25,37.5 C6.25,35.828125 6.8984375,34.2578125 8.078125,33.078125 L25.7578125,15.3984375 C25.7578125,15.3984375 25.7578125,15.3984375 25.7578125,15.3984375 L33.0703125,8.0859375 C34.2578125,6.8984375 35.828125,6.25 37.5,6.25 C39.171875,6.25 40.7421875,6.8984375 41.921875,8.078125 C43.1015625,9.2578125 43.75,10.828125 43.75,12.5 C43.75,14.171875 43.1015625,15.7421875 41.921875,16.921875 L16.921875,41.921875 C15.7421875,43.1015625 14.171875,43.75 12.5,43.75 C10.828125,43.75 9.2578125,43.1015625 8.078125,41.921875 Z M18.859375,42.1875 L25.1640625,35.8828125 L27.2890625,35.5078125 L28.5,36.2890625 C28.7109375,36.421875 28.96875,36.453125 29.1953125,36.3671875 L30.46875,35.8984375 L31.609375,36.6328125 C31.8125,36.765625 32.078125,36.796875 32.3046875,36.7109375 L33.578125,36.2421875 L34.71875,36.9765625 C34.9296875,37.109375 35.1875,37.140625 35.4140625,37.0546875 L36.6875,36.5859375 L37.828125,37.3203125 C38.03125,37.453125 38.296875,37.484375 38.5234375,37.3984375 L39.796875,36.9296875 L40.9375,37.6640625 C41.1484375,37.796875 41.40625,37.828125 41.6328125,37.7421875 L42.90625,37.2734375 L44.046875,38.0078125 C44.171875,38.09375 44.3203125,38.1328125 44.46875,38.1328125 C44.5625,38.1328125 44.65625,38.1171875 44.7421875,38.0859375 L45.3125,37.84375 L45.3125,42.1875 L18.859375,42.1875 Z\",\n id: \"Shape\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M36.71875,15.625 C38.0078125,15.625 39.0625,14.5703125 39.0625,13.28125 C39.0625,11.9921875 38.0078125,10.9375 36.71875,10.9375 C35.4296875,10.9375 34.375,11.9921875 34.375,13.28125 C34.375,14.5703125 35.4296875,15.625 36.71875,15.625 Z M36.71875,12.5 C37.1484375,12.5 37.5,12.8515625 37.5,13.28125 C37.5,13.7109375 37.1484375,14.0625 36.71875,14.0625 C36.2890625,14.0625 35.9375,13.7109375 35.9375,13.28125 C35.9375,12.8515625 36.2890625,12.5 36.71875,12.5 Z\",\n id: \"Shape\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M17.1875,38.28125 C17.390625,38.28125 17.5859375,38.203125 17.7421875,38.0546875 C18.046875,37.75 18.046875,37.2578125 17.7421875,36.953125 L15.9453125,35.15625 L17.734375,33.3671875 C18.0390625,33.0625 18.0390625,32.5703125 17.734375,32.265625 C17.4296875,31.9609375 16.9375,31.9609375 16.6328125,32.265625 L14.84375,34.0546875 L13.0546875,32.265625 C12.75,31.9609375 12.2578125,31.9609375 11.953125,32.265625 C11.6484375,32.5703125 11.6484375,33.0625 11.953125,33.3671875 L13.7421875,35.15625 L11.953125,36.9453125 C11.6484375,37.25 11.6484375,37.7421875 11.953125,38.046875 C12.1015625,38.203125 12.296875,38.28125 12.5,38.28125 C12.703125,38.28125 12.8984375,38.203125 13.0546875,38.0546875 L14.84375,36.2578125 L16.6328125,38.046875 C16.7890625,38.203125 16.984375,38.28125 17.1875,38.28125 Z\",\n id: \"Shape\"\n})));\n\nvar SvgOtherSkillsIcon = function SvgOtherSkillsIcon(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"44px\",\n height: \"42px\",\n viewBox: \"0 0 44 42\",\n ref: svgRef\n }, props), title === undefined ? _ref2 : title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref3, _ref4, _ref5);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgOtherSkillsIcon, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/other-skills-icon.bd4806c3.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react';\nimport profileImage from '../assets/images/MikeAndHolly300x225.png';\nimport DefaultLayout from './DefaultLayout';\nimport { ReactComponent as FrontEndIcon } from '../assets/images/frontend-icon.svg';\nimport { ReactComponent as BackEndIcon } from '../assets/images/backend-icon.svg';\nimport { ReactComponent as OtherSkillsIcon } from '../assets/images/other-skills-icon.svg';\nimport { Link } from 'react-router-dom';\n\nexport default function About(props) {\n return (\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n );\n}\n\nconst getHeader = () => {\n return (\n <div className=\"header-intro theme-bg-primary text-white py-5\">\n <div className=\"container\">\n <div className=\"profile-teaser media flex-column flex-md-row\">\n <img className=\"profile-image mb-3 mb-md-0 mr-md-5 ml-md-0 rounded mx-auto\" src={profileImage} alt=\"Mike Thompson\" />\n <div className=\"media-body text-center text-md-left\">\n <div className=\"lead\">Hello, my name is</div>\n <h2 className=\"mt-0 display-4 font-weight-bold\">Mike Thompson</h2>\n {/* <div className=\"bio mb-3\">I'm a full-stack software engineer. I write about coding on <strong><Link className=\"link-on-bg\" to=\"/blog\">my blog</Link></strong>. Check out my <strong><Link className=\"link-on-bg\" to=\"/projects\">projects</Link></strong> and <strong><Link className=\"link-on-bg\" to=\"/resume\">resume</Link></strong>.</div> */}\n <div className=\"bio mb-3\">I'm a full-stack software engineer. Check out my <strong><Link className=\"link-on-bg\" to=\"/projects\">projects</Link></strong> and <strong><Link className=\"link-on-bg\" to=\"/resume\">resume</Link></strong>.</div>\n <Link className=\"theme-btn-on-bg btn font-weight-bold theme-btn-cta\" to=\"/contact\">Hire Me</Link>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst getContent = () => {\n return (\n <section className=\"skills-section section py-5\">\n <div className=\"container\">\n <h3 className=\"section-title font-weight-bold text-center mb-3\">Skills Overview</h3>\n <div className=\"section-intro mx-auto text-center mb-5 text-secondary\">I have more than 15 years' experience building rich web applications. Below is a quick overview of my main technical skills and tools I use. Want to find out more about my experience? <Link to=\"/resume\">Check out my online resume</Link>.</div>\n\n <div className=\"skills-blocks mx-auto pt-5\">\n <div className=\"row\">\n <div className=\"skills-block col-12 col-lg-4 mb-5 mb-3 mb-lg-0\">\n <div className=\"skills-block-inner bg-white shadow-sm py-4 px-5 position-relative\">\n <h4 className=\"skills-cat text-center mb-3 mt-5\">Frontend</h4>\n <div className=\"skills-icon-holder position-absolute d-inline-block rounded-circle text-center\">\n <FrontEndIcon className=\"skills-icon\" />\n {/* <img className=\"skills-icon\" src=\"assets/images/frontend-icon.svg\"> */}\n </div>\n <ul className=\"skills-list list-unstyled text-secondary\">\n {getCheckmarkLi('Javascript')}\n {getCheckmarkLi('Typescript')}\n {getCheckmarkLi('HTML')}\n {getCheckmarkLi('CSS')}\n {getCheckmarkLi('React')}\n {getCheckmarkLi('MUI')}\n {getCheckmarkLi('jQuery')}\n {getCheckmarkLi('Jest/Enzyme')}\n </ul>\n </div>\n </div>\n\n <div className=\"skills-block col-12 col-lg-4 mb-5 mb-3 mb-lg-0\">\n <div className=\"skills-block-inner bg-white shadow-sm py-4 px-5 position-relative\">\n <h4 className=\"skills-cat text-center mb-3 mt-5\">Backend</h4>\n <div className=\"skills-icon-holder position-absolute d-inline-block rounded-circle text-center\">\n <BackEndIcon className=\"skills-icon\" />\n {/* <img className=\"skills-icon\" src=\"assets/images/backend-icon.svg\"> */}\n </div>\n <ul className=\"skills-list list-unstyled text-secondary\">\n {getCheckmarkLi('C#')}\n {getCheckmarkLi('Java')}\n {getCheckmarkLi('PHP')}\n {getCheckmarkLi('Node.js')}\n {getCheckmarkLi('.NET/MVC/Core/WebAPI')}\n {getCheckmarkLi('MSSQL/PostgreSQL/MySQL')}\n {getCheckmarkLi('Sqlite')}\n {getCheckmarkLi('MSTest/XUnit/NUnit/JUnit')}\n {/* {getCheckmarkLi('MongoDB/ElasticSearch')} */}\n </ul>\n </div>\n </div>\n\n <div className=\"skills-block col-12 col-lg-4\">\n <div className=\"skills-block-inner bg-white shadow-sm py-4 px-5 position-relative\">\n <h4 className=\"skills-cat text-center mb-3 mt-5\">Others</h4>\n <div className=\"skills-icon-holder position-absolute d-inline-block rounded-circle text-center\">\n <OtherSkillsIcon className=\"skills-icon\" />\n {/* <img className=\"skills-icon\" src=\"assets/images/other-skills-icon.svg\"> */}\n </div>\n <ul className=\"skills-list list-unstyled text-secondary\">\n {getCheckmarkLi('VSCode')}\n {getCheckmarkLi('IntelliJ/Rider')}\n {getCheckmarkLi('Visual Studio')}\n {getCheckmarkLi('Git/TFS')}\n {getCheckmarkLi('Docker')}\n {getCheckmarkLi('OAuth/SAML')}\n {getCheckmarkLi('Linux/Windows/Mac')}\n {getCheckmarkLi('Linux web server administration')}\n </ul>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </section>\n );\n}\n\nconst getCheckmarkLi = (text) => {\n return (\n <li className=\"mb-2\"><i className=\"fas fa-check mr-2 text-primary\"></i>{text}</li>\n );\n}\n","export const skillData = [\n // Top level languages\n {\n key: 'php',\n name: 'PHP'\n },\n {\n key: 'csharp',\n name: 'C#'\n },\n {\n key: 'java',\n name: 'Java'\n },\n \n // General\n {\n key: 'html',\n name: 'HTML'\n },\n {\n key: 'css',\n name: 'CSS'\n },\n {\n key: 'js',\n name: 'Javascript'\n },\n \n // Databases\n {\n key: 'mysql',\n name: 'MySQL'\n },\n {\n key: 'mssql',\n name: 'MSSQL'\n },\n {\n key: 'oracle',\n name: 'Oracle'\n },\n {\n key: 'sqlite',\n name: 'Sqlite'\n },\n {\n key: 'mongodb',\n name: 'MongoDB'\n },\n {\n key: 'elasticsearch',\n name: 'Elasticsearch'\n },\n {\n key: 'postgres',\n name: 'PostgreSQL'\n },\n \n // Misc\n {\n key: 'magento',\n name: 'Magento'\n },\n {\n key: 'dropwizard',\n name: 'Dropwizard'\n },\n {\n key: 'microservices',\n name: 'Microservices'\n },\n {\n key: 'node-express',\n name: 'Node Express'\n },\n {\n key: 'react',\n name: 'React'\n },\n {\n key: 'react-native',\n name: 'React Native'\n },\n {\n key: 'aws',\n name: 'AWS'\n },\n {\n key: 'ios',\n name: 'iOS'\n },\n {\n key: 'android',\n name: 'Android'\n },\n {\n key: 'tfs',\n name: 'TFS'\n },\n {\n key: 'git',\n name: 'Git'\n },\n {\n key: 'aspnet-webforms',\n name: 'ASP.NET WebForms'\n },\n {\n key: 'aspnet-mvc',\n name: 'ASP.NET MVC'\n },\n {\n key: 'jquery',\n name: 'jQuery'\n },\n {\n key: 'knockout',\n name: 'KnockoutJS'\n },\n {\n key: 'sitecore',\n name: 'Sitecore CMS'\n },\n {\n key: 'zencart',\n name: 'ZenCart'\n },\n {\n key: 'pdf',\n name: 'PDF'\n },\n {\n key: 'excel',\n name: 'Excel'\n },\n {\n key: 'gsap',\n name: 'GSAP'\n },\n {\n key: 'chrome',\n name: 'Chrome Extension'\n },\n {\n key: 'shell',\n name: 'Shell'\n },\n {\n key: 'dotnet-core',\n name: '.NET Core'\n },\n {\n key: 'saml',\n name: 'SAML'\n },\n {\n key: 'wordpress',\n name: 'WordPress'\n },\n {\n key: 'junit',\n name: 'JUnit'\n },\n {\n key: 'mstest',\n name: 'MSTest'\n },\n {\n key: 'jest',\n name: 'Jest'\n },\n {\n key: 'enzyme',\n name: 'Enzyme'\n },\n {\n key: 'k6',\n name: 'k6'\n },\n {\n key: 'architecture',\n name: 'Architecture'\n },\n {\n key: 'typescript',\n name: 'Typescript'\n },\n {\n key: 'docker',\n name: 'Docker'\n },\n {\n key: 'kubernetes',\n name: 'Kubernetes'\n },\n {\n key: 'markdown',\n name: 'Markdown'\n },\n {\n key: 'cra',\n name: 'Create React App'\n },\n {\n key: 'pwa',\n name: 'Progressive Web App'\n },\n {\n key: 'vite',\n name: 'Vite'\n },\n {\n key: 'mui',\n name: 'MUI'\n },\n {\n key: 'node',\n name: 'NodeJS'\n },\n {\n key: 'cli',\n name: 'CLI'\n },\n {\n key: 'db-migrations',\n name: 'DB Migrations'\n },\n {\n key: 'npm',\n name: 'NPM'\n }\n]","import React from 'react';\nimport { skillData } from '../skillData';\nimport { Link } from 'react-router-dom';\n\nexport default function ProjectCard(props) {\n const { projectData, cardImg, svgImg } = props;\n \n let hasTech = (tech) => {\n return projectData.techUsed.includes(tech);\n }\n\n return (\n <div className={`isotope-item col-12 col-lg-4 ${projectData.techUsed.join(' ')}`}>\n <div className=\"card rounded-0 border-0 shadow-sm mb-5\">\n <div className=\"card-img-container position-relative\">\n <img className=\"card-img-top rounded-0\" src={cardImg} alt={projectData.cardTitle} />\n <div className=\"card-img-overlay overlay-logo text-center\">\n <div className=\"project-logo\">{svgImg && <img className=\"img-fluid w-50\" src={svgImg} alt=\"\"></img>}</div>\n </div>\n <Link className=\"card-img-overlay overlay-content text-left p-lg-4\" to={`/projects/${projectData.projectKey}`}>\n <h5 className=\"card-title font-weight-bold\">{projectData.cardOverlayTitle}</h5>\n <p className=\"card-text\">{projectData.cardOverlayText}</p>\n </Link>\n </div>\n <div className=\"card-body pb-0\">\n <h4 className=\"card-title text-truncate text-center mb-0\"><Link to={`/projects/${projectData.projectKey}`}>{projectData.cardTitle}</Link></h4>\n </div>\n\n <div className=\"card-footer border-0 text-center bg-white pb-4\">\n <ul className=\"list-inline mb-0 mx-auto\">\n {skillData.map((s) => hasTech(s.key) && <SkillPill key={s.key} name={s.name} />)}\n </ul>\n </div>\n </div>\n </div>\n );\n}\n\nconst SkillPill = (props) => {\n return (\n <li className=\"list-inline-item\"><span className=\"badge badge-secondary badge-pill\">{props.name}</span></li>\n );\n}\n","export const projectData = [\n {\n projectKey: 'whs',\n techUsed: ['html', 'css', 'js', 'node-express', 'react', 'microservices', 'git', 'saml', 'architecture', 'aspnet-mvc', 'dotnet-core', 'docker', 'k6', 'typescript', 'docker'],\n cardImage: {\n src: 'swol.jpg',\n },\n cardTitle: 'WebMD Health Services',\n cardOverlayTitle: 'WebMD Health Services',\n cardOverlayText: 'Enterprise React, ASP.NET MVC/Core, Microservices application in the healthcare industry. Full-time position.'\n },\n {\n projectKey: 'my-staywell',\n techUsed: ['java', 'dropwizard', 'html', 'css', 'js', 'node-express', 'react', 'microservices', 'aws', 'ios', 'android', 'react-native', 'git', 'saml', 'junit', 'jest', 'enzyme', 'architecture'],\n cardImage: {\n src: 'swol.jpg',\n },\n cardTitle: 'MyStayWell Platform',\n cardOverlayTitle: 'MyStayWell Platform',\n cardOverlayText: 'Enterprise React, Java, Microservices application in the healthcare industry. Full-time position.'\n },\n {\n projectKey: 'staywell-online',\n techUsed: ['csharp', 'html', 'css', 'js', 'aspnet-webforms', 'aspnet-mvc', 'mssql', 'oracle', 'mongodb', 'elasticsearch', 'sitecore', 'jquery', 'knockout', 'tfs', 'saml', 'mstest'],\n cardImage: {\n src: 'swol.jpg',\n },\n cardTitle: 'StayWell Online',\n cardOverlayTitle: 'StayWell Online',\n cardOverlayText: 'Enterprise .NET, C# ,Oracle, MSSQL, MongoDB, Sitecore application in the healthcare industry. Full-time position.'\n },\n {\n projectKey: 'rumor-misc',\n techUsed: ['php', 'csharp', 'html', 'css', 'js', 'jquery', 'mysql', 'magento', 'zencart', 'wordpress'],\n cardImage: {\n src: 'rumor.jpg',\n },\n cardTitle: 'Rumor Advertising',\n cardOverlayTitle: 'Miscellaneous projects for Rumor Advertising',\n cardOverlayText: 'Misc projects while working full-time for Rumor Advertising'\n },\n {\n projectKey: 'interior-architects',\n techUsed: ['php', 'csharp', 'html', 'css', 'js', 'jquery'],\n cardImage: {\n src: 'ia_intranet.jpg',\n },\n cardTitle: 'Interior Architects',\n cardOverlayTitle: 'Interior Architects projects completed at Rumor Advertising',\n cardOverlayText: 'Back-end content management, job application form and corporate store'\n },\n {\n projectKey: 'canker-complete',\n techUsed: ['php', 'html', 'css', 'js', 'magento'],\n cardImage: {\n src: 'canker.jpg',\n },\n cardTitle: 'Canker Complete',\n cardOverlayTitle: 'Canker Complete',\n cardOverlayText: 'Magento e-commerce implementation'\n },\n {\n projectKey: 'dz-nuts',\n techUsed: ['php', 'html', 'css', 'js', 'zencart'],\n cardImage: {\n src: 'dznuts.jpg',\n },\n cardTitle: 'dznuts',\n cardOverlayTitle: 'dznuts',\n cardOverlayText: 'ZenCart e-commerce implementation'\n },\n {\n projectKey: 'brahma',\n techUsed: ['php', 'html', 'css', 'js', 'pdf'],\n cardImage: {\n src: 'brahma.jpg',\n },\n cardTitle: 'Brahma Group, Inc',\n cardOverlayTitle: 'Brahma Group, Inc',\n cardOverlayText: 'Job application form and dynamic PDF generation'\n },\n {\n projectKey: 'krosswood-doors',\n techUsed: ['php', 'html', 'css', 'js', 'mysql', 'excel'],\n cardImage: {\n src: 'krosswood.jpg',\n },\n cardTitle: 'Krosswood Doors',\n cardOverlayTitle: 'Krosswood Doors',\n cardOverlayText: 'Custom CRM, content management and dynamic excel generation'\n },\n {\n projectKey: 'foodinsurance',\n techUsed: ['php', 'mysql', 'html', 'css', 'js', 'jquery'],\n cardImage: {\n src: 'foodinsurance.jpg',\n },\n cardTitle: 'Foodinsurance',\n cardOverlayTitle: 'Foodinsurance',\n cardOverlayText: 'Magento e-commerce implementation'\n },\n {\n projectKey: 'evolutioncard',\n techUsed: ['php', 'mysql', 'html', 'css', 'js'],\n cardImage: {\n src: 'evolutioncard.jpg',\n },\n cardTitle: 'Evolutioncard',\n cardOverlayTitle: 'Evolutioncard',\n cardOverlayText: 'Misc PHP/MySQL applications to support call center and internal product management'\n },\n {\n projectKey: 'lochner',\n techUsed: ['csharp', 'mssql', 'html', 'css', 'js', 'jqyery'],\n cardImage: {\n src: 'lochner.jpg',\n },\n cardTitle: 'Lochner',\n cardOverlayTitle: 'Lochner',\n cardOverlayText: 'C# MSSQL company intranet and information static site. Full-time position.'\n },\n {\n projectKey: 'fatbob',\n techUsed: ['csharp', 'aspnet-webforms', 'html', 'css', 'js', 'jquery'],\n cardImage: {\n src: 'fatbob.jpg',\n },\n cardTitle: 'Fat Bob\\'s Garage',\n cardOverlayTitle: 'Fat Bob\\'s Garage',\n cardOverlayText: 'C# ASP.NET store front with production selection user interface'\n },\n {\n projectKey: 'silversocket',\n techUsed: ['csharp', 'html', 'css', 'js', 'jquery', 'gsap'],\n cardImage: {\n src: 'silversocket.jpg',\n },\n cardTitle: 'SilverSocket',\n cardOverlayTitle: 'SilverSocket',\n cardOverlayText: 'C# ASP.NET website for my LLC. Used this website project to try out GSAP (GreenSock Animation Platform).'\n },\n {\n projectKey: 'devautologin',\n techUsed: ['html', 'css', 'js', 'jquery', 'chrome'],\n cardImage: {\n src: 'devautologin.jpg',\n },\n cardTitle: 'Chrome Auto Login Extension',\n cardOverlayTitle: 'Chrome Auto Login Extension',\n cardOverlayText: 'Chrome extension to keep track of test users and automatically log me in with test users to sites I am working on locally'\n },\n {\n projectKey: 'media-manager',\n techUsed: ['csharp', 'mssql', 'html', 'css', 'js', 'jquery', 'chrome'],\n cardImage: {\n src: 'mediamanager.jpg',\n },\n cardTitle: 'Media Manager',\n cardOverlayTitle: 'Media Manager',\n cardOverlayText: 'C# MVC site with an accompanying chrome extension to save and keep track of funny gifs'\n },\n {\n projectKey: 'slack-dark-theme',\n techUsed: ['shell'],\n cardImage: {\n src: 'Slack-dark-theme.jpg',\n },\n cardTitle: 'Slack Dark Theme',\n cardOverlayTitle: 'Slack Dark Theme',\n cardOverlayText: 'Shell script to mod Slack and replace theme with a custom dark version'\n },\n {\n projectKey: 'countdown-solver',\n techUsed: ['csharp', 'js', 'sqlite', 'dotnet-core', 'react'],\n cardImage: {\n src: 'countdown-solver.png',\n },\n cardTitle: 'Countdown Solver',\n cardOverlayTitle: 'Countdown Solver',\n cardOverlayText: 'C#/React/Sqlite project to experiment with an algorithm to efficiently find words from a set of letters'\n },\n {\n projectKey: 'word-finder',\n techUsed: ['csharp', 'js', 'ts', 'react', 'vite', 'postgres'],\n cardImage: {\n src: 'word-finder.png',\n },\n cardTitle: 'Word Finder',\n cardOverlayTitle: 'Word Finder',\n cardOverlayText: 'C#/React/Vite project to upgrade the UI with filters for countdown-solver while also trying out Vite'\n },\n {\n projectKey: 'flashcards',\n techUsed: ['csharp', 'js', 'typescript', 'react', 'postgres', 'cra', 'pwa', 'markdown', 'mui'],\n cardImage: {\n src: 'flashcards.png'\n },\n cardTitle: 'Flashcards',\n cardOverlayTitle: 'Flashcards',\n cardOverlayText: 'C#/React/PWA project to create a flashcards educational progressive web app'\n },\n {\n projectKey: 'project-omega',\n techUsed: ['csharp', 'js', 'react', 'microservices', 'kubernetes', 'docker'],\n cardImage: {\n src: 'project-omega.png'\n },\n cardTitle: 'Project Omega',\n cardOverlayTitle: 'Project Omega',\n cardOverlayText: 'Proof of concept for a true monolith microservices hybrid with docker and kubernetes demos'\n },\n {\n projectKey: 'dotnet-react-sandbox',\n techUsed: ['csharp', 'js', 'typescript', 'react', 'docker', 'postgres', 'vite', 'mui'],\n cardImage: {\n src: 'dotnet-react-sandbox.png'\n },\n cardTitle: 'Dotnet React Sandbox',\n cardOverlayTitle: 'Dotnet React Sandbox',\n cardOverlayText: 'C#/React app to use as a staging ground for trying things and as a template for spinning up a new project'\n },\n {\n projectKey: 'dotnet-react-generator',\n techUsed: ['js', 'typescript', 'node', 'cli', 'npm'],\n cardImage: {\n src: 'dotnet-react-generator.png'\n },\n cardTitle: 'Dotnet React Generator',\n cardOverlayTitle: 'Dotnet React Generator',\n cardOverlayText: 'Node CLI utility and NPM package to generate new projects based on the dotnet-react-sandbox project'\n },\n {\n projectKey: 'ranked-voting',\n techUsed: ['js', 'typescript', 'node', 'npm'],\n cardImage: {\n src: 'ranked-voting.png'\n },\n cardTitle: 'Ranked Voting',\n cardOverlayTitle: 'Ranked Voting',\n cardOverlayText: 'Typescript NPM package to facilitate calculating ranked voting election results'\n },\n {\n projectKey: 'node-cli-utils',\n techUsed: ['js', 'node', 'cli', 'npm'],\n cardImage: {\n src: 'node-cli-utils.png'\n },\n cardTitle: 'Node CLI Utils',\n cardOverlayTitle: 'Node CLI Utils',\n cardOverlayText: 'Javascript NPM package to contain miscellaneous automation helper methods I use frequently in other projects'\n },\n {\n projectKey: 'environment-settings-dotnet',\n techUsed: ['csharp'],\n cardImage: {\n src: 'environment-settings-dotnet.png'\n },\n cardTitle: 'Dotnet Environment Settings',\n cardOverlayTitle: 'Dotnet Environment Settings',\n cardOverlayText: 'C# NuGet package with a wrapper for describing and accessing an application environment settings'\n },\n {\n projectKey: 'db-migrations-dotnet',\n techUsed: ['csharp', 'ef', 'db-migrations', 'cli'],\n cardImage: {\n src: 'db-migrations-dotnet.png'\n },\n cardTitle: 'Dotnet DB Migrations',\n cardOverlayTitle: 'Dotnet DB Migrations',\n cardOverlayText: 'C# library and JavaScript automation examples to demonstrate DB migrations in a .NET application without a third party framework'\n },\n {\n projectKey: '',\n techUsed: [],\n cardImage: {\n src: ''\n },\n cardTitle: '',\n cardOverlayTitle: '',\n cardOverlayText: ''\n }\n]\n","import React, { useEffect } from 'react';\nimport DefaultLayout from './DefaultLayout';\nimport ProjectCard from './ProjectCard';\nimport initIsotope from '../utils/initIsotope';\nimport { projectData } from '../projectData';\n\nimport imgStaywellOnline from '../assets/images/projects/swol.jpg';\nimport imgMyStaywell from '../assets/images/projects/mystaywell.png';\nimport imgRumor from '../assets/images/projects/rumor.jpg';\nimport imgIa from '../assets/images/projects/ia_intranet.jpg';\nimport imgCanker from '../assets/images/projects/canker.jpg';\nimport imgDzNuts from '../assets/images/projects/dznuts.jpg';\nimport imgBrahma from '../assets/images/projects/brahma.jpg';\nimport imgKrosswood from '../assets/images/projects/krosswood.jpg';\nimport imgFoodinsurance from '../assets/images/projects/foodinsurance.jpg';\nimport imgEvolutioncard from '../assets/images/projects/evolutioncard.jpg';\nimport imgLochner from '../assets/images/projects/lochner.jpg';\nimport imgFatbob from '../assets/images/projects/fatbob.jpg';\nimport imgSilverSocket from '../assets/images/projects/silversocket.jpg';\nimport imgDevAutoLogin from '../assets/images/projects/devautologin.jpg';\nimport imgMediaManager from '../assets/images/projects/mediamanager.jpg';\nimport imgSlackDark from '../assets/images/projects/slack-dark.png';\nimport imgCountdownSolver from '../assets/images/projects/countdown-solver.png';\nimport imgWordFinder from '../assets/images/projects/word-finder.png';\nimport imgWhs from '../assets/images/projects/whs-betteryourself.png';\nimport imgFlashcards from '../assets/images/projects/flashcards.png';\nimport imgProjectOmega from '../assets/images/projects/project-omega.png';\nimport imgDotnetReactSandbox from '../assets/images/projects/dotnet-react-sandbox.png';\nimport imgDotnetReactGenerator from '../assets/images/projects/dotnet-react-generator.png';\nimport imgRankedVoting from '../assets/images/projects/ranked-voting.png';\nimport imgNodeCliUtils from '../assets/images/projects/node-cli-utils.png';\nimport imgEnvironmentSettingsDotnet from '../assets/images/projects/environment-settings-dotnet.png';\nimport imgDbMigrationsDotnet from '../assets/images/projects/db-migrations-dotnet.png';\n\nimport svgStayWell from '../assets/images/svg/StayWell.svg';\nimport svgRumor from '../assets/images/svg/Rumor.svg';\nimport svgInteriorArchitects from '../assets/images/svg/InteriorArchitects.svg';\nimport svgCankerComplete from '../assets/images/svg/CankerComplete.svg';\nimport svgDznuts from '../assets/images/svg/dznuts.svg';\nimport svgBrahma from '../assets/images/svg/Brahma.svg';\nimport svgKrosswood from '../assets/images/svg/Krosswood.svg';\nimport svgFoodInsurance from '../assets/images/svg/FoodInsurance.svg';\nimport svgEvolutioncard from '../assets/images/svg/Evolutioncard.svg';\nimport svgLochner from '../assets/images/svg/Lochner.svg';\nimport svgFatBobsGarage from '../assets/images/svg/FatBobsGarage.svg';\nimport svgSilverSocket from '../assets/images/svg/SilverSocket.svg';\nimport svgChromeAutoLogin from '../assets/images/svg/ChromeAutoLogin.svg';\nimport svgMediaManager from '../assets/images/svg/MediaManager.svg';\nimport svgSlackDarkTheme from '../assets/images/svg/SlackDarkTheme.svg';\nimport svgCountdownSolver from '../assets/images/svg/CountdownSolver.svg';\nimport svgWordFinder from '../assets/images/svg/WordFinder.svg';\nimport svgWhs from '../assets/images/svg/WHS.svg'\nimport svgFlashcards from '../assets/images/svg/Flashcards.svg'\nimport svgProjectOmega from '../assets/images/svg/ProjectOmega.svg'\nimport svgDotnetReactSandbox from '../assets/images/svg/DotnetReactSandbox.svg'\nimport svgDotnetReactGenerator from '../assets/images/svg/DotnetReactGenerator.svg'\nimport svgRankedVoting from '../assets/images/svg/RankedVoting.svg'\nimport svgNodeCliUtils from '../assets/images/svg/NodeCliUtils.svg'\nimport svgEnvironmentSettingsDotnet from '../assets/images/svg/DotnetEnvironmentSettings.svg'\nimport svgDbMigrationsDotnet from '../assets/images/svg/DotnetDbMigrations.svg'\n\nimport { skillData } from '../skillData'\n\nexport default function Projects(props) {\n useEffect(() => {\n initIsotope();\n });\n\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst productDataForKey = (key) => {\n return projectData.find(pd => pd.projectKey === key);\n}\n\nconst getHeader = () => {\n return (\n <div className=\"header-intro theme-bg-primary text-white py-5\">\n <div className=\"container\">\n <h2 className=\"page-heading mb-3\">Projects</h2>\n <div className=\"page-heading-tagline\">Examples of some projects I've worked on</div>\n </div>\n </div>\n );\n}\n\nconst getContent = () => {\n return (\n <section className=\"section pt-5\">\n <div className=\"container\">\n <div className=\"text-center\">\n <ul id=\"filters\" className=\"filters mb-5 mx-auto pl-0\">\n <li key=\"all\" className=\"type active\" data-filter=\"*\">All</li>\n {skillData.map((s, i) => <li key={i} className=\"type\" data-filter={`.${s.key}`}>{s.name}</li>)}\n </ul>\n </div>\n\n <div className=\"project-cards row mb-5 isotope\">\n <ProjectCard projectData={productDataForKey('whs')} cardImg={imgWhs} svgImg={svgWhs} />\n <ProjectCard projectData={productDataForKey('my-staywell')} cardImg={imgMyStaywell} svgImg={svgStayWell} />\n <ProjectCard projectData={productDataForKey('staywell-online')} cardImg={imgStaywellOnline} svgImg={svgStayWell} />\n <ProjectCard projectData={productDataForKey('word-finder')} cardImg={imgWordFinder} svgImg={svgWordFinder} />\n <ProjectCard projectData={productDataForKey('flashcards')} cardImg={imgFlashcards} svgImg={svgFlashcards} />\n <ProjectCard projectData={productDataForKey('project-omega')} cardImg={imgProjectOmega} svgImg={svgProjectOmega} />\n <ProjectCard projectData={productDataForKey('dotnet-react-sandbox')} cardImg={imgDotnetReactSandbox} svgImg={svgDotnetReactSandbox} />\n <ProjectCard projectData={productDataForKey('dotnet-react-generator')} cardImg={imgDotnetReactGenerator} svgImg={svgDotnetReactGenerator} />\n <ProjectCard projectData={productDataForKey('ranked-voting')} cardImg={imgRankedVoting} svgImg={svgRankedVoting} />\n <ProjectCard projectData={productDataForKey('node-cli-utils')} cardImg={imgNodeCliUtils} svgImg={svgNodeCliUtils} />\n <ProjectCard projectData={productDataForKey('environment-settings-dotnet')} cardImg={imgEnvironmentSettingsDotnet} svgImg={svgEnvironmentSettingsDotnet} />\n <ProjectCard projectData={productDataForKey('db-migrations-dotnet')} cardImg={imgDbMigrationsDotnet} svgImg={svgDbMigrationsDotnet} />\n <ProjectCard projectData={productDataForKey('rumor-misc')} cardImg={imgRumor} svgImg={svgRumor} />\n <ProjectCard projectData={productDataForKey('interior-architects')} cardImg={imgIa} svgImg={svgInteriorArchitects} />\n <ProjectCard projectData={productDataForKey('canker-complete')} cardImg={imgCanker} svgImg={svgCankerComplete} />\n <ProjectCard projectData={productDataForKey('dz-nuts')} cardImg={imgDzNuts} svgImg={svgDznuts} />\n <ProjectCard projectData={productDataForKey('brahma')} cardImg={imgBrahma} svgImg={svgBrahma} />\n <ProjectCard projectData={productDataForKey('krosswood-doors')} cardImg={imgKrosswood} svgImg={svgKrosswood} />\n <ProjectCard projectData={productDataForKey('foodinsurance')} cardImg={imgFoodinsurance} svgImg={svgFoodInsurance} />\n <ProjectCard projectData={productDataForKey('evolutioncard')} cardImg={imgEvolutioncard} svgImg={svgEvolutioncard} />\n <ProjectCard projectData={productDataForKey('lochner')} cardImg={imgLochner} svgImg={svgLochner} />\n <ProjectCard projectData={productDataForKey('fatbob')} cardImg={imgFatbob} svgImg={svgFatBobsGarage} />\n <ProjectCard projectData={productDataForKey('silversocket')} cardImg={imgSilverSocket} svgImg={svgSilverSocket} />\n <ProjectCard projectData={productDataForKey('devautologin')} cardImg={imgDevAutoLogin} svgImg={svgChromeAutoLogin} />\n <ProjectCard projectData={productDataForKey('media-manager')} cardImg={imgMediaManager} svgImg={svgMediaManager} />\n <ProjectCard projectData={productDataForKey('slack-dark-theme')} cardImg={imgSlackDark} svgImg={svgSlackDarkTheme} />\n <ProjectCard projectData={productDataForKey('countdown-solver')} cardImg={imgCountdownSolver} svgImg={svgCountdownSolver} />\n </div>\n\n </div>\n </section>\n );\n}\n","import $ from 'jquery';\nimport imagesLoaded from 'imagesloaded';\nimport Isotope from 'isotope-layout';\nimport jQueryBridget from 'jquery-bridget';\n\nexport default function () {\n /* ======= Isotope plugin ======= */\n /* Ref: http://isotope.metafizzy.co/ */\n // init Isotope\n \n jQueryBridget( 'isotope', Isotope, $ );\n imagesLoaded.makeJQueryPlugin( $ );\n \n let $container = $('.isotope');\n \n $container.imagesLoaded(function () {\n $('.isotope').isotope({\n itemSelector: '.isotope-item',\n layoutMode: 'fitRows'\n });\n });\n \n // filter items on click\n $('#filters').on( 'click', '.type', function() {\n let filterValue = $(this).attr('data-filter');\n $container.isotope({ filter: filterValue });\n });\n \n // change is-checked class on buttons\n $('.filters').each( function( i, typeGroup ) {\n let $typeGroup = $( typeGroup );\n $typeGroup.on( 'click', '.type', function() {\n $typeGroup.find('.active').removeClass('active');\n $( this ).addClass('active');\n });\n });\n}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport DefaultLayout from './DefaultLayout';\nimport profileImage from '../assets/images/profile.png';\nimport {Link} from 'react-router-dom'\n\nexport default function Resume(props) {\n return <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} hideFooterInvite/>\n}\n\nconst getHeader = () => {\n return (\n <div className=\"header-intro header-intro-resume theme-bg-primary text-white py-5\">\n <div className=\"container position-relative\">\n <h2 className=\"page-heading mb-3\">Resume</h2>\n {/* <a className=\"btn theme-btn-on-bg download-resume position-absolute font-weight-bold mx-auto\" href=\"https://themes.3rdwavemedia.com/resources/sketch-template/pillar-sketch-sketch-resume-template-for-developers/\" target=\"_blank\"><i className=\"fas fa-download mr-2\"></i>Download PDF Version</a> */}\n </div>\n </div>\n );\n}\n\nconst getContent = () => {\n return (\n <article className=\"resume-wrapper text-center position-relative\">\n <div className=\"resume-wrapper-inner mx-auto text-left bg-white shadow-lg\">\n <header className=\"resume-header pt-4 pt-md-0\">\n <div className=\"media flex-column flex-md-row\">\n <img className=\"mr-3 img-fluid picture mx-auto\" src={profileImage} alt=\"Mike Thompson\"/>\n <div className=\"media-body p-4 d-flex flex-column flex-md-row mx-auto mx-lg-0\">\n <div className=\"primary-info\">\n <h1 className=\"name mt-0 mb-1 text-white text-uppercase text-uppercase\">Mike Thompson</h1>\n <div className=\"title mb-3\">Senior Full Stack Software Engineer</div>\n <ul className=\"list-unstyled\">\n <li className=\"mb-2\"><a href=\"mailto:mike@mikeyt.net\"><i className=\"far fa-envelope fa-fw mr-2\" data-fa-transform=\"grow-3\"></i>mike@mikeyt.net</a>\n </li>\n {/* <li><a href=\"#\"><i className=\"fas fa-mobile-alt fa-fw mr-2\" data-fa-transform=\"grow-6\"></i>0123 456 78900</a></li> */}\n </ul>\n </div>\n <div className=\"secondary-info ml-md-auto mt-2\">\n <ul className=\"resume-social list-unstyled\">\n <li className=\"mb-3\"><a href=\"https://www.linkedin.com/in/mike-thompson-101010\"><span className=\"fa-container text-center mr-2\"><i\n className=\"fab fa-linkedin-in fa-fw\"></i></span>linkedin.com/in/mike-thompson-101010</a></li>\n <li className=\"mb-3\"><a href=\"https://github.com/mikey-t\"><span className=\"fa-container text-center mr-2\"><i\n className=\"fab fa-github-alt fa-fw\"></i></span>github.com/mikey-t</a></li>\n <li><a href=\"https://mikeyt.net\"><span className=\"fa-container text-center mr-2\"><i className=\"fas fa-globe\"></i></span>mikeyt.net</a></li>\n </ul>\n </div>\n\n </div>\n </div>\n </header>\n <div className=\"resume-body p-5\">\n <section className=\"resume-section summary-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Career Summary</h2>\n <div className=\"resume-section-content\">\n <p className=\"mb-0\">I am a full stack software engineer with over 15 years' experience building rich enterprise web applications.</p>\n </div>\n </section>\n <div className=\"row\">\n <div className=\"col-lg-9\">\n <section className=\"resume-section experience-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Work Experience</h2>\n <div className=\"resume-section-content\">\n <div className=\"resume-timeline position-relative\">\n <WorkExpItem\n jobTitle=\"Senior Software Engineer / Architect\"\n companyName=\"WebMD Health Services (WHS acquired StayWell July 2020)\"\n dateRangeString=\"April 2010 - January 2025\"\n roleDesc=\"Started as a client implementations developer for an enterprise multi-tenant population health management web application in the healthcare industry. Created and maintained supporting utilities, tools and administrative applications. Moved into a software developer position working on new feature development and platform re-skin/restructuring projects. Assumed team lead role for a year and a half. Moved onto the Architecture team in 2019. Moved to the WHS Architecture team when StayWell was acquired in July 2020. Officially promoted to Architect at WebMD Health Services in July of 2021.\"\n achieveIntro=\"A few highlights (see portfolio for additional detail):\"\n achieveBullets={[\n 'Created web based, console and WPF administration tools to simplify processes',\n 'Worked on complete front-end rewrite',\n 'Worked with certified Sitecore partner to integrate our solution with Sitecore CMS',\n 'Team Lead 2016-2018 for distributed remote team, including offshore resources',\n 'Created extensible inbound and outbound SAML SSO functionality and supporting tools and utilities',\n 'Implemented multiple third party integrations (SAML SSO, OAuth and API integrations)',\n 'Assisted in migration of entire platform to new tech stack'\n ]}\n techList={['C#', 'Java', 'Javascript', 'jQuery', 'KnockoutJS', 'HTML', 'CSS', 'React', 'React Native', 'ASP.NET', 'WebForms', 'MVC', 'Sitecore', 'TFS', 'Git', 'MSSQL', 'Oracle', 'MySQL', 'Redis', 'MongoDB', 'ElasticSearch', 'SAML', 'Dropwizard', 'Node Express', 'Microservices', 'AWS', 'iOS', 'Android', 'Visual Studio', 'VSCode', 'IntelliJ', 'Windows', 'Ubuntu', 'MacOS']}\n seeOnlineLinks/>\n\n {/* <WorkExpItem\n jobTitle=\"Owner/Freelance Web Developer\"\n companyName=\"SilverSocket, LLC\"\n dateRangeString=\"December 2007 – December 2018\"\n roleDesc=\"Created an LLC for freelance web development jobs.\"\n achieveIntro=\"\"\n achieveBullets={[\n 'Created custom CMS solutions, customized shopping carts, built custom websites from scratch and created custom WordPress plugins and theme components'\n ]}\n techList={['C#', 'ASP.NET', 'MSSQL', 'PHP', 'MySQL', 'HTML', 'CSS', 'Javascript', 'WordPress']} /> */}\n\n <WorkExpItem\n jobTitle=\"Web Developer\"\n companyName=\"Rumor Advertising\"\n dateRangeString=\"September 2008 – October 2009\"\n roleDesc=\"Worked as LAMP developer with clients and in-house designers to create custom websites and CMS solutions.\"\n achieveIntro=\"\"\n achieveBullets={[\n 'Created custom PHP framework to quickly spin up new sites for clients',\n 'Worked closely with designers to transform photoshop designs into unique custom websites'\n ]}\n techList={['PHP', 'HTML', 'CSS', 'Javascript', 'MySQL', 'C#', 'ASP.NET', 'Magento', 'ZenCart', 'WordPress']}/>\n\n <WorkExpItem\n jobTitle=\"Software Engineer\"\n companyName=\"H.W. Lochner\"\n dateRangeString=\"June 2008 – September 2008\"\n roleDesc=\"Helped develop new Lochner intranet CMS and worked on miscellaneous client project websites.\"\n techList={['C#', 'ASP.NET', 'MSSQL', 'NHibernate']}/>\n\n <WorkExpItem\n jobTitle=\"Web Developer\"\n companyName=\"Evolution Management Group\"\n dateRangeString=\"January 2007 – November 2007\"\n roleDesc=\"LAMP developer responsible for maintenance and new development for internal and customer facing web applications.\"\n achieveIntro=\"\"\n achieveBullets={[\n 'Developed content management system for an online company newsletter',\n 'Developed web based reporting applications integrated with call center data',\n 'Contributed to full re-write of primary customer facing web application'\n ]}\n techList={['PHP', 'MySQL', 'HTML', 'CSS', 'Javascript']}/>\n\n {/* <WorkExpItem\n jobTitle=\"\"\n companyName=\"\"\n dateRangeString=\"\"\n roleDesc=\"\"\n achieveIntro=\"\"\n achieveBullets={[\n ''\n ]}\n techList={['']} /> */}\n </div>\n\n </div>\n </section>\n </div>\n <div className=\"col-lg-3\">\n <section className=\"resume-section skills-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Skills & Tools</h2>\n <div className=\"resume-section-content\">\n <div className=\"resume-skill-item\">\n {/* <h4 className=\"resume-skills-cat font-weight-bold\">Frontend</h4> */}\n {/*<ul className=\"list-unstyled mb-4\">*/}\n {/* <BarSkill name=\"C#\" value=\"95\"/>*/}\n {/* <BarSkill name=\"Java\" value=\"90\"/>*/}\n {/* <BarSkill name=\"Javascript\" value=\"90\"/>*/}\n {/* <BarSkill name=\"MySQL/MSSQL\" value=\"90\"/>*/}\n {/* <BarSkill name=\"MongoDB\" value=\"90\"/>*/}\n {/* <BarSkill name=\"ASP.NET MVC/Core/WebAPI\" value=\"90\"/>*/}\n {/* <BarSkill name=\"HTML\" value=\"85\"/>*/}\n {/* <BarSkill name=\"CSS\" value=\"80\"/>*/}\n {/* <BarSkill name=\"React\" value=\"85\"/>*/}\n {/* <BarSkill name=\"Git\" value=\"80\"/>*/}\n {/* <BarSkill name=\"SAML\" value=\"95\"/>*/}\n {/* <BarSkill name=\"MSTest/JUnit\" value=\"95\"/>*/}\n {/* <BarSkill name=\"Jest/Enzyme\" value=\"80\"/>*/}\n\n\n {/* <li className=\"mb-2\">\n <div className=\"resume-skill-name\">Angular</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"98%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">React</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"94%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">JavaScript</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"96%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">Node.js</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"92%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">HTML/CSS/SASS/LESS</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"96%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li> */}\n {/*</ul>*/}\n </div>\n\n {/* <div className=\"resume-skill-item\">\n <h4 className=\"resume-skills-cat font-weight-bold\">Backend</h4>\n <ul className=\"list-unstyled\">\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">Python/Django</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"95%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">Ruby/Rails</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"92%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">PHP</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"86%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n <li className=\"mb-2\">\n <div className=\"resume-skill-name\">WordPress/Shopify</div>\n <div className=\"progress resume-progress\">\n <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{ width: \"82%\" }} aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n </div>\n </li>\n </ul>\n </div> */}\n\n <div className=\"resume-skill-item\">\n {/*<h4 className=\"resume-skills-cat font-weight-bold\">Others</h4>*/}\n <ul className=\"list-inline\">\n <BulletSkill name=\"C#\"/>\n <BulletSkill name=\"Java\"/>\n <BulletSkill name=\"JavaScript\"/>\n <BulletSkill name=\"Typescript\"/>\n <BulletSkill name=\"MySQL\"/>\n <BulletSkill name=\"MSSQL\"/>\n <BulletSkill name=\"MongoDB\"/>\n <BulletSkill name=\"ASP.NET MVC\"/>\n <BulletSkill name=\".NET Core\"/>\n <BulletSkill name=\"HTML\"/>\n <BulletSkill name=\"CSS\"/>\n <BulletSkill name=\"React\"/>\n <BulletSkill name=\"Git\"/>\n <BulletSkill name=\"Saml\"/>\n <BulletSkill name=\"MSTest\"/>\n <BulletSkill name=\"JUnit\"/>\n <BulletSkill name=\"Jest\"/>\n <BulletSkill name=\"Enzyme\"/>\n <BulletSkill name=\"Mocha\"/>\n <BulletSkill name=\"VSCode\"/>\n <BulletSkill name=\"NodeJS\"/>\n <BulletSkill name=\"jQuery\"/>\n <BulletSkill name=\"KnockoutJS\"/>\n <BulletSkill name=\"Sitecore\"/>\n <BulletSkill name=\"PHP\"/>\n <BulletSkill name=\"Sqlite\"/>\n <BulletSkill name=\"ElasticSearch\"/>\n <BulletSkill name=\"Dropwizard\"/>\n <BulletSkill name=\"Microservices\"/>\n <BulletSkill name=\"Magento\"/>\n <BulletSkill name=\"ZenCart\"/>\n <BulletSkill name=\"Express\"/>\n <BulletSkill name=\"AWS\"/>\n <BulletSkill name=\"TFS\"/>\n <BulletSkill name=\"Chrome Extensions\"/>\n <BulletSkill name=\"Shell\"/>\n <BulletSkill name=\"WordPress\"/>\n <BulletSkill name=\"XML\"/>\n <BulletSkill name=\"Python\"/>\n <BulletSkill name=\"Redis\"/>\n <BulletSkill name=\"PostgreSQL\"/>\n <BulletSkill name=\"Vite\"/>\n <BulletSkill name=\"Docker\"/>\n\n {/* <li className=\"list-inline-item\"><span className=\"badge badge-light\">DevOps</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">Code Review</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">Git</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">Unit Testing</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">Wireframing</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">Sketch</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">Balsamiq</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">WordPress</span></li>\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">Shopify</span></li> */}\n </ul>\n </div>\n </div>\n </section>\n {/* <section className=\"resume-section education-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Education</h2>\n <div className=\"resume-section-content\">\n <ul className=\"list-unstyled\">\n <li className=\"mb-2\">\n <div className=\"resume-degree font-weight-bold\">MSc in Computer Science</div>\n <div className=\"resume-degree-org\">University College London</div>\n <div className=\"resume-degree-time\">2010 - 2011</div>\n </li>\n <li>\n <div className=\"resume-degree font-weight-bold\">BSc Maths and Physics</div>\n <div className=\"resume-degree-org\">Imperial College London</div>\n <div className=\"resume-degree-time\">2007 - 2010</div>\n </li>\n </ul>\n </div>\n </section> */}\n <section className=\"resume-section education-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Education</h2>\n <div className=\"resume-section-content\">\n <ul className=\"list-unstyled\">\n <li className=\"mb-2\">\n {/* <div className=\"resume-degree font-weight-bold\">MSc in Computer Science</div> */}\n <div className=\"resume-degree-org\">University of Utah</div>\n <div className=\"resume-degree-time\">2005 - 2008</div>\n <div className=\"\">Completed core coursework for BS in computer science</div>\n </li>\n </ul>\n </div>\n </section>\n <section className=\"resume-section reference-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Certifications</h2>\n <div className=\"resume-section-content\">\n <ul className=\"list-unstyled resume-awards-list\">\n <li className=\"mb-2 pl-4 position-relative\">\n <i className=\"resume-award-icon fas fa-trophy position-absolute\" data-fa-transform=\"shrink-2\"></i>\n <div className=\"resume-award-name\">Certified Ethical Hacker</div>\n <div className=\"resume-award-desc\">EC-Council Certified – 2011</div>\n </li>\n <li className=\"mb-0 pl-4 position-relative\">\n <i className=\"resume-award-icon fas fa-trophy position-absolute\" data-fa-transform=\"shrink-2\"></i>\n <div className=\"resume-award-name\">MCSD</div>\n <div className=\"resume-award-desc\">Microsoft Certified Solutions Developer 2015 MC ID 12066987</div>\n </li>\n </ul>\n </div>\n </section>\n {/* <section className=\"resume-section language-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Language</h2>\n <div className=\"resume-section-content\">\n <ul className=\"list-unstyled resume-lang-list\">\n <li className=\"mb-2\"><span className=\"resume-lang-name font-weight-bold\">English</span> <small className=\"text-muted font-weight-normal\">(Native)</small></li>\n <li className=\"mb-2 align-middle\"><span className=\"resume-lang-name font-weight-bold\">French</span> <small className=\"text-muted font-weight-normal\">(Professional)</small></li>\n <li><span className=\"resume-lang-name font-weight-bold\">Spanish</span> <small className=\"text-muted font-weight-normal\">(Professional)</small></li>\n </ul>\n </div>\n </section> */}\n {/* <section className=\"resume-section interests-section mb-5\">\n <h2 className=\"resume-section-title text-uppercase font-weight-bold pb-3 mb-3\">Interests</h2>\n <div className=\"resume-section-content\">\n <ul className=\"list-unstyled\">\n <li className=\"mb-1\">Gaming</li>\n <li className=\"mb-1\">Coding</li>\n <li className=\"mb-1\">Basketball</li>\n <li className=\"mb-1\">Biking</li>\n </ul>\n </div>\n </section> */}\n\n </div>\n </div>\n </div>\n\n </div>\n </article>\n );\n}\n\nconst WorkExpItem = (props) => {\n return (\n <article className=\"resume-timeline-item position-relative pb-5\">\n <div className=\"resume-timeline-item-header mb-2\">\n <div className=\"d-flex flex-column flex-md-row\">\n <h3 className=\"resume-position-title font-weight-bold mb-1\">{props.jobTitle}</h3>\n <div className=\"resume-company-name ml-auto\">{props.companyName}</div>\n </div>\n <div className=\"resume-position-time\">{props.dateRangeString}</div>\n </div>\n <div className=\"resume-timeline-item-desc\">\n <p>{props.roleDesc}</p>\n {(!!props.achieveIntro || !!props.achieveBullets) && <h4 className=\"resume-timeline-item-desc-heading font-weight-bold\">Achievements:</h4>}\n {props.achieveIntro && <p>{props.achieveIntro}</p>}\n {props.achieveBullets && <ul>\n {props.achieveBullets.map((text, i) => <li key={i}>{text}</li>)}\n {props.seeOnlineLinks && <li>For more details, see my project pages: <Link to=\"/projects/staywell-online\">StayWell Online</Link>, <Link to=\"/projects/my-staywell\">My StayWell</Link> and <Link to=\"/projects/whs\">WebMD Health Services</Link></li>}\n </ul>}\n <h4 className=\"resume-timeline-item-desc-heading font-weight-bold\">Technologies used:</h4>\n <ul className=\"list-inline\">\n {props.techList.map((text, i) => <li key={i} className=\"list-inline-item\"><span className=\"badge badge-secondary badge-pill\">{text}</span></li>)}\n \n </ul>\n </div>\n </article>\n );\n}\n\nWorkExpItem.propTypes = {\n jobTitle: PropTypes.string.isRequired,\n companyName: PropTypes.string.isRequired,\n dateRangeString: PropTypes.string.isRequired,\n roleDesc: PropTypes.string.isRequired,\n achieveIntro: PropTypes.string,\n achieveBullets: PropTypes.arrayOf(PropTypes.string),\n techList: PropTypes.arrayOf(PropTypes.string).isRequired\n};\n\n// const BarSkill = (props) => {\n// return (\n// <li className=\"mb-2\">\n// <div className=\"resume-skill-name\">{props.name}</div>\n// <div className=\"progress resume-progress\">\n// <div className=\"progress-bar theme-progress-bar-dark\" role=\"progressbar\" style={{width: `${props.value}%`}} aria-valuenow={props.value}\n// aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n// </div>\n// </li>\n// );\n// }\n\nconst BulletSkill = (props) => {\n return (\n <li className=\"list-inline-item\"><span className=\"badge badge-light\">{props.name}</span></li>\n );\n}\n","import React from 'react' // eslint-disable-line\nimport DefaultLayout from './DefaultLayout'\n// import profileImage from '../assets/images/profile.png'\n// import { useForm } from 'react-hook-form'\nimport './Contact.style.css'\n// import axios from 'axios'\n// import { Link, useHistory } from 'react-router-dom'\n\nexport default function Contact(props) {\n return <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={ContactContent()} hideFooterInvite />\n}\n\nconst getHeader = () => {\n return (\n <div className=\"header-intro theme-bg-primary text-white py-5\">\n <div className=\"container\">\n <h2 className=\"page-heading mb-0\">Contact</h2>\n </div>\n </div>\n )\n}\n\nconst ContactContent = () => {\n // const history = useHistory() // eslint-disable-line\n // const [loading, setLoading] = useState(false)\n // const [sent, setSent] = useState(false)\n // const { register, handleSubmit, errors, setValue } = useForm({ mode: 'onBlur' }) // eslint-disable-line\n // const onSubmit = data => {\n // console.log('data to send: ', data)\n // setLoading(true)\n // axios.post('/api/Contact/SubmitMessage', data)\n // .then(response => {\n // console.log('response: ', response)\n // setSent(true)\n // setLoading(false)\n // })\n // .catch((err) => {\n // //history.push('/sorry')\n // console.log('error: ', err)\n // setLoading(false)\n // })\n // }\n // useEffect(() => {\n // setValue('name', 'Some Dude')\n // setValue('email', 'some.dude@test.com')\n // setValue('message', 'Some text here.\\n\\nAnd here\\'s some text after a newline.')\n // }, [])\n\n\n return (\n <section className=\"section py-5\">\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"contact-intro col-lg-8 mx-lg-auto mb-5 text-center\">\n\n {/* <img className=\"profile-small d-inline-block mx-auto rounded-circle mb-3\" src={profileImage} alt=\"Mike Thompson\" /> */}\n\n <div className=\"speech-bubble bg-white p-4 p-lg-5 shadow-sm\">\n <div >\n <p className=\"mb-3\" style={{ margin: 'center' }}>Email: mike@mikeyt.net</p>\n </div>\n\n <ul className=\"social-list-color list-inline mb-0\">\n {/* <li className=\"list-inline-item mb-3\"><a className=\"twitter\" href=\"#\"><i className=\"fab fa-twitter fa-fw\"></i></a></li> */}\n <li className=\"list-inline-item mb-3\"><a className=\"linkedin\" href=\"https://www.linkedin.com/in/michael-thompson-8a850b3/\" target=\"_blank\" rel=\"noopener noreferrer\"><i className=\"fab fa-linkedin-in fa-fw\"></i></a></li>\n <li className=\"list-inline-item mb-3\"><a className=\"github\" href=\"https://github.com/mikey-t\" target=\"_blank\" rel=\"noopener noreferrer\"><i className=\"fab fa-github-alt fa-fw\"></i></a></li>\n <li className=\"list-inline-item mb-3\"><a className=\"stack-overflow\" href=\"https://stackoverflow.com/users/1072277/mikeyt\" target=\"_blank\" rel=\"noopener noreferrer\"><i className=\"fab fa-stack-overflow fa-fw\"></i></a></li>\n {/* <li className=\"list-inline-item mb-3\"><a className=\"medium\" href=\"#\"><i className=\"fab fa-medium-m fa-fw\"></i></a></li> */}\n {/* <li className=\"list-inline-item mb-3\"><a className=\"codepen\" href=\"#\"><i className=\"fab fa-codepen fa-fw\"></i></a></li> */}\n {/* <li className=\"list-inline-item mb-3\"><a className=\"facebook\" href=\"#\"><i className=\"fab fa-facebook-f fa-fw\"></i></a></li> */}\n {/* <li className=\"list-inline-item\"><a className=\"instagram\" href=\"#\"><i className=\"fab fa-instagram fa-fw\"></i></a></li> */}\n </ul>\n </div>\n\n </div>\n {/* {sent && <div className=\"contact-intro col-lg-8 mx-lg-auto mb-5 text-center\">\n <div className=\"speech-bubble bg-white p-4 p-lg-5 shadow-sm\"><p>Thanks!</p></div>\n </div>}\n {!sent && <form id=\"contact-form\" className=\"contact-form col-lg-8 mx-lg-auto\" method=\"post\" action=\"\" onSubmit={handleSubmit(onSubmit)}>\n <h3 className=\"text-center mb-3\">Get In Touch</h3>\n <div className=\"form-row\">\n <div className=\"form-group col-md-6\">\n <label className=\"sr-only\" htmlFor=\"name\">Name</label>\n <input type=\"text\" className={`form-control${errors.name ? ' invalid' : ''}`} id=\"name\" name=\"name\" placeholder=\"Name\"\n minLength=\"2\" required aria-required=\"true\" ref={register({ required: true, minLength: 2 })} disabled={loading} />\n {errors.name && errors.name.type === 'required' && <span className=\"invalid\">Name is required</span>}\n {errors.name && errors.name.type === 'minLength' && <span className=\"invalid\">Name must have at least 2 characters</span>}\n </div>\n <div className=\"form-group col-md-6\">\n <label className=\"sr-only\" htmlFor=\"email\">Email</label>\n <input\n type=\"email\"\n className=\"form-control\"\n id=\"email\" name=\"email\"\n placeholder=\"Email\"\n required aria-required=\"true\"\n ref={register({ required: true, pattern: new RegExp(/^((\"[\\w-\\s]+\")|([\\w-]+(?:\\.[\\w-]+)*)|(\"[\\w-\\s]+\")([\\w-]+(?:\\.[\\w-]+)*))(@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$)|(@\\[?((25[0-5]\\.|2[0-4][0-9]\\.|1[0-9]{2}\\.|[0-9]{1,2}\\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\]?$)/i) })}\n disabled={loading} />\n {errors.email && errors.email.type === 'required' && <span className=\"invalid\">Email is required</span>}\n {errors.email && errors.email.type !== 'required' && <span className=\"invalid\">Please enter a valid email</span>}\n </div>\n <div className=\"form-group col-12\">\n <label className=\"sr-only\" htmlFor=\"message\">Your message</label>\n <textarea className=\"form-control\" id=\"message\" name=\"message\" placeholder=\"Enter your message\" rows=\"10\" required aria-required=\"true\" ref={register({ required: true })} disabled={loading}></textarea>\n {errors.message && <span className=\"invalid\">Message is required</span>}\n </div>\n <div className=\"form-group col-12\">\n <button type=\"submit\" className=\"btn btn-block btn-primary py-2\" disabled={loading}>{loading ? 'Sending...' : 'Send It'}</button>\n </div>\n </div>\n </form>} */}\n </div>\n </div>\n </section>\n )\n}\n","import React from 'react';\n\nexport default function ProjectHeader(props) {\n return (\n <div className=\"header-intro theme-bg-primary text-white py-5\">\n <div className=\"container position-relative\">\n <h2 className=\"page-heading mb-2\">{props.title}</h2>\n {props.tagline && <div className=\"page-heading-tagline\">{props.tagline}</div>}\n {/* <div className=\"page-heading-logo font-weight-bold position-absolute mt-4 mt-md-0\">\n <img className=\"client-logo\" src=\"assets/images/logos/logo-2-inverse.svg\" />\n </div> */}\n </div>\n </div>\n );\n}","import React from 'react';\n\nexport default function CenteredImage(props) {\n return (\n <div className=\"mb-5\" style={{textAlign: 'center'}}><img className=\"img-fluid\" src={props.src} alt={props.alt} /></div>\n );\n}","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nexport default function GoBackToProjects() {\n return (\n <section className=\"project-wrapper single-col-max-width px-4 mx-auto\" style={{ paddingBottom: '0 important!', marginBottom: '0 important!', paddingTop: '10px' }}>\n <Link to=\"/projects\"><i className=\"fas fa-chevron-left\"></i> Back To Projects</Link>\n </section>\n );\n}","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport CenteredImage from '../CenteredImage';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport imgRumor from '../../assets/images/projects/rumor.jpg';\nimport imgAcademica from '../../assets/images/projects/academica.jpg';\nimport imgAries from '../../assets/images/projects/aries.jpg';\nimport imgBodyfit from '../../assets/images/projects/bodyfitwellness.jpg';\nimport imgDailybread from '../../assets/images/projects/dailybread.jpg';\nimport imgNerveci from '../../assets/images/projects/nerveci.jpg';\nimport imgOCTanner from '../../assets/images/projects/octanner.jpg';\nimport imgOnetel from '../../assets/images/projects/onetel.jpg';\nimport imgDisplayBoys from '../../assets/images/projects/display_boys.jpg';\n\nexport default function Project(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Rumor Advertising Miscellaneous Projects\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={imgRumor} alt=\"Rumor Advertising\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>While employed full time at Rumor Advertising I worked on a number of projects using a variety of technologies with many different goals.\n Here I'll list a few of the miscellaneous projects that are not included on other pages.</p>\n </div>\n\n <MiscProj company=\"Academica West\" img={imgAcademica}>\n <p>Goal: informational site and a lead generation form.</p>\n <p>I used a custom PHP template engine I wrote to facilitate quick construction of this site.</p>\n </MiscProj>\n\n <MiscProj company=\"Aries Capital Partners\" img={imgAries}>\n <p>Goal: news content management.</p>\n <p>For this project I built a user login and a simple content manager for adding, removing and editing news items.</p> \n </MiscProj>\n\n <MiscProj company=\"Bodyfit Wellness\" img={imgBodyfit}>\n <p>Goal: a simple interface to connect Bodyfit's website to their gift certificate purchase page at paypal.com.</p>\n <p>This project was a standard paypal integration with a form that accepts the gift certificate amount, recipient's name, sender's name and forwards that information on to paypal to complete the transaction.</p>\n </MiscProj>\n\n <MiscProj company=\"Dailybread\" img={imgDailybread}>\n <p>Goal: informational site and a lead generation form.</p>\n <p>I used a custom PHP template engine I wrote to facilitate quick construction of this site.</p>\n </MiscProj>\n \n <MiscProj company=\"Display Boys\" img={imgDisplayBoys}>\n <p>Goal: build content management for Display Boys' flash website.</p>\n <p>Created a simple tool to manage data to be displayed and integrated content into flash site using javascript hooks.</p>\n </MiscProj>\n\n <MiscProj company=\"Nerve Custom Integrators\" img={imgNerveci}>\n <p>Goal: add an image gallery to Nerve's placeholder website.</p>\n <p>I used a free flash image gallery called SimpleViewer.</p>\n </MiscProj>\n\n <MiscProj company=\"OC Tanner\" img={imgOCTanner}>\n <p>Goal: implement designs for a prototype of O.C. Tanner's new program management software.</p>\n <p>Although the prototype was built primarily for displaying the visual template I was asked to implement functionality for a few pages in the site so they could get a good feel for how things would look and feel.</p>\n </MiscProj>\n\n <MiscProj company=\"OneTel\" img={imgOnetel}>\n <p>Goal: Create an informational website based on Photoshop documents.</p>\n </MiscProj>\n </section>\n </>\n );\n}\n\nconst MiscProj = (props) => {\n return (\n <div className=\"section-row\">\n <CenteredImage src={props.img} alt={props.company} />\n <h3 className=\"section-title\">{props.company}</h3>\n {props.children}\n </div>\n );\n}\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"g\", {\n id: \"Page-1\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"arrow-left\",\n fill: \"#FFFFFF\",\n fillRule: \"nonzero\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M4.1,120.5 L121.9,4.5 C126.6,-0.2 134.2,-0.2 138.9,4.5 L146,11.6 C150.7,16.3 150.7,23.9 146,28.6 L43.7,129 L145.9,229.4 C150.6,234.1 150.6,241.7 145.9,246.4 L138.8,253.5 C134.1,258.2 126.5,258.2 121.8,253.5 L4,137.5 C-0.6,132.8 -0.6,125.2 4.1,120.5 Z\",\n id: \"Shape\"\n})));\n\nvar SvgCarouselLeft = function SvgCarouselLeft(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"40px\",\n height: \"40px\",\n viewBox: \"0 0 150 258\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref2);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgCarouselLeft, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/carousel-left.24d33847.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"g\", {\n id: \"Page-1\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"arrow-right\",\n fill: \"#FFFFFF\",\n fillRule: \"nonzero\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M145.9,137.5 L28.1,253.5 C23.4,258.2 15.8,258.2 11.1,253.5 L4,246.4 C-0.7,241.7 -0.7,234.1 4,229.4 L106.3,129 L4.1,28.6 C-0.6,23.9 -0.6,16.3 4.1,11.6 L11.2,4.5 C15.9,-0.2 23.5,-0.2 28.2,4.5 L146,120.5 C150.6,125.2 150.6,132.8 145.9,137.5 Z\",\n id: \"Shape\"\n})));\n\nvar SvgCarouselRight = function SvgCarouselRight(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"40px\",\n height: \"40px\",\n viewBox: \"0 0 150 258\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref2);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgCarouselRight, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/carousel-right.48458de0.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react';\n\nexport default function() {\n return (\n <p>This project was completed while working full-time at Rumor Advertising.</p>\n );\n}","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport imgIa from '../../assets/images/projects/ia.jpg';\nimport imgIaIntranet from '../../assets/images/projects/ia_intranet_442.jpg';\nimport imgIaCorpStore from '../../assets/images/projects/ia_corp_store_442.jpg';\n\nimport {ReactComponent as CarouselLeft} from '../../assets/images/carousel-left.svg';\nimport {ReactComponent as CarouselRight} from '../../assets/images/carousel-right.svg';\nimport RumorBlurb from './RumorBlurb';\n\nexport default function InteriorArchitects(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Interior Architects\"/>;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <div id=\"project-carousel\" className=\"theme-carousel carousel slide mb-5\" data-ride=\"carousel\" style={{maxWidth: 575, margin: 'auto'}}>\n <ol className=\"carousel-indicators\">\n <li data-target=\"#project-carousel\" data-slide-to=\"0\" className=\"active\"></li>\n <li data-target=\"#project-carousel\" data-slide-to=\"1\"></li>\n <li data-target=\"#project-carousel\" data-slide-to=\"2\"></li>\n </ol>\n\n <div className=\"carousel-inner\">\n <div className=\"carousel-item active\">\n <img className=\"d-block w-100\" src={imgIa} alt=\"Interior Architects Screenshot\"/>\n </div>\n <div className=\"carousel-item\">\n <img className=\"d-block w-100\" src={imgIaIntranet} alt=\"Interior Architects Corporate Intranet Screenshot\"/>\n </div>\n <div className=\"carousel-item\">\n <img className=\"d-block w-100\" src={imgIaCorpStore} alt=\"Interior Architects Corporate Store Screenshot\"/>\n </div>\n </div>\n\n <a className=\"carousel-control-prev\" href=\"#project-carousel\" role=\"button\" data-slide=\"prev\">\n <CarouselLeft/>\n <span className=\"sr-only\">Previous</span>\n </a>\n <a className=\"carousel-control-next\" href=\"#project-carousel\" role=\"button\" data-slide=\"next\">\n <CarouselRight/>\n <span className=\"sr-only\">Next</span>\n </a>\n </div>\n\n <h3 className=\"section-title\">Project Background</h3>\n <p>Goals:</p>\n <ul>\n <li className=\"mb-3\">Create back-end content management and make that content available for the flash application. Create an interface for job\n applicants to upload their resume and cover letter and select which jobs they are interested in.\n </li>\n <li className=\"mb-3\">Build a corporate store on the company intranet that integrates with third party fulfillment</li>\n <li className=\"mb-3\">Build website from Photoshop documents and transfer content of old site to the new corporate intranet site</li>\n </ul>\n </div>\n\n <p>The back-end interface allows the admin to create job postings, press releases and public speaking events. Content integrated into flash application\n using javascript hooks and a popup page.</p>\n\n <p>The corporate store application was written in ASP.NET/C# to cater to the client's hosting environment. The site functions as a normal shopping cart\n but submits the information via HTTP request to the fulfillment company's server instead of processing payment information or handling other standard\n ecommerce tasks.</p>\n\n <p>Also built corporate intranet website using ASP.NET/C# to cater to client's hosting environment. Ported content from old intranet to this new\n site.</p>\n\n <RumorBlurb/>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from './DefaultLayout';\n\nexport default function NotFound(props) {\n return <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} hideFooterInvite />\n}\n\nconst getHeader = () => {\n return (\n <div className=\"header-intro theme-bg-primary text-white py-5\">\n <div className=\"container\">\n <h2 className=\"page-heading mb-0\">Not Found</h2>\n </div>\n </div>\n );\n}\n\nconst getContent = () => {\n return (\n <section className=\"section py-5\">\n <div className=\"container\">\n <h1 className=\"text-center\" style={{fontSize:'10rem'}}>404</h1>\n </div>\n </section>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport imgCanker from '../../assets/images/projects/canker.jpg';\nimport CenteredImage from '../CenteredImage';\nimport RumorBlurb from './RumorBlurb';\n\nexport default function CankerComplete(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Canker Complete\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={imgCanker} alt=\"Canker Complete\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>Goal: build a static informational site, customize a shopping cart and seamlessly integrate the two. </p>\n <p>Transformed Photoshop documents into a matching custom site and a <a href=\"https://magento.com/\">Magento</a> template.</p>\n <RumorBlurb />\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/dznuts.jpg';\nimport CenteredImage from '../CenteredImage';\nimport RumorBlurb from './RumorBlurb';\n\nexport default function DZNuts(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: DZ Nuts\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Canker Complete\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>Goal: customized e-commerce website.</p>\n <p>Customized and deployed a <a href=\"https://www.zen-cart.com/\">ZenCart</a> implementation to meet the customer's needs. </p>\n <RumorBlurb />\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/brahma.jpg';\nimport CenteredImage from '../CenteredImage';\nimport RumorBlurb from './RumorBlurb';\n\nexport default function Brahma(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Brahma Group, Inc\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Brahma Group, Inc\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>Goal: create application form that dynamically converts result into a PDF document.</p>\n <p>This 3 step employment application captures the user's information, dynamically generates a PDF document and emails a notification to the administrator.</p>\n <RumorBlurb />\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/krosswood.jpg';\nimport CenteredImage from '../CenteredImage';\n\nexport default function KrosswoodDoors(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Krosswood Doors\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Brahma Group, Inc\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>Goal:salvage code written by offshore freelance developer and finish developing custom CRM.</p>\n <p>This site includes many features, including:</p>\n <ul>\n <li className=\"mb-3\">Custom role based user authentication</li>\n <li className=\"mb-3\">Distributor management</li>\n <li className=\"mb-3\">Sales Rep management</li>\n <li className=\"mb-3\">Dealer management</li>\n <li className=\"mb-3\">Report generator</li>\n <li className=\"mb-3\">Asset management</li>\n <li className=\"mb-3\">Press releases</li>\n <li className=\"mb-3\">Sales Tracking</li>\n <li className=\"mb-3\">Geocoding tool integrated into dealer management</li>\n </ul>\n <p>This project was completed while working full-time at Rumor Advertising.</p>\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/foodinsurance.jpg';\nimport CenteredImage from '../CenteredImage';\nimport RumorBlurb from './RumorBlurb';\n\nexport default function Foodinsurance(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Foodinsurance.com\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Brahma Group, Inc\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>Goal: build a custom informational website and implement an ecommerce solution.</p>\n <p>Built a custom site with a lead generation form and integrated a customized <a href=\"https://magento.com/\">Magento</a> e-commerce shopping cart solution.</p>\n <RumorBlurb />\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/evolutioncard.jpg';\nimport CenteredImage from '../CenteredImage';\n\nexport default function Evolutioncard(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project (full-time position): Evolutioncard\"/>;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Brahma Group, Inc\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>While working full-time at Evolutioncard I built a number of small PHP web applications to assist the call center. I also helped with maintaining\n the customer facing PHP website.</p>\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/lochner.jpg';\nimport imgPeoria from '../../assets/images/projects/peoria_eastern_bypass.jpg';\nimport CenteredImage from '../CenteredImage';\n\nexport default function Lochner(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project (full-time position): Lochner\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Lochner\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>While working full-time at Lochner I helped with a re-write of the company intranet and created an informational site for a client project.</p>\n <CenteredImage src={imgPeoria} alt=\"Peoria Eastern Bypass\" />\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/fatbob.jpg';\nimport CenteredImage from '../CenteredImage';\n\nexport default function FatBobsGarage(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Fat Bob's Garage\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Fat Bob's Garage\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>Goal: create a front-end website for a shopping cart hosted at Nexternal.</p>\n <p>Built front-end homepage and search utility and integrated it into a third party shopping cart application on a separate website.</p>\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/silversocket.jpg';\nimport silversocketAnimation from '../../assets/images/projects/silversocket-animation.gif'\nimport CenteredImage from '../CenteredImage';\n\nexport default function SilverSocket(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: SilverSocket\"/>;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"SilverSocket\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>SilverSocket is an LLC I started in order to facilitate freelance work. I created the SilverSocket website to provide potential clients a way to\n contact me and also to try out an animation library called <a href=\"https://greensock.com/\">greensock</a> for fun!</p>\n <p>This site is no longer live, but here's an example of one of the animations:</p>\n <img src={silversocketAnimation} alt=\"SilverSocket project picker animation\" />\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\n\nexport default function(props) {\n return (\n <p className=\"list-intro\">\n {props.children}\n </p>\n );\n}","import React from 'react';\n\nexport default function(props) {\n return (\n <ul className=\"mb-5 ml-md-4\">\n {props.children}\n </ul>\n );\n}","import React from 'react';\n\nexport default function(props) {\n return (\n <li className=\"mb-3\">\n {props.children}\n </li>\n );\n}","import React from 'react';\n\nexport default function(props) {\n return (\n <h3 className=\"section-title\">\n {props.children}\n </h3>\n );\n}","import React from 'react';\n\nexport default function (props) {\n return (\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n {props.children}\n </div>\n </section>\n );\n}","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/TestUserAutoLoginDemo.gif';\nimport CenteredImage from '../CenteredImage';\nimport StyledParagraphListLabel from '../StyledParagraphListLabel';\nimport StyledUl from '../StyledUl';\nimport StyledLi from '../StyledLi';\nimport StyledSectionTitle from '../StyledSectionTitle';\nimport StyledProjectSection from '../StyledProjectSection';\n\nexport default function DevAutoLogin(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Chrome Auto Login Extension\"/>;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <StyledProjectSection>\n <CenteredImage src={img} alt=\"Chrome Auto Login Extension\"/>\n <StyledSectionTitle>Project Background</StyledSectionTitle>\n <StyledParagraphListLabel>Goals:</StyledParagraphListLabel>\n <StyledUl>\n <StyledLi>Learn how to create chrome extensions</StyledLi>\n <StyledLi>Create a tool that keeps track of test users for local development that can automatically log a user in with one click</StyledLi>\n </StyledUl>\n <p>I wanted a tool to help me keep track of test users and allow me to login with one click. I also wanted to learn how to create chrome extensions, so\n this was a good opportunity to get started on that. This tool is still a work in progress, but you can check it out on the <a\n href=\"https://chrome.google.com/webstore/detail/test-user-auto-login/blpplahglbcgdphfkhnlmfhglpgnjlhl\">chrome extension store</a> or the code is\n over on github: <a href=\"https://github.com/mikey-t/chrome-devautologin\">https://github.com/mikey-t/chrome-devautologin</a></p>\n </StyledProjectSection>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/mediamanager.jpg';\nimport imgContextMenu from '../../assets/images/projects/mediamanager_contextmenu.jpg';\nimport imgUpload from '../../assets/images/projects/mediamanager_upload.jpg';\nimport imgGallery from '../../assets/images/projects/mediamanager_gallery.jpg';\nimport CenteredImage from '../CenteredImage';\n\nexport default function MediaManager(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Media Manager\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Media Manager\" />\n <h3 className=\"section-title\">Project Background</h3>\n <p>Media Manager was an experiment to create a chrome extension that will allow right-clicking on any image/gif/mp4 and allow uploading it to a Pinterest-like site. For example, let's say you came across a funny gif you want to share at work. Instead of managing big lists of bookmarks or saving it locally and shuffling files, you can simply right click any image/gif/mp4 and upload it for easy retrieval.</p>\n <p>Obviously there are other existing products that already have this functionality like Imgur and Pinterest, but this was still a great opportunity to learn about chrome's context menu support for extensions. Below are some screenshots showing the result.</p>\n <p>Context menu:</p>\n <CenteredImage src={imgContextMenu} alt=\"Media Manager Context Menu\" />\n <p>Upload dialog:</p>\n <CenteredImage src={imgUpload} alt=\"Media Manager Upload dialog\" />\n <p>Media Gallery:</p>\n <CenteredImage src={imgGallery} alt=\"Media Manager Media Gallery\" />\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport '../../assets/css/carousel-fix.css';\n\nimport img from '../../assets/images/projects/slack-dark.png';\nimport CenteredImage from '../CenteredImage';\n\nexport default function SlackDarkTheme(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Slack Dark Theme\"/>;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Slack Dark Theme\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p><strong>UPDATE:</strong> the Slack team finally released a built-in dark theme, so this project isn't necessary anymore.</p>\n <p>Project code and instructions can be found on GitHub: <a href=\"https://github.com/mikey-t/slack-dark-theme\">slack-dark-theme</a>.</p>\n <p>The Slack team has been dragging their feet on creating a dark theme for the desktop version of their app so many people in the community found\n ways to override the exisitng theme with their own dark theme via css injected into one of the app's js files. However, whenever Slack pushed\n updates it would overwrite these custom styles, and with version 4 of their app the \"easy way\" of modding the theme became more complicated.</p>\n <p>To make it easier to reapply the dark theme after Slack updates, I wrote a script that can unpack the app, modify the appropriate file and re-pack\n it without having to take any manual steps. Currently the script works for MacOS and Linux (non-snap version of Slack).</p>\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\n\nexport default function () {\n return (\n <>\n <h3 className=\"section-title\">StayWell and WebMD Health Services Background</h3>\n <p>I worked full-time at StayWell (acquired by WebMD Health Services in 2020) between 2010 and 2025. When I started, the company was called StayWell Interactive. The company restructured and underwent\n ownership changes several times. During the first major restructuring the company changed its name to Krames StayWell. When our employer-based\n population health management software product moved from StayWell Interactive to MediMedia's sister company StayWell Health Management, I moved with it.\n The companies later merged together as Krames Staywell. Merck then purchased a majority stake in the company and it was renamed <a\n href=\"https://www.staywell.com/\">StayWell.</a></p>\n <p>StayWell acquired the company Provata Health in 2018 and transitioned all customers to a new Java/React platform. In July 2020 WebMD Health Services acquired StayWell and has migrated all customers to their \"WebMD One\" platform.</p>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport CenteredImage from '../CenteredImage';\nimport GoBackToProjects from './GoBackToProjects';\nimport { Link } from 'react-router-dom';\n\nimport img from '../../assets/images/projects/swol.jpg';\nimport imgHealthTrackerDiagram from '../../assets/images/projects/healthtracker-aux-diagram.png';\nimport imgSnapshotDiagram from '../../assets/images/projects/snapshot-diagram.png';\nimport imgEngagementDiagram from '../../assets/images/projects/engagement-diagram.png';\nimport StayWellBackground from './StayWellBackground';\nimport StyledSectionTitle from '../StyledSectionTitle';\nimport StyledParagraphListLabel from '../StyledParagraphListLabel';\nimport StyledProjectSection from '../StyledProjectSection';\nimport StyledUl from '../StyledUl';\nimport StyledLi from '../StyledLi';\n\nexport default function StayWellOnline(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} />\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: StayWell Online\" />;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects />\n <StyledProjectSection>\n <CenteredImage src={img} alt=\"StayWell\" />\n\n <StayWellBackground />\n\n <StyledSectionTitle>StayWell Online</StyledSectionTitle>\n <p>My primary responsibilities have included maintaining and extending our primary external facing web application StayWell Online (later called StayWell Portal), implementing client customizations, and building/maintaining miscellaneous internal applications.</p>\n\n <StyledParagraphListLabel>Some things I took part in while working on StayWell Online:</StyledParagraphListLabel>\n <StyledUl>\n <StyledLi>Participated on the development team responsible for rewriting the StayWell Online front end and releasing the next major version</StyledLi>\n <StyledLi>Worked with existing code and a third party SAML library to implement inbound and outbound SSO implementations.</StyledLi>\n <StyledLi>Wrote C# SAML wrapper utility, enabling our team to implement new outbound SSO implementations with only a few lines of code.</StyledLi>\n <StyledLi>Created an internal tool used to generate excel documents containing all default localized site text and other related information to improve the client implementation process.</StyledLi>\n <StyledLi>Participated in a large project to migrate StayWell Online between MediMedia companies (Krames Staywell to StayWell Health Management). This included migrating code from StarTeam source control to TFS, as well as contributing to the creation of new automated build processes.</StyledLi>\n <StyledLi>Created an internal tool used to automate .NET GAC installations used by StayWell Online.</StyledLi>\n <StyledLi>Created an internal tool to automate setting up all client websites on a developer machine. The tool automates building the site via msbuild, creates the site node in IIS, creates a virtual directory to a remote document share, applies credentials, adds the new IIS site nodes to an application pool and adds an appropriate hosts entry - all with detailed log output. After all the sites are setup it also employs Selenium Web Driver to automate testing that all client sites load up without errors.</StyledLi>\n <StyledLi>Participated on a team responsible for implementing an integration with <a href=\"http://www.fitbit.com\">Fitbit</a>. My role on this team was to create a responsive ajax driven UI that consumes our newly created web service (which communicates with Fitbit via their Rest API and also with our own database). I also contributed to the creation of the web services that communicate with Fitbit, as well as our internal database structure.</StyledLi>\n <StyledLi>Assisted with migration effort when Krames StayWell merged back with Staywell Health Management. Helped train new team members on internal and external facing applications and processes involved in maintenance as well as new development.</StyledLi>\n <StyledLi>Participated on team responsible for merging our existing product into Sitecore (.NET enterprise CMS solution).</StyledLi>\n <StyledLi>Built SAML test utility to allow simpler testing and implementation and troubleshooting of all things SSO. Includes features to generate public certificates, base64 encode/decode payloads, encrypt/decrypt payloads, validate signatures and log test users in.</StyledLi>\n <StyledLi>Participated in architecture and construction of new features and subsystems involving technologies new to the team (iFrame plugins, MongoDB, KnockoutJS, RequireJS, RestSharp, HttpClient and others)</StyledLi>\n <StyledLi>Assisted in solving multiple difficult third party compiled code bugs by analyzing decompiled assemblies.</StyledLi>\n <StyledLi>From 2016 to 2018 I was Team Lead for a team comprised of both US based and offshore developers and QA team members.</StyledLi>\n </StyledUl>\n\n <StyledSectionTitle>Feature Design and Architecture</StyledSectionTitle>\n <p>While working on StayWell Portal I had the opportunity to design a number of features and either build them myself or work on them with my team while also directing the work as a team lead. Below are some of the highlights.</p>\n\n <StyledSectionTitle>HealthTracker</StyledSectionTitle>\n <p>The goal with this project was to integrate with a fitness and health data aggregation company called <a href=\"https://validic.com/\">Validic</a>. By integrating with Validic we were able to provide our users the opportunity to track a variety of health related data like steps and weight and integrate this data into several other features within our application like badges, incentives, self directed coaching programs and others.</p>\n <p>Our integration consisted of a UI to allow the users to authorize data transfer and connect physical devices to the data collection service and an API to do the actual data transfer from Validic's system to StayWell's system on a real time basis.</p>\n <StyledParagraphListLabel>Five main challenges of this project:</StyledParagraphListLabel>\n <StyledUl>\n <StyledLi>Receive multiple API transactions per user per day for tens of thousands of users in a performant way</StyledLi>\n <StyledLi>Make the data collection process automatically correct for any Validc API outages or network issues</StyledLi>\n <StyledLi>Structure the saved data and internal APIs for easy use by multiple internal features/applications</StyledLi>\n <StyledLi>Provide administrative tools for monitoring API performance, pulling user and client data, etc</StyledLi>\n <StyledLi>Create thorough documentation for developers to be able to implement use of this data for their features and to perform maintenance on the Validic integration itself</StyledLi>\n </StyledUl>\n <p>The most interesting part of this project for me was the performance tuning. During data pulls there are 7 types of data, each with 2 variants, for a total of 14 different API endpoints, each endpoint requiring paging of requests. Rather than doing all the work synchronously I implemented the data pull logic using multi-threading. That by itself is not terribly interesting, but I also throttled calls using a <a href=\"https://docs.microsoft.com/en-us/dotnet/standard/threading/semaphore-and-semaphoreslim\">semaphore</a> to ensure that the optimal amount of work was always being done without bottoming out the server's resources and without lulls that could have been caused by queing up chunks of work and running each chunk till done.</p>\n <StyledParagraphListLabel>Allowing near real-time use of new data as it comes in with other features in our application uses a queue and a windows service to offload the work. Here is one of the diagrams from our documentation that illustrates this process: </StyledParagraphListLabel>\n <CenteredImage src={imgHealthTrackerDiagram} alt=\"HealthTracker Auxiliary Tasks\" />\n\n\n <StyledSectionTitle>Snapshot</StyledSectionTitle>\n <p>The goal with the Snapshot project was to create a simple framework for developers to easily wire up nightly report data that can be viewed in our admin tool and also emailed to a specified list of users. Before implementing this feature each team had their own method of creating report data that was often inconsistent and error prone. After the Snapshot feature was completed and teams implemented it with their features, it was easy to get a high level view of the status and possible concerns there might be on a daily basis.</p>\n <StyledParagraphListLabel>Because reflection is used to find all implementations, all a develop has to do to implement this with a feature is to add a value to an enum and implement a base class. This diagram encapsulates how each component of this feature relates:</StyledParagraphListLabel>\n <CenteredImage src={imgSnapshotDiagram} alt=\"Snapshot Diagram\" />\n\n <StyledSectionTitle>Communities</StyledSectionTitle>\n <p>Communities was a feature built to act as a sort of topic-based user discussion forum that also ties into other features within the application. It can be used as a stand-alone page or as part of the Group Coaching feature (see Group Coaching below). The challenge with this project was to implement it in such a way that an administrator had a number of customization options that allowed for things like cross-client forums vs single-client versions and custom content on the dashboard for the community.</p>\n\n <StyledSectionTitle>Group Coaching</StyledSectionTitle>\n <p>Group Coaching is a set-length program that involves weekly activities, group meeting live meeting sessions and topical discussion forums (see Communities above). An administrator has the ability to configure a Group Coaching program including the topic, content for discussion each week, setup of group live meeting times each week, program completion criteria, etc. The feature has also has tools tied into the applications existing coaching platform that allow coaches to track individual participation progress.</p>\n\n <StyledSectionTitle>Onpoint</StyledSectionTitle>\n <p>Onpoint was a feature meant to bundle together several other features for the specific topic of Diabetes. Features bundled include Group Coaching, Communities, Support Coaching as well as device data tracking (see HealthTracker above).</p>\n\n <StyledSectionTitle>Engagement</StyledSectionTitle>\n <p>The Engagement platform is a set of functionality that allows all other features within our application to manage email and sms messages to participants. Technically this was Engagement 2.0. The first version was written by another team early in the application's life before all requirements were known, and eventually the product owners requested additional functionality that required a redesign/rewrite of this feature.</p>\n <StyledParagraphListLabel>Design philosophy:</StyledParagraphListLabel>\n <StyledUl>\n <StyledLi>Logic that is common between all implementations should be centralized.</StyledLi>\n <StyledLi>Implementing email batch sending for a new feature and maintaining an existing implementation should be straight forward. All code for an implementation should be centralized in its scheduler logic implementation.</StyledLi>\n <StyledLi>All functionality except the logic that determines the content and list of participants to send to should be shared and should be implementation agnostic.</StyledLi>\n <StyledLi>The primary unit of work for the system, regardless of the implementation, is a batch. At a minimum, a batch consists of one piece of content and a list of participants to send to.</StyledLi>\n <StyledLi>All aspects of the system should be able to be exercised from test harnesses, including triggering of error conditions, success conditions and sending of actual messages to a provided email address or phone number.</StyledLi>\n <StyledLi>All logic should be wrapped in thorough error handling and should log verbosely any exceptional conditions.</StyledLi>\n </StyledUl>\n <StyledParagraphListLabel>System Diagram:</StyledParagraphListLabel>\n <CenteredImage src={imgEngagementDiagram} alt=\"Engagement Platform Diagram\" />\n \n <StyledSectionTitle>StayWell in {new Date().getFullYear()}</StyledSectionTitle>\n <p>Since StayWell aquired Provata Health in 2018, we have been working on porting features to a new react/node/java application. Eventually the goal is to transition all our existing clients to the new application. See <Link to=\"/projects/my-staywell\">MyStaywell Platform</Link></p>\n </StyledProjectSection>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport CenteredImage from '../CenteredImage';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport img from '../../assets/images/projects/mystaywell.png';\nimport StayWellBackground from './StayWellBackground';\nimport StyledUl from '../StyledUl';\nimport StyledLi from '../StyledLi';\nimport StyledSectionTitle from '../StyledSectionTitle';\n\nexport default function MyStayWell(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: MyStayWell Platform\"/>;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"MyStayWell Platform\"/>\n <StayWellBackground/>\n <StyledSectionTitle>MyStayWell Platform</StyledSectionTitle>\n <p>In 2018 StayWell acquired Provata Health and we worked hard on building out new features on the new platform and on migrating\n existing StayWell Portal clients to the new solution.</p>\n <StyledSectionTitle>Tech Stack Transition</StyledSectionTitle>\n <p>Moving from a .NET monolith-ish application to working on a mac on a microservices application running in AWS with a React front-end was a fun and\n interesting challenge. Some of the tech used on the new platform:</p>\n <StyledUl>\n <StyledLi>Java services using Dropwizard framework</StyledLi>\n <StyledLi>Node Express</StyledLi>\n <StyledLi>React</StyledLi>\n <StyledLi>MySQL</StyledLi>\n <StyledLi>Redis</StyledLi>\n <StyledLi>Git</StyledLi>\n <StyledLi>AWS</StyledLi>\n <StyledLi>Terraform</StyledLi>\n <StyledLi>iOS</StyledLi>\n <StyledLi>Android</StyledLi>\n </StyledUl>\n <StyledSectionTitle>SAML</StyledSectionTitle>\n <p>One of the first projects I worked on after transitioning to the new platform was to implement the same SAML functionality we had on our old\n platform. This included creating functionality for inbound SAML in addition to writing utility code to generate new outbound implementations. We\n wanted to have the same quality of life tools and utilities as our old application so I also implemented a test harness and test endpoints to make\n new client setup as smooth as possible.</p>\n <p>Our previous platform utilized a SAML library called ComponentSpace, but since that library was .NET based, I used the Java library OpenSAML for\n the new platform.</p>\n <StyledSectionTitle>Environment Variables</StyledSectionTitle>\n <p>One challenge we encountered after moving to the new platform was that the existing codebase used several inconsistent methods of setting and\n accessing environment variables across each of the microservices and across each of the different environments. To solve this problem I created some\n shared utility code to manage access of these settings and relocated all settings to a single location using java annotations to apply various\n options to each setting. This gave us the advantage of being able to see all possible settings in one place and also allowed us to easily log all\n non-secret settings on application initialization for easy debugging. I also worked with our devops team to get existing variables setup in\n terraform for specific environment overrides.</p>\n <StyledSectionTitle>Third Party Incentives Fulfillment Integration</StyledSectionTitle>\n <p>The new StayWell platform had different incentives functionality than the old platform and a contract with a different third party provider for\n fulfillment, but did not yet have any integrated functionality. My responsibility with this project was to gather requirements and work with\n internal stakeholders and the third party developers to create the integration between our applications. The company we integrated with is a\n recognition and rewards platform called <a href=\"https://fond.co\" target=\"_blank\" rel=\"noopener noreferrer\">Fond</a>.</p>\n <p>The main challenge of this project was that Fond had not yet done this type of integration before us, and our incentives functionality was still in\n the process of being updated, so we worked together to build out the functionality on both sides at the same time. Despite the challenge the Fond\n devs were great to work with and we were able to get the SAML login up and running and service callback functionality working to communicate data\n between our applications.</p>\n <StyledSectionTitle>Localization Support</StyledSectionTitle>\n <p>The new platform that we inherited did not have built-in support for localization of dynamic data being moderated by our internal admins, so we\n were tasked with building out this functionality. I took this as a personal challenge to create a method of adding localization support for dynamic\n database records with the smallest amount of code required when new data types are added. I accomplished this by using reflection and custom\n annotations. All a developer has to do now is to annotate a model class and add a few one liners to a few service endpoints that handle the CRUD for\n that particular model. Another developer I worked closely with created the admin UI component of this functionality to allow devs to apply the\n localization editing to our content management interface.</p>\n <StyledSectionTitle>Cache Client Library</StyledSectionTitle>\n <p>We needed write-invalided caching in several of our microservices, so I wrote a cache client wrapper library for Redis with an API that simplifies\n the process.</p>\n <StyledSectionTitle>Structured Logging Library</StyledSectionTitle>\n <p>Some developers were writing logging code that sometimes threw exceptions while logging exceptions. I wrote a structured logging library\n with an interface that automatically serializes objects and ensures exceptions are not thrown during exception logging.</p>\n <StyledSectionTitle>Authentication Rewrite</StyledSectionTitle>\n <p>While making some configuration changes to our Newrelic integration, I noticed that we were making an unusually large number of requests related to\n authentication and retrieving the current user. In order to alleviate many of these unnecessary service/database hits, I restructured how JWT tokens\n are generated to make usage of them more efficient, in addition to more secure by encrypting the token contents. This reduced approximately 70% of\n all database hits in 2 of our microservices, in addition to drastically reducing the amount of http requests required for a page load.</p>\n </div>\n </section>\n </>\n );\n}\n","import React from 'react';\nimport DefaultLayout from './DefaultLayout';\nimport { Link } from 'react-router-dom'\n\nexport default function GenericError(props) {\n return <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()} hideFooterInvite />\n}\n\nconst getHeader = () => {\n return (\n <div className=\"header-intro theme-bg-primary text-white py-5\">\n <div className=\"container\">\n <h2 className=\"page-heading mb-0\">Error</h2>\n </div>\n </div>\n );\n}\n\nconst getContent = () => {\n return (\n <section className=\"section py-5\">\n <div className=\"container\">\n <p className=\"text-center\" style={{ fontSize: '1.2rem' }}>An unexpected error occurred, sorry for the inconvenience. Try going back to the <Link to=\"/\">home page</Link></p>\n </div>\n </section>\n );\n}\n","import React from 'react';\nimport DefaultLayout from '../DefaultLayout';\nimport ProjectHeader from './ProjectHeader';\nimport GoBackToProjects from './GoBackToProjects';\n\nimport StayWellBackground from './StayWellBackground';\nimport StyledSectionTitle from '../StyledSectionTitle';\n\nexport default function MyStayWell(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n );\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: WebMD Health Services\"/>;\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <StayWellBackground/>\n <StyledSectionTitle>WebMD Health Services</StyledSectionTitle>\n <p>In 2020 WebMD Health Services acquired StayWell and gradually migrated all customers to their WebMD One platform.</p>\n <p>I spent 2019-2020 on the StayWell architecture team and transitioned to the WHS architecture team in 2021. I was officially promoted to the title\n Architect in July of 2021.</p>\n <StyledSectionTitle>AWS to On-Prem Migration</StyledSectionTitle>\n <p>I assisted in planning and execution of migrating our MyStayWell platform from AWS to WHS's on-prem data centers. This involved working with other\n engineers to create/update documentation, audit AWS service usages within our application and troubleshooting issues after the migration was\n completed.</p>\n <p>One interesting problem we had was that the new on-prem database did not have the same horsepower as the AWS hosted instance, so our application\n suffered severe performance issues. I used NewRelic to identify application changes we could make to bring the system back to normal operational\n performance, then worked with another developer to design the solution implementation. As part of this process I documented before and after\n performance metrics in order to show exactly how much of an improvement we made, as well as to help justify the company's continued use of\n NewRelic.</p>\n <StyledSectionTitle>Application Performance Investigation</StyledSectionTitle>\n <p>We had a microservice mysteriously hitting a performance wall and opening http circuits. I investigated the issue by reproducing locally using k6\n tests to apply enough load to trigger the scenario. I found that our use of sync wrapped async http calls between a proxy and the service in\n question was causing requests to stack up and\n timeout. We implemented a temporary solution of adjusting max connections and min threads before implementing a true async fix. </p>\n <StyledSectionTitle>K6 Performance/Load Testing Utilities</StyledSectionTitle>\n <p>While investigating the performance issue mentioned above, I had the opportunity to learn more about <a href=\"https://k6.io/\">k6</a>. While it's a\n very powerful tool, there is some overhead involved in first-time use and I wanted other developers to be able to easily setup k6 and write tests\n and be able to see\n results in <a href=\"https://grafana.com/\">grafana</a>. I created a docker project that wraps influxdb, grafana and openapigenerator so that\n developers can rapidly generate new k6 tests and push results to a local grafana instance running in a docker container. Then I created an npm\n package to encapsulate shared k6 utility methods and a run command that automatically appends all the necessary k6 CLI params to push results to the\n local running influxdb/grafana instance.</p>\n <StyledSectionTitle>MyStayWell Third-Party API Disconnection</StyledSectionTitle>\n <p>After combining one of MyStayWell's third-party API accounts with WHS's, we needed to disconnect a very large number of MyStayWell users so that they could\n re-connect on the new platform. I wrote a multi-threaded script to rapidly disconnect all the users.</p>\n <StyledSectionTitle>Token Based Authentication</StyledSectionTitle>\n <p>Our primary application's auth mechanisms previously revolved around a .NET session, but this had several problems:</p>\n <ul>\n <li>Inability to consistently protect service endpoints in microservices</li>\n <li>Poor performance caused by continually reaching back from microservices to the monolith application for common user info</li>\n <li>No easy or consistent way to expose API's for customer consumption</li>\n <li>Inability to have granular service endpoint access</li>\n <li>Audit logging lacked the ability to trace specific internal production use cases</li>\n </ul>\n <p>We were able to resurrect an old project to implement token based authentication and get it over the finish line. We now have solutions to all the above\n problems and by doing so have opened up a broad range of possibilities for our infrastructure and platform as a whole. The system security was already good,\n but is now even better with more granular access control and audit logging.</p>\n </div>\n </section>\n </>\n );\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport '../../assets/css/carousel-fix.css'\n\nimport img from '../../assets/images/projects/countdown-solver.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function CountdownSolver(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Countdown Solver\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Countdown Solver\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>I enjoy the british game show <a href=\"https://en.wikipedia.org/wiki/8_Out_of_10_Cats_Does_Countdown\">8 Out of 10 Cats Does Countdown</a> because of\n the comedians they have on the show and because the word and number games are fun too. While watching one day, I wondered how hard it would be to\n write an efficient non-brute-force algorithm to find all possible words in a dictionary given a set of letters.</p>\n <p>My high level solution was to pre-process the dictionary into a collection that maps the ordered letters in each word as the hash to lists of words\n made of of the letters in the hash key. When user\n input comes in, I calculate all ordered permutations of the letters (faster than all unordered permutations) and lookup matching words using the\n hash\n map.</p>\n <p>There is also a solver for the number game, but it is still a work in progress (it will find many of the possible solutions, but not all of\n them).</p>\n <p>Check out the result over on <a\n href=\"https://countdown.mikeyt.net\">https://countdown-solver.mikeyt.net</a>.</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/word-finder.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function WordFinder(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Word Finder\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>I previously created a word finder with my <a href=\"https://countdown.mikeyt.net\">countdown-solver</a> but I was no longer happy with a number of things:</p>\n <ul>\n <li>Outdated versions of .NET and React</li>\n <li>Use of Sqlite (great tool, but not the best choice for what I would like to do with this project)</li>\n <li>Old version of CRA and sub-par implementation of a PWA</li>\n <li>Word solver lacks filters that would make it useful for other games</li>\n <li>Slow build times</li>\n <li>Not integrated into my latest tools and processes</li>\n </ul>\n <p>By re-implementing the solution I had a chance to try out <a href=\"https://vitejs.dev/\">Vite</a> for the front-end tooling, upgraded all the tech,\n and added some helpful filters for use with other games. I also took the opportunity to increase my Typescript and Material UI skills.</p>\n <p>Check it out here: <a href=\"https://words.mikeyt.net\">https://words.mikeyt.net</a>.</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/flashcards.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function Flashcards(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Flashcards\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>There are several reasons this project exists. My wife was learning to code and we were also looking for a flashcards app to help our kids study.\n There are many flashcard apps out there already, but they were just asking too much money for too little functionality, so we made one ourselves!</p>\n <p>This project provided many great benefits:</p>\n <ul>\n <li>Improved Typescript/React skills</li>\n <li>Learned Material UI (<a href=\"https://mui.com/\">MUI</a>)</li>\n <li>Learned more about progressive web apps (PWA)</li>\n <li>Built some homemade devops tools for automated build and deployment</li>\n <li>Utilized my new DB Migrations concept (<a href=\"https://github.com/mikey-t/db-migrations-dotnet\">db-migrations-dotnet</a>)</li>\n <li>Continued adding to and improving my node CLI utils library (<a href=\"https://github.com/mikey-t/node-cli-utils\">node-cli-utils</a>)</li>\n <li>Learned more about using markdown editors</li>\n <li>Learned more about implementing social logins</li>\n <li>Got to share one of my favorite hobbies (coding) with my wife</li>\n <li>Now have a flashcards app to study things!</li>\n </ul>\n <p>Check it out at <a href=\"https://flashcards.cookiebrains.com\">flashcards.cookiebrains.com</a>!</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/project-omega.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function ProjectOmega(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Project Omega\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>When the company I worked at purchased another company (Staywell bought Provata), we shifted our entire platform from a monolith application to a\n microservices architecture. During this process I learned all about the benefits and pitfalls of microservices. I have a lot of opinions on the\n subject\n , including an idea for a monolith microservices hybrid that would, in my opinion, be a significantly better fit for most companies looking to\n utilize\n a microservices architecture.</p>\n <p>You can read all about it as well as watch a couple of demo videos over on the project page: <a\n href=\"https://github.com/mikey-t/project-omega\">project-omega</a></p>\n <p>I have plans in the near future to resurect and recreate this project. I would like to clean up the hooks concept, upgrade the tech stack, more\n cleanly separate\n the UI from the other service projects (similar to what I've done in my <a\n href=\"https://github.com/mikey-t/dotnet-react-sandbox\">dotnet-react-sandbox</a> project)\n and integrate some of the other new concepts and libraries I've been working on over the past year. It would also be nice to rename it to something\n less cheesy. When I originally created the project I thought \"Project Omega\" was funny because a) every developer thinks their new idea is the best\n and last idea and it never is, and b) each new microservice was a Project Omega Service, or a P.O.S.). However, I'd like to name this something that\n matches up with what it actually is, like perhaps \"Modular Monolith\" or \"Microservices Monlith Hybrid\". Suggestions are welcome!</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/dotnet-react-sandbox.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function DotnetReactSandbox(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Dotnet React Sandbox\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>This project is where I try out new stuff, including integrating NPM and NuGet libraries I've created. I'm also using this project to bootstrap other\n new projects via my <a href=\"https://github.com/mikey-t/dotnet-react-generator\">dotnet-react-generator</a> NPM package.</p>\n <p>Check it out here: <a href=\"https://github.com/mikey-t/dotnet-react-sandbox\">dotnet-react-sandbox</a>.</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/dotnet-react-generator.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function DotnetReactGenerator(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Dotnet React Generator\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>This project is an NPM package to bootstrap a new project using <a href=\"https://github.com/mikey-t/dotnet-react-sandbox\">dotnet-react-sandbox</a> as\n a template. There are a number of popular frameworks (like Yeoman) for creating project generators, but I wanted to level up my typescript and\n node CLI skills so I rolled my own. I feel like that was a good choice because it was low effort and my use case includes some semi non-standard\n actions like generating and installing SSL certificates on multiple platforms.\n </p>\n <p>Check it out here: <a href=\"https://github.com/mikey-t/dotnet-react-generator\">dotnet-react-generator</a>.</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/ranked-voting.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function RankedVoting(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Ranked Voting\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>This is a Typescript library to calculate results for ranked choice voting.</p>\n <p>You can read more about it here: <a href=\"https://github.com/mikey-t/ranked-voting-ts\">ranked-voting-ts</a>.</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/node-cli-utils.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function NodeCliUtils(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Node CLI Utils\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>Over the last few years I have begun adopting a pattern of using package.json commands and gulp tasks to automate many aspects of each of my projects. Whenever\n I've found myself using the same task in multiple projects I've added the helper method to this NPM package for re-use. I intend to re-write this in typescript with\n unit tests \"fairly soon\" (™). You can check out an example of this being used in my <a href=\"https://github.com/mikey-t/dotnet-react-sandbox\">dotnet-react-sandbox</a> project (check out the root package.json and gulpfile.js files).</p>\n <p>I've also been adding commands related to my <a href=\"https://github.com/mikey-t/db-migrations-dotnet\">db-migrations-dotnet</a> package. Normally I would admit it's a bad idea to put unrelated things into the same\n package, but in this case my justification is that this package is not bundled or deployed with the project that uses it - it's only for development and doesn't contribute to release package bloat.</p>\n <p>Check it out here: <a href=\"https://github.com/mikey-t/node-cli-utils\">node-cli-utils</a>.</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/environment-settings-dotnet.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function DotnetEnvironmentSettings(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Dotnet Environment Settings\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>I fundamentally disagree with the way environment variables are handled in the .NET world. JSON files per environment doesn't make sense. There is no\n way for a new developer on the project to know what each of the settings is, what all the possible values are, what each value's type is at runtime, where\n it's applicable or how it changes between environments. Environment variables should be something that the environment provides. That is why they're\n called environment variables.</p>\n <p>I'm sure part of the reason .NET uses this pattern is because they've always been meant for applications running on windows. Now that this isn't the case (\n I'm running all my .NET websites on Linux), there needs to be a different and better way to pull in environment variables. Every .NET project I've worked on\n has recognized this and has rolled their own wrapper for accessing environment variables.</p>\n <p>We could just write a simple wrapper that reads in environment variables raw. However, pulling in \"magic values\" at runtime without knowing anything about them, whether there should be a default value, if it's secret vs something\n that just happens to be different per environment, etc etc, is a gigantic problem.</p>\n <p>I wanted to be able to attach meta data to each value to solve all these problems. With this library you can accomplish this by decorating enum values to get the following:</p>\n <ul>\n <li>Default value (if there is one) selectively based on environment</li>\n <li>Differentiate basic environment variables from secrets</li>\n <li>Define whether the value should be logged whenever environment settings are logged</li>\n <li>Throw an error if the application starts up and the environment didn't have the value set in a particular environment</li>\n </ul>\n <p>There are also helper methods to read in values from a .env file and log all values that are safe to log. The structure of the library also facilitates\n easy unit testing via an environment settings interface. You can see this project being used in <a href=\"https://github.com/mikey-t/dotnet-react-sandbox\">dotnet-react-sandbox</a></p>\n <p>Check it out here: <a href=\"https://github.com/mikey-t/environment-settings-dotnet\">environment-settings-dotnet</a>.</p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport DefaultLayout from '../DefaultLayout'\nimport ProjectHeader from './ProjectHeader'\nimport GoBackToProjects from './GoBackToProjects'\n\nimport img from '../../assets/images/projects/db-migrations-dotnet.png'\nimport CenteredImage from '../CenteredImage'\n\nexport default function DotnetDbMigrations(props) {\n return (\n <div>\n <DefaultLayout location={props.location} headerChildren={getHeader()} contentChildren={getContent()}/>\n </div>\n )\n}\n\nconst getHeader = () => {\n return <ProjectHeader title=\"Project: Dotnet DB Migrations\"/>\n}\n\nconst getContent = () => {\n return (\n <>\n <GoBackToProjects/>\n <section className=\"project-wrapper single-col-max-width py-5 px-4 mx-auto\">\n <div className=\"section-row\">\n <CenteredImage src={img} alt=\"Word Finder\"/>\n <h3 className=\"section-title\">Project Background</h3>\n <p>Every major web oriented backend programming language has at least a couple popular DB migrations frameworks. I have yet to use one that I liked. The\n whole point of these libraries is to save time and prevent mistakes. I feel like most of them have very successfully done the opposite.</p>\n <p>The reasons I think many of these libraries and frameworks fall short boil down these bad assumptions (my opinion):</p>\n <ul>\n <li>(BAD) SQL is hard, let's add a layer on top that translates your favorite language into SQL!</li>\n <li>(BAD) As a framework author I can solve every possible scenario every single developer will run into for every single programming language and every database platform!</li>\n </ul>\n <p>As an example, I spent several days troubleshooting a low-level bug in <a href=\"https://www.liquibase.org/\">Liquibase</a>. A fairly common scenario failed with \n no error messages or hints of any kind. I had to debug into their source code to find the issue. You could argue this type of thing doesn't happen that often, \n but one look at their github issues page says otherwise. I get that this is common for large popular projects. My point isn't that github issues equals bad code. My \n point is that some of these frameworks and libraries bite off more than they can chew. Not because they're not smart but because the problem they're trying to \n solve has too many possible combinations. It's really an entire language they've built on top of multiple other languages (multiple version of Java, XML, json, yaml, multiple database platforms).</p>\n <p>My solution to this problem was to use the simplest possible built-in functionality to keep track of plain SQL scripts and simple Up/Down commands. I'm not the\n only one to come up with this solution. There are several small libraries that do something similar (keep track of the migrations but no extra translation layers). This\n repo is my attempt at an example of the minimal solution for the .NET platform.</p>\n <p>You can see it being used in my <a href=\"https://github.com/mikey-t/dotnet-react-sandbox\">dotnet-react-sandbox</a> project. Check out the github repo for the proof of concept here: <a href=\"https://github.com/mikey-t/db-migrations-dotnet\">db-migrations-dotnet</a></p>\n </div>\n </section>\n </>\n )\n}\n","import React from 'react'\nimport { Route, Switch } from 'react-router'\nimport About from './components/About'\nimport Projects from './components/Projects'\nimport Blog from './components/Blog' // eslint-disable-line\nimport Resume from './components/Resume'\nimport Contact from './components/Contact'\nimport RumorMisc from './components/projects/RumorMisc'\nimport InteriorArchitects from './components/projects/InteriorArchitects'\nimport NotFound from './components/NotFound'\nimport CankerComplete from './components/projects/CankerComplete'\nimport DZNuts from './components/projects/DZNuts'\nimport Brahma from './components/projects/Brahma'\nimport KrosswoodDoors from './components/projects/KrosswoodDoors'\nimport Foodinsurance from './components/projects/Foodinsurance'\nimport Evolutioncard from './components/projects/Evolutioncard'\nimport Lochner from './components/projects/Lochner'\nimport FatBobsGarage from './components/projects/FatBobsGarage'\nimport SilverSocket from './components/projects/SilverSocket'\nimport DevAutoLogin from './components/projects/DevAutoLogin'\nimport MediaManager from './components/projects/MediaManager'\nimport SlackDarkTheme from './components/projects/SlackDarkTheme'\nimport StayWellOnline from './components/projects/StayWellOnline'\nimport MyStayWell from './components/projects/MyStayWell'\nimport GenericError from './components/GenericError'\nimport Whs from './components/projects/WHS'\nimport CountdownSolver from './components/projects/CountdownSolver'\nimport WordFinder from './components/projects/WordFinder'\nimport Flashcards from './components/projects/Flashcards'\nimport ProjectOmega from './components/projects/ProjectOmega'\nimport DotnetReactSandbox from './components/projects/DotnetReactSandbox'\nimport DotnetReactGenerator from './components/projects/DotnetReactGenerator'\nimport RankedVoting from './components/projects/RankedVoting'\nimport NodeCliUtils from './components/projects/NodeCliUtils'\nimport DotnetEnvironmentSettings from './components/projects/EnvironmentSettingsDotnet'\nimport DotnetDbMigrations from './components/projects/DbMigrationsDotnet'\n\nexport default function App() {\n return (\n <LayoutWrapper>\n <Switch>\n <Route exact path='/' component={About} />\n <Route exact path='/projects' component={Projects} />\n {/* <Route path='/blog' component={Blog} /> */}\n <Route path='/resume' component={Resume} />\n <Route path='/contact' component={Contact} />\n <Route path='/projects/whs' component={Whs} />\n <Route path='/projects/staywell-online' component={StayWellOnline} />\n <Route path='/projects/my-staywell' component={MyStayWell} />\n <Route path='/projects/rumor-misc' component={RumorMisc} />\n <Route path='/projects/interior-architects' component={InteriorArchitects} />\n <Route path='/projects/canker-complete' component={CankerComplete} />\n <Route path='/projects/dz-nuts' component={DZNuts} />\n <Route path='/projects/brahma' component={Brahma} />\n <Route path='/projects/krosswood-doors' component={KrosswoodDoors} />\n <Route path='/projects/foodinsurance' component={Foodinsurance} />\n <Route path='/projects/evolutioncard' component={Evolutioncard} />\n <Route path='/projects/lochner' component={Lochner} />\n <Route path='/projects/fatbob' component={FatBobsGarage} />\n <Route path='/projects/silversocket' component={SilverSocket} />\n <Route path='/projects/devautologin' component={DevAutoLogin} />\n <Route path='/projects/media-manager' component={MediaManager} />\n <Route path='/projects/slack-dark-theme' component={SlackDarkTheme}/>\n <Route path='/projects/countdown-solver' component={CountdownSolver}/>\n <Route path='/projects/word-finder' component={WordFinder}/>\n <Route path='/projects/flashcards' component={Flashcards}/>\n <Route path='/projects/project-omega' component={ProjectOmega}/>\n <Route path='/projects/dotnet-react-sandbox' component={DotnetReactSandbox}/>\n <Route path='/projects/dotnet-react-generator' component={DotnetReactGenerator}/>\n <Route path='/projects/ranked-voting' component={RankedVoting}/>\n <Route path='/projects/node-cli-utils' component={NodeCliUtils}/>\n <Route path='/projects/environment-settings-dotnet' component={DotnetEnvironmentSettings}/>\n <Route path='/projects/db-migrations-dotnet' component={DotnetDbMigrations}/>\n <Route path='/sorry' component={GenericError} />\n <Route component={NotFound} />\n </Switch>\n </LayoutWrapper>\n )\n}\n\nfunction LayoutWrapper(props) {\n return (\n <div>\n {props.children}\n </div>\n )\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","//** jQuery Scroll to Top Control script- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com.\n//** Available/ usage terms at http://www.dynamicdrive.com (March 30th, 09')\n//** v1.1 (April 7th, 09'):\n//** 1) Adds ability to scroll to an absolute position (from top of page) or specific element on the page instead.\n//** 2) Fixes scroll animation not working in Opera. \nimport $ from 'jquery';\n\nlet jQuery = $;\n\nvar scrolltotop={\n\t//startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control\n\t//scrollto: Keyword (Integer, or \"Scroll_to_Element_ID\"). How far to scroll document up when control is clicked on (0=top).\n\tsetting: {startline:100, scrollto: 0, scrollduration:1000, fadeduration:[500, 100]},\n\t//controlHTML: '<i class=\"fa fa-angle-up\"></i>', //HTML for control, which is auto wrapped in DIV w/ ID=\"topcontrol\"\n\tcontrolHTML: '<i class=\"fas fa-angle-up\"></i>', //Updated to work with FontAwesome 5\n\t\n\t\n\tcontrolattrs: {offsetx:5, offsety:5}, //offset of control relative to right/ bottom of window corner\n\tanchorkeyword: '#top', //Enter href value of HTML anchors on the page that should also act as \"Scroll Up\" links\n\n\tstate: {isvisible:false, shouldvisible:false},\n\n\tscrollup:function(){\n\t\tif (!this.cssfixedsupport) //if control is positioned using JavaScript\n\t\t\tthis.$control.css({opacity:0}) //hide control immediately after clicking it\n\t\tvar dest=isNaN(this.setting.scrollto)? this.setting.scrollto : parseInt(this.setting.scrollto)\n\t\tif (typeof dest==\"string\" && jQuery('#'+dest).length===1) //check element set by string exists\n\t\t\tdest=jQuery('#'+dest).offset().top\n\t\telse\n\t\t\tdest=0\n\t\tthis.$body.animate({scrollTop: dest}, this.setting.scrollduration);\n\t},\n\n\tkeepfixed:function(){\n\t\tvar $window=jQuery(window)\n\t\tvar controlx=$window.scrollLeft() + $window.width() - this.$control.width() - this.controlattrs.offsetx\n\t\tvar controly=$window.scrollTop() + $window.height() - this.$control.height() - this.controlattrs.offsety\n\t\tthis.$control.css({left:controlx+'px', top:controly+'px'})\n\t},\n\n\ttogglecontrol:function(){\n\t\tvar scrolltop=jQuery(window).scrollTop()\n\t\tif (!this.cssfixedsupport)\n\t\t\tthis.keepfixed()\n\t\tthis.state.shouldvisible=(scrolltop>=this.setting.startline)? true : false\n\t\tif (this.state.shouldvisible && !this.state.isvisible){\n\t\t\tthis.$control.stop().animate({opacity:1}, this.setting.fadeduration[0])\n\t\t\tthis.state.isvisible=true\n\t\t}\n\t\telse if (this.state.shouldvisible===false && this.state.isvisible){\n\t\t\tthis.$control.stop().animate({opacity:0}, this.setting.fadeduration[1])\n\t\t\tthis.state.isvisible=false\n\t\t}\n\t},\n\t\n\tinit:function(){\n\t\tjQuery(document).ready(function($){\n\t\t\tvar mainobj=scrolltotop\n\t\t\tvar iebrws=document.all\n\t\t\tmainobj.cssfixedsupport=!iebrws || (iebrws && document.compatMode===\"CSS1Compat\" && window.XMLHttpRequest) //not IE or IE7+ browsers in standards mode\n\t\t\tmainobj.$body=(window.opera)? (document.compatMode===\"CSS1Compat\"? $('html') : $('body')) : $('html,body')\n\t\t\tmainobj.$control=$('<div id=\"topcontrol\">'+mainobj.controlHTML+'</div>')\n\t\t\t\t.css({position:mainobj.cssfixedsupport? 'fixed' : 'absolute', bottom:mainobj.controlattrs.offsety, right:mainobj.controlattrs.offsetx, opacity:0, cursor:'pointer'})\n\t\t\t\t.attr({title:'Scroll Back to Top'})\n\t\t\t\t.click(function(){mainobj.scrollup(); return false})\n\t\t\t\t.appendTo('body')\n\t\t\tif (document.all && !window.XMLHttpRequest && mainobj.$control.text()!=='') //loose check for IE6 and below, plus whether control contains any text\n\t\t\t\tmainobj.$control.css({width:mainobj.$control.width()}) //IE6- seems to require an explicit width on a DIV containing text\n\t\t\tmainobj.togglecontrol()\n\t\t\t$('a[href=\"' + mainobj.anchorkeyword +'\"]').click(function(){\n\t\t\t\tmainobj.scrollup()\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t$(window).bind('scroll resize', function(e){\n\t\t\t\tmainobj.togglecontrol()\n\t\t\t})\n\t\t})\n\t}\n}\n\nscrolltotop.init()","import { useEffect } from 'react';\nimport { withRouter } from 'react-router-dom';\n\nconst ScrollToTop = ({ children, location: { pathname } }) => {\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n \n return children || null;\n };\n \n export default withRouter(ScrollToTop);\n ","import 'bootstrap';\nimport './assets/css/theme-10.css';\nimport './assets/css/theme-overrides.css';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport $ from 'jquery'; // eslint-disable-line\nimport './assets/plugins/back-to-top';\nimport ScrollToTop from './components/ScrollToTop';\n\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\nconst rootElement = document.getElementById('root');\n\nReactDOM.render(\n <BrowserRouter basename={baseUrl}>\n <ScrollToTop>\n <App />\n </ScrollToTop>\n </BrowserRouter>,\n rootElement);\n\nserviceWorker.unregister();\n"],"sourceRoot":""}