An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
You just hit a route that doesn't exist... the sadness.
+
+
\ No newline at end of file
diff --git a/404/index.html b/404/index.html
new file mode 100644
index 000000000..a7c144841
--- /dev/null
+++ b/404/index.html
@@ -0,0 +1,58 @@
+404: Not found | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
You just hit a route that doesn't exist... the sadness.
+
+
\ No newline at end of file
diff --git a/CNAME b/CNAME
new file mode 100644
index 000000000..30fd49f33
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+docs.crossfeed.cyber.dhs.gov
\ No newline at end of file
diff --git a/_gatsby/slices/_gatsby-scripts-1.html b/_gatsby/slices/_gatsby-scripts-1.html
new file mode 100644
index 000000000..0af21d2dc
--- /dev/null
+++ b/_gatsby/slices/_gatsby-scripts-1.html
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/api-reference/index.html b/api-reference/index.html
new file mode 100644
index 000000000..5cd7f4828
--- /dev/null
+++ b/api-reference/index.html
@@ -0,0 +1,70 @@
+Crossfeed API | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
The Crossfeed API can be used to programmatically access and modify Crossfeed's data.
+
Creating an API key
+
To create an API key, go to My Account -> My Settings and click "Generate API Key". When calling the REST API, the API key must be passed as the value of the Authorization header.
+
Sample code
+
Here is some sample code that calls the Crossfeed API from Python:
+
+
\ No newline at end of file
diff --git a/app-07a9ada2ed997169d9f7.js b/app-07a9ada2ed997169d9f7.js
new file mode 100644
index 000000000..56b5f9384
--- /dev/null
+++ b/app-07a9ada2ed997169d9f7.js
@@ -0,0 +1,87 @@
+/*! For license information please see app-07a9ada2ed997169d9f7.js.LICENSE.txt */
+(self.webpackChunkcrossfeed_docs=self.webpackChunkcrossfeed_docs||[]).push([[143],{64506:function(e,t){"use strict";t.H=void 0;const n=[".html",".json",".js",".map",".txt",".xml",".pdf"];t.H=(e,t="always")=>{if("/"===e)return e;const r=e.endsWith("/");return((e,t)=>{for(const n of e)if(t.endsWith(n))return!0;return!1})(n,e)?e:"always"===t?r?e:`${e}/`:"never"===t&&r?e.slice(0,-1):e}},19679:function(e,t,n){"use strict";t.p2=t.$C=void 0;var r=n(61432);t.$C=r.ScrollHandler;var o=n(54855);t.p2=o.useScrollRestoration},61432:function(e,t,n){"use strict";var r=n(64836);t.__esModule=!0,t.ScrollHandler=t.ScrollContext=void 0;var o=r(n(66115)),a=r(n(7867)),i=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=l(t);if(n&&n.has(e))return n.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,n&&n.set(e,r);return r}(n(67294)),s=r(n(45697)),c=n(21142);function l(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(l=function(e){return e?n:t})(e)}var u=i.createContext(new c.SessionStorage);t.ScrollContext=u,u.displayName="GatsbyScrollContext";var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a{}},97730:function(e,t){"use strict";t.__esModule=!0,t.getForwards=function(e){return null==e?void 0:e.flatMap((e=>(null==e?void 0:e.forward)||[]))}},72731:function(e,t,n){"use strict";t.__esModule=!0,t.injectPartytownSnippet=function(e){if(!e.length)return;const t=document.querySelector("script[data-partytown]"),n=document.querySelector('iframe[src*="~partytown/partytown-sandbox-sw"]');t&&t.remove();n&&n.remove();const a=(0,o.getForwards)(e),i=document.createElement("script");i.dataset.partytown="",i.innerHTML=(0,r.partytownSnippet)({forward:a}),document.head.appendChild(i)};var r=n(72911),o=n(97730)},85418:function(e,t,n){t.components={"component---src-pages-404-js":()=>Promise.all([n.e(593),n.e(883)]).then(n.bind(n,30429)),"component---src-pages-index-js":()=>Promise.all([n.e(523),n.e(593),n.e(678)]).then(n.bind(n,82499)),"component---src-pages-search-js":()=>n.e(996).then(n.bind(n,95875)),"component---src-templates-documentation-page-js":()=>Promise.all([n.e(954),n.e(593),n.e(618)]).then(n.bind(n,47274))}},34741:function(e,t,n){e.exports=[{plugin:n(89650),options:{plugins:[],offsetY:0,className:"anchor"}},{plugin:n(72154),options:{plugins:[],maxWidth:590,linkImagesToOriginal:!0,showCaptions:!1,markdownCaptions:!1,backgroundColor:"white",quality:50,withWebp:!1,withAvif:!1,loading:"lazy",decoding:"async",disableBgImageOnAlpha:!1,disableBgImage:!1}},{plugin:n(29608),options:{plugins:[],name:"Crossfeed Documentation",short_name:"Crossfeed",start_url:"/",background_color:"#663399",theme_color:"#663399",display:"minimal-ui",icon:"src/images/logo.png",legacy:!0,theme_color_in_head:!0,cache_busting_mode:"query",crossOrigin:"anonymous",include_favicon:!0,cacheDigest:"e2e464af5b58dc2546d885f2fb58d702"}},{plugin:n(47420),options:{plugins:[]}},{plugin:n(4094),options:{plugins:[]}}]},3092:function(e,t,n){const r=n(34741),{getResourceURLsForPathname:o,loadPage:a,loadPageSync:i}=n(1975).jN;t.h=function(e,t,n,s){void 0===t&&(t={});let c=r.map((n=>{if(!n.plugin[e])return;t.getResourceURLsForPathname=o,t.loadPage=a,t.loadPageSync=i;const r=n.plugin[e](t,n.options);return r&&s&&(t=s({args:t,result:r,plugin:n})),r}));return c=c.filter((e=>void 0!==e)),c.length>0?c:n?[n]:[]},t.I=(e,t,n)=>r.reduce(((n,r)=>r.plugin[e]?n.then((()=>r.plugin[e](t,r.options))):n),Promise.resolve())},84004:function(e,t){t.M=()=>""},68299:function(e,t,n){"use strict";n.d(t,{Z:function(){return r}});var r=function(e){return e=e||Object.create(null),{on:function(t,n){(e[t]||(e[t]=[])).push(n)},off:function(t,n){e[t]&&e[t].splice(e[t].indexOf(n)>>>0,1)},emit:function(t,n){(e[t]||[]).slice().map((function(e){e(n)})),(e["*"]||[]).slice().map((function(e){e(t,n)}))}}}()},17802:function(e,t,n){"use strict";n.d(t,{UD:function(){return p},Cj:function(){return h},GA:function(){return f},DS:function(){return d}});var r=n(87896),o=n(41505),a=e=>{if(void 0===e)return e;let[t,n=""]=e.split("?");return n&&(n="?"+n),"/"===t?"/"+n:"/"===t.charAt(t.length-1)?t.slice(0,-1)+n:t+n},i=n(96073);const s=new Map;let c=[];const l=e=>{let t=e;if(-1!==e.indexOf("?")){const[n,r]=e.split("?");t=n+"?"+encodeURIComponent(r)}const n=decodeURIComponent(t);return(0,o.Z)(n,decodeURIComponent("")).split("#")[0]};function u(e){return e.startsWith("/")||e.startsWith("https://")||e.startsWith("http://")?e:new URL(e,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname}const d=e=>{c=e},p=e=>{const t=m(e),n=c.map((e=>{let{path:t,matchPath:n}=e;return{path:n,originalPath:t}})),o=(0,r.pick)(n,t);return o?a(o.route.originalPath):null},f=e=>{const t=m(e),n=c.map((e=>{let{path:t,matchPath:n}=e;return{path:n,originalPath:t}})),o=(0,r.pick)(n,t);return o?o.params:{}},h=e=>{const t=l(u(e));if(s.has(t))return s.get(t);const n=(0,i.J)(e);if(n)return h(n.toPath);let r=p(t);return r||(r=m(e)),s.set(t,r),r},m=e=>{let t=l(u(e));return"/index.html"===t&&(t="/"),t=a(t),t}},11883:function(e,t,n){"use strict";n.r(t),n.d(t,{Link:function(){return s.rU},PageRenderer:function(){return a()},Script:function(){return x.Script},ScriptStrategy:function(){return x.ScriptStrategy},Slice:function(){return w},StaticQuery:function(){return c.i1},StaticQueryContext:function(){return c.B9},collectedScriptsByPage:function(){return x.collectedScriptsByPage},graphql:function(){return S},navigate:function(){return s.c4},parsePath:function(){return s.cP},prefetchPathname:function(){return A},scriptCache:function(){return x.scriptCache},scriptCallbackCache:function(){return x.scriptCallbackCache},useScrollRestoration:function(){return i.p2},useStaticQuery:function(){return c.K2},withAssetPrefix:function(){return s.mc},withPrefix:function(){return s.dq}});var r=n(1975),o=n(82743),a=n.n(o),i=n(19679),s=n(71562),c=n(51757);var l=n(94578);function u(e){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},u(e)}var d=n(89611);function p(e,t,n){return p=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&(0,d.Z)(o,n.prototype),o},p.apply(null,arguments)}function f(e){var t="function"==typeof Map?new Map:void 0;return f=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return p(e,arguments,u(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),(0,d.Z)(r,e)},f(e)}var h=n(67294),m=n(84004),g=n(38995);const b=e=>{let{sliceId:t,children:n}=e;const r=[h.createElement("slice-start",{id:t+"-1"}),h.createElement("slice-end",{id:t+"-1"})];return n&&(r.push(n),r.push(h.createElement("slice-start",{id:t+"-2"}),h.createElement("slice-end",{id:t+"-2"}))),r},v=e=>{let{sliceName:t,allowEmpty:n,children:r,...o}=e;const a=(0,h.useContext)(g.u0),i=(0,h.useContext)(g.Db),s=a[t];if(!s){if(n)return null;throw new Error('Slice "'+s+'" for "'+t+'" slot not found')}const c=((e,t)=>Object.keys(t).length?e+"-"+(0,m.M)(t):e)(s,o);let l=i[c];return l?r&&(l.hasChildren=!0):i[c]=l={props:o,sliceName:s,hasChildren:!!r},h.createElement(b,{sliceId:c},r)},y=e=>{let{sliceName:t,allowEmpty:n,children:r,...o}=e;const a=(0,h.useContext)(g.u0),i=(0,h.useContext)(g.m3),s=a[t],c=i.get(s);if(!c){if(n)return null;throw new Error('Slice "'+s+'" for "'+t+'" slot not found')}return h.createElement(c.component,Object.assign({sliceContext:c.sliceContext,data:c.data},o),r)};function w(e){{const t={...e,sliceName:e.alias};delete t.alias,delete t.__renderedByLocation;const n=(0,h.useContext)(g.Bs),r=_(e);if(Object.keys(r).length)throw new E("browser"===n.renderEnvironment,t.sliceName,r,e.__renderedByLocation);if("server"===n.renderEnvironment)return h.createElement(v,t);if("browser"===n.renderEnvironment)return h.createElement(y,t);if("engines"===n.renderEnvironment||"dev-ssr"===n.renderEnvironment)return h.createElement(y,t);if("slices"===n.renderEnvironment){let t="";try{t='\n\nSlice component "'+n.sliceRoot.name+'" ('+n.sliceRoot.componentPath+') tried to render '}catch{}throw new Error("Nested slices are not supported."+t+"\n\nSee https://gatsbyjs.com/docs/reference/built-in-components/gatsby-slice#nested-slices")}throw new Error('Slice context "'+n.renderEnvironment+'" is not supported.')}}let E=function(e){function t(n,r,o,a){var i;const s=Object.entries(o).map((e=>{let[t,n]=e;return'not serializable "'+n+'" type passed to "'+t+'" prop'})).join(", "),c="SlicePropsError";let l="",u="";if(n){const e=h.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactDebugCurrentFrame.getCurrentStack().trim().split("\n").slice(1);e[0]=e[0].trim(),l="\n"+e.join("\n"),u='Slice "'+r+'" was passed props that are not serializable ('+s+")."}else{u=c+': Slice "'+r+'" was passed props that are not serializable ('+s+").";l=u+"\n"+(new Error).stack.trim().split("\n").slice(2).join("\n")}return(i=e.call(this,u)||this).name=c,l?i.stack=l:Error.captureStackTrace(function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(i),t),a&&(i.forcedLocation={...a,functionName:"Slice"}),i}return(0,l.Z)(t,e),t}(f(Error));const _=function(e,t,n,r){void 0===t&&(t={}),void 0===n&&(n=[]),void 0===r&&(r=null);for(const[o,a]of Object.entries(e)){if(null==a||!r&&"children"===o)continue;const e=r?r+"."+o:o;"function"==typeof a?t[e]=typeof a:"object"==typeof a&&n.indexOf(a)<=0&&(n.push(a),_(a,t,n,e))}return t};var x=n(83521);const A=r.ZP.enqueue;function S(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls are supposed to only be evaluated at compile time, and then compiled away. Unfortunately, something went wrong and the query was left in the compiled code.\n\nUnless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.")}},1975:function(e,t,n){"use strict";n.d(t,{uQ:function(){return d},kL:function(){return E},ZP:function(){return A},Nt:function(){return C},hs:function(){return S},jN:function(){return x},N1:function(){return _}});var r=n(94578),o=n(15785),a=n(40904);const i=function(e){if("undefined"==typeof document)return!1;const t=document.createElement("link");try{if(t.relList&&"function"==typeof t.relList.supports)return t.relList.supports(e)}catch(n){return!1}return!1}("prefetch")?function(e,t){return new Promise(((n,r)=>{if("undefined"==typeof document)return void r();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),Object.keys(t).forEach((e=>{o.setAttribute(e,t[e])})),o.onload=n,o.onerror=r;(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.onload=()=>{200===r.status?t():n()},r.send(null)}))},s={};var c=function(e,t){return new Promise((n=>{s[e]?n():i(e,t).then((()=>{n(),s[e]=!0})).catch((()=>{}))}))},l=n(68299),u=n(17802);const d={Error:"error",Success:"success"},p=e=>{const[t,n]=e.split("?");var r;return"/page-data/"+("/"===t?"index":(r="/"===(r=t)[0]?r.slice(1):r).endsWith("/")?r.slice(0,-1):r)+"/page-data.json"+(n?"?"+n:"")},f=e=>e.startsWith("//");function h(e,t){return void 0===t&&(t="GET"),new Promise((n=>{const r=new XMLHttpRequest;r.open(t,e,!0),r.onreadystatechange=()=>{4==r.readyState&&n(r)},r.send(null)}))}const m=/bot|crawler|spider|crawling/i,g=function(e,t,n){var r;void 0===t&&(t=null);const o={componentChunkName:e.componentChunkName,path:e.path,webpackCompilationHash:e.webpackCompilationHash,matchPath:e.matchPath,staticQueryHashes:e.staticQueryHashes,getServerDataError:e.getServerDataError,slicesMap:null!==(r=e.slicesMap)&&void 0!==r?r:{}};return{component:t,head:n,json:e.result,page:o}};function b(e){return new Promise((t=>{try{const n=e.readRoot();t(n)}catch(n){if(!Object.hasOwnProperty.call(n,"_response")||!Object.hasOwnProperty.call(n,"_status"))throw n;setTimeout((()=>{b(e).then(t)}),200)}}))}let v=function(){function e(e,t){this.inFlightNetworkRequests=new Map,this.pageDb=new Map,this.inFlightDb=new Map,this.staticQueryDb={},this.pageDataDb=new Map,this.partialHydrationDb=new Map,this.slicesDataDb=new Map,this.sliceInflightDb=new Map,this.slicesDb=new Map,this.isPrefetchQueueRunning=!1,this.prefetchQueued=[],this.prefetchTriggered=new Set,this.prefetchCompleted=new Set,this.loadComponent=e,(0,u.DS)(t)}var t=e.prototype;return t.memoizedGet=function(e){let t=this.inFlightNetworkRequests.get(e);return t||(t=h(e,"GET"),this.inFlightNetworkRequests.set(e,t)),t.then((t=>(this.inFlightNetworkRequests.delete(e),t))).catch((t=>{throw this.inFlightNetworkRequests.delete(e),t}))},t.setApiRunner=function(e){this.apiRunner=e,this.prefetchDisabled=e("disableCorePrefetching").some((e=>e))},t.fetchPageDataJson=function(e){const{pagePath:t,retries:n=0}=e,r=p(t);return this.memoizedGet(r).then((r=>{const{status:o,responseText:a}=r;if(200===o)try{const n=JSON.parse(a);if(void 0===n.path)throw new Error("not a valid pageData response");const r=t.split("?")[1];return r&&!n.path.includes(r)&&(n.path+="?"+r),Object.assign(e,{status:d.Success,payload:n})}catch(i){}return 404===o||200===o?"/404.html"===t||"/500.html"===t?Object.assign(e,{status:d.Error}):this.fetchPageDataJson(Object.assign(e,{pagePath:"/404.html",notFound:!0})):500===o?this.fetchPageDataJson(Object.assign(e,{pagePath:"/500.html",internalServerError:!0})):n<3?this.fetchPageDataJson(Object.assign(e,{retries:n+1})):Object.assign(e,{status:d.Error})}))},t.fetchPartialHydrationJson=function(e){const{pagePath:t,retries:n=0}=e,r=p(t).replace(".json","-rsc.json");return this.memoizedGet(r).then((r=>{const{status:o,responseText:a}=r;if(200===o)try{return Object.assign(e,{status:d.Success,payload:a})}catch(i){}return 404===o||200===o?"/404.html"===t||"/500.html"===t?Object.assign(e,{status:d.Error}):this.fetchPartialHydrationJson(Object.assign(e,{pagePath:"/404.html",notFound:!0})):500===o?this.fetchPartialHydrationJson(Object.assign(e,{pagePath:"/500.html",internalServerError:!0})):n<3?this.fetchPartialHydrationJson(Object.assign(e,{retries:n+1})):Object.assign(e,{status:d.Error})}))},t.loadPageDataJson=function(e){const t=(0,u.Cj)(e);if(this.pageDataDb.has(t)){const e=this.pageDataDb.get(t);return Promise.resolve(e)}return this.fetchPageDataJson({pagePath:t}).then((e=>(this.pageDataDb.set(t,e),e)))},t.loadPartialHydrationJson=function(e){const t=(0,u.Cj)(e);if(this.partialHydrationDb.has(t)){const e=this.partialHydrationDb.get(t);return Promise.resolve(e)}return this.fetchPartialHydrationJson({pagePath:t}).then((e=>(this.partialHydrationDb.set(t,e),e)))},t.loadSliceDataJson=function(e){if(this.slicesDataDb.has(e)){const t=this.slicesDataDb.get(e);return Promise.resolve({sliceName:e,jsonPayload:t})}return h("/slice-data/"+e+".json","GET").then((t=>{const n=JSON.parse(t.responseText);return this.slicesDataDb.set(e,n),{sliceName:e,jsonPayload:n}}))},t.findMatchPath=function(e){return(0,u.UD)(e)},t.loadPage=function(e){const t=(0,u.Cj)(e);if(this.pageDb.has(t)){const e=this.pageDb.get(t);return e.error?Promise.resolve({error:e.error,status:e.status}):Promise.resolve(e.payload)}if(this.inFlightDb.has(t))return this.inFlightDb.get(t);const n=[this.loadAppData(),this.loadPageDataJson(t)];const r=Promise.all(n).then((e=>{const[n,r,i]=e;if(r.status===d.Error||(null==i?void 0:i.status)===d.Error)return{status:d.Error};let s=r.payload;const{componentChunkName:c,staticQueryHashes:u=[],slicesMap:p={}}=s,f={},h=Array.from(new Set(Object.values(p))),m=e=>{if(this.slicesDb.has(e.name))return this.slicesDb.get(e.name);if(this.sliceInflightDb.has(e.name))return this.sliceInflightDb.get(e.name);const t=this.loadComponent(e.componentChunkName).then((t=>{return{component:(n=t,n&&n.default||n),sliceContext:e.result.sliceContext,data:e.result.data};var n}));return this.sliceInflightDb.set(e.name,t),t.then((t=>{this.slicesDb.set(e.name,t),this.sliceInflightDb.delete(e.name)})),t};return Promise.all(h.map((e=>this.loadSliceDataJson(e)))).then((e=>{const p=[],h=(0,o.Z)(u);for(const{jsonPayload:t,sliceName:n}of Object.values(e)){p.push({name:n,...t});for(const e of t.staticQueryHashes)h.includes(e)||h.push(e)}const v=[Promise.all(p.map(m)),this.loadComponent(c,"head")];v.push(this.loadComponent(c));const y=Promise.all(v).then((e=>{const[t,o,c]=e;f.createdAt=new Date;for(const n of t)(!n||n instanceof Error)&&(f.status=d.Error,f.error=n);let l;if((!c||c instanceof Error)&&(f.status=d.Error,f.error=c),f.status!==d.Error){if(f.status=d.Success,!0!==r.notFound&&!0!==(null==i?void 0:i.notFound)||(f.notFound=!0),s=Object.assign(s,{webpackCompilationHash:n?n.webpackCompilationHash:""}),"string"==typeof(null==i?void 0:i.payload)){l=g(s,null,o),l.partialHydration=i.payload;const e=new ReadableStream({start(e){const t=new TextEncoder;e.enqueue(t.encode(i.payload))},pull(e){e.close()},cancel(){}});return b((0,a.createFromReadableStream)(e)).then((e=>(l.partialHydration=e,l)))}l=g(s,c,o)}return l})),w=Promise.all(h.map((e=>{if(this.staticQueryDb[e]){const t=this.staticQueryDb[e];return{staticQueryHash:e,jsonPayload:t}}return this.memoizedGet("/page-data/sq/d/"+e+".json").then((t=>{const n=JSON.parse(t.responseText);return{staticQueryHash:e,jsonPayload:n}})).catch((()=>{throw new Error("We couldn't load \"/page-data/sq/d/"+e+'.json"')}))}))).then((e=>{const t={};return e.forEach((e=>{let{staticQueryHash:n,jsonPayload:r}=e;t[n]=r,this.staticQueryDb[n]=r})),t}));return Promise.all([y,w]).then((e=>{let n,[r,o]=e;return r&&(n={...r,staticQueryResults:o},f.payload=n,l.Z.emit("onPostLoadPageResources",{page:n,pageResources:n})),this.pageDb.set(t,f),f.error?{error:f.error,status:f.status}:n})).catch((e=>({error:e,status:d.Error})))}))}));return r.then((()=>{this.inFlightDb.delete(t)})).catch((e=>{throw this.inFlightDb.delete(t),e})),this.inFlightDb.set(t,r),r},t.loadPageSync=function(e,t){void 0===t&&(t={});const n=(0,u.Cj)(e);if(this.pageDb.has(n)){var r;const e=this.pageDb.get(n);if(e.payload)return e.payload;if(null!==(r=t)&&void 0!==r&&r.withErrorDetails)return{error:e.error,status:e.status}}},t.shouldPrefetch=function(e){return!!(()=>{if("connection"in navigator&&void 0!==navigator.connection){if((navigator.connection.effectiveType||"").includes("2g"))return!1;if(navigator.connection.saveData)return!1}return!0})()&&((!navigator.userAgent||!m.test(navigator.userAgent))&&!this.pageDb.has(e))},t.prefetch=function(e){if(!this.shouldPrefetch(e))return{then:e=>e(!1),abort:()=>{}};if(this.prefetchTriggered.has(e))return{then:e=>e(!0),abort:()=>{}};const t={resolve:null,reject:null,promise:null};t.promise=new Promise(((e,n)=>{t.resolve=e,t.reject=n})),this.prefetchQueued.push([e,t]);const n=new AbortController;return n.signal.addEventListener("abort",(()=>{const t=this.prefetchQueued.findIndex((t=>{let[n]=t;return n===e}));-1!==t&&this.prefetchQueued.splice(t,1)})),this.isPrefetchQueueRunning||(this.isPrefetchQueueRunning=!0,setTimeout((()=>{this._processNextPrefetchBatch()}),3e3)),{then:(e,n)=>t.promise.then(e,n),abort:n.abort.bind(n)}},t._processNextPrefetchBatch=function(){(window.requestIdleCallback||(e=>setTimeout(e,0)))((()=>{const e=this.prefetchQueued.splice(0,4),t=Promise.all(e.map((e=>{let[t,n]=e;return this.prefetchTriggered.has(t)||(this.apiRunner("onPrefetchPathname",{pathname:t}),this.prefetchTriggered.add(t)),this.prefetchDisabled?n.resolve(!1):this.doPrefetch((0,u.Cj)(t)).then((()=>{this.prefetchCompleted.has(t)||(this.apiRunner("onPostPrefetchPathname",{pathname:t}),this.prefetchCompleted.add(t)),n.resolve(!0)}))})));this.prefetchQueued.length?t.then((()=>{setTimeout((()=>{this._processNextPrefetchBatch()}),3e3)})):this.isPrefetchQueueRunning=!1}))},t.doPrefetch=function(e){const t=p(e);return c(t,{crossOrigin:"anonymous",as:"fetch"}).then((()=>this.loadPageDataJson(e)))},t.hovering=function(e){this.loadPage(e)},t.getResourceURLsForPathname=function(e){const t=(0,u.Cj)(e),n=this.pageDataDb.get(t);if(n){const e=g(n.payload);return[].concat((0,o.Z)(y(e.page.componentChunkName)),[p(t)])}return null},t.isPageNotFound=function(e){const t=(0,u.Cj)(e),n=this.pageDb.get(t);return!n||n.notFound},t.loadAppData=function(e){return void 0===e&&(e=0),this.memoizedGet("/page-data/app-data.json").then((t=>{const{status:n,responseText:r}=t;let o;if(200!==n&&e<3)return this.loadAppData(e+1);if(200===n)try{const e=JSON.parse(r);if(void 0===e.webpackCompilationHash)throw new Error("not a valid app-data response");o=e}catch(a){}return o}))},e}();const y=e=>(window.___chunkMapping[e]||[]).map((e=>""+e));let w,E=function(e){function t(t,n,r){var o;return o=e.call(this,(function(e,n){if(void 0===n&&(n="components"),!t[n="components"][e])throw new Error("We couldn't find the correct component chunk with the name \""+e+'"');return t[n][e]().catch((e=>e))}),n)||this,r&&o.pageDataDb.set((0,u.Cj)(r.path),{pagePath:r.path,payload:r,status:"success"}),o}(0,r.Z)(t,e);var n=t.prototype;return n.doPrefetch=function(t){return e.prototype.doPrefetch.call(this,t).then((e=>{if(e.status!==d.Success)return Promise.resolve();const t=e.payload,n=t.componentChunkName,r=y(n);return Promise.all(r.map(c)).then((()=>t))}))},n.loadPageDataJson=function(t){return e.prototype.loadPageDataJson.call(this,t).then((e=>e.notFound?f(t)?e:h(t,"HEAD").then((t=>200===t.status?{status:d.Error}:e)):e))},n.loadPartialHydrationJson=function(t){return e.prototype.loadPartialHydrationJson.call(this,t).then((e=>e.notFound?f(t)?e:h(t,"HEAD").then((t=>200===t.status?{status:d.Error}:e)):e))},t}(v);const _=e=>{w=e},x={enqueue:e=>w.prefetch(e),getResourceURLsForPathname:e=>w.getResourceURLsForPathname(e),loadPage:e=>w.loadPage(e),loadPageSync:function(e,t){return void 0===t&&(t={}),w.loadPageSync(e,t)},prefetch:e=>w.prefetch(e),isPageNotFound:e=>w.isPageNotFound(e),hovering:e=>w.hovering(e),loadAppData:()=>w.loadAppData()};var A=x;function S(){return w?w.staticQueryDb:{}}function C(){return w?w.slicesDb:{}}},94779:function(e,t,n){"use strict";n.d(t,{Z:function(){return A}});var r=n(67294),o=n(45697),a=n.n(o),i=n(3092),s=n(17802),c=n(15785),l=n(11883),u=n(87896),d=n(24941);function p(e){let{children:t,callback:n}=e;return(0,r.useEffect)((()=>{n()})),t}const f=["link","meta","style","title","base","noscript","script","html","body"];function h(e,t){if(e instanceof HTMLElement&&t instanceof HTMLElement){const n=t.getAttribute("nonce");if(n&&!e.getAttribute("nonce")){const r=t.cloneNode(!0);return r.setAttribute("nonce",""),r.nonce=n,n===e.nonce&&e.isEqualNode(r)}}return e.isEqualNode(t)}function m(e,t){void 0===t&&(t={html:{},body:{}});const n=new Map,r=[];for(const l of e.childNodes){var o,a;const e=l.nodeName.toLowerCase(),u=null===(o=l.attributes)||void 0===o||null===(a=o.id)||void 0===a?void 0:a.value;if(v(l)){if(b(e))if("html"===e||"body"===e)for(const n of l.attributes){const r="style"===n.name;var i;if(t[e]={...t[e]},r||(t[e][n.name]=n.value),r)t[e].style=""+(null!==(i=t[e])&&void 0!==i&&i.style?t[e].style:"")+n.value+" "}else{let e=l.cloneNode(!0);if(e.setAttribute("data-gatsby-head",!0),"script"===e.nodeName.toLowerCase()&&(e=g(e)),u)if(n.has(u)){var s;const t=n.get(u);null===(s=r[t].parentNode)||void 0===s||s.removeChild(r[t]),r[t]=e}else r.push(e),n.set(u,r.length-1);else r.push(e)}l.childNodes.length&&r.push.apply(r,(0,c.Z)(m(l,t).validHeadNodes))}}return{validHeadNodes:r,htmlAndBodyAttributes:t}}function g(e){const t=document.createElement("script");for(const n of e.attributes)t.setAttribute(n.name,n.value);return t.innerHTML=e.innerHTML,t}function b(e){return f.includes(e)}function v(e){return 1===e.nodeType}const y=document.createElement("div"),w={html:[],body:[]},E=()=>{var e;const{validHeadNodes:t,htmlAndBodyAttributes:n}=m(y);w.html=Object.keys(n.html),w.body=Object.keys(n.body),function(e){if(!e)return;const{html:t,body:n}=e,r=document.querySelector("html");r&&Object.entries(t).forEach((e=>{let[t,n]=e;r.setAttribute(t,n)}));const o=document.querySelector("body");o&&Object.entries(n).forEach((e=>{let[t,n]=e;o.setAttribute(t,n)}))}(n);const r=document.querySelectorAll("[data-gatsby-head]");var o;if(0===r.length)return void(o=document.head).append.apply(o,(0,c.Z)(t));const a=[];!function(e){let{oldNodes:t,newNodes:n,onStale:r,onNew:o}=e;for(const a of t){const e=n.findIndex((e=>h(e,a)));-1===e?r(a):n.splice(e,1)}for(const a of n)o(a)}({oldNodes:r,newNodes:t,onStale:e=>e.parentNode.removeChild(e),onNew:e=>a.push(e)}),(e=document.head).append.apply(e,a)};function _(e){let{pageComponent:t,staticQueryResults:n,pageComponentProps:o}=e;(0,r.useEffect)((()=>{if(null!=t&&t.Head){!function(e){if("function"!=typeof e)throw new Error('Expected "Head" export to be a function got "'+typeof e+'".')}(t.Head);const{render:a}=(0,d.U)(),s=r.createElement(t.Head,{location:{pathname:(e=o).location.pathname},params:e.params,data:e.data||{},serverData:e.serverData,pageContext:e.pageContext}),c=(0,i.h)("wrapRootElement",{element:s},s,(e=>{let{result:t}=e;return{element:t}})).pop();a(r.createElement(p,{callback:E},r.createElement(l.StaticQueryContext.Provider,{value:n},r.createElement(u.LocationProvider,null,c))),y)}var e;return()=>{!function(){const e=document.querySelectorAll("[data-gatsby-head]");for(const t of e)t.parentNode.removeChild(t)}(),function(e){if(!e)return;const{html:t,body:n}=e;if(t){const e=document.querySelector("html");t.forEach((t=>{e&&e.removeAttribute(t)}))}if(n){const e=document.querySelector("body");n.forEach((t=>{e&&e.removeAttribute(t)}))}}(w)}}))}function x(e){const t={...e,params:{...(0,s.GA)(e.location.pathname),...e.pageResources.json.pageContext.__params}};let n;var o;n=e.pageResources.partialHydration?e.pageResources.partialHydration:(0,r.createElement)((o=e.pageResources.component)&&o.default||o,{...t,key:e.path||e.pageResources.page.path});_({pageComponent:e.pageResources.head,staticQueryResults:e.pageResources.staticQueryResults,pageComponentProps:t});return(0,i.h)("wrapPageElement",{element:n,props:t},n,(e=>{let{result:n}=e;return{element:n,props:t}})).pop()}x.propTypes={location:a().object.isRequired,pageResources:a().object.isRequired,data:a().object,pageContext:a().object.isRequired};var A=x},25824:function(e,t,n){"use strict";var r=n(94578),o=n(3092),a=n(67294),i=n(87896),s=n(19679),c=n(51757),l=n(38995),u=n(1975),d=n(96073),p=n(68299);const f={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"};var h=n(71562);function m(e){const t=(0,d.J)(e),{hash:n,search:r}=window.location;return null!=t&&(window.___replace(t.toPath+r+n),!0)}let g="";window.addEventListener("unhandledrejection",(e=>{/loading chunk \d* failed./i.test(e.reason)&&g&&(window.location.pathname=g)}));const b=(e,t)=>{m(e.pathname)||(g=e.pathname,(0,o.h)("onPreRouteUpdate",{location:e,prevLocation:t}))},v=(e,t)=>{m(e.pathname)||(0,o.h)("onRouteUpdate",{location:e,prevLocation:t})},y=function(e,t){if(void 0===t&&(t={}),"number"==typeof e)return void i.globalHistory.navigate(e);const{pathname:n,search:r,hash:a}=(0,h.cP)(e),s=(0,d.J)(n);if(s&&(e=s.toPath+r+a),window.___swUpdated)return void(window.location=n+r+a);const c=setTimeout((()=>{p.Z.emit("onDelayedLoadPageResources",{pathname:n}),(0,o.h)("onRouteUpdateDelayed",{location:window.location})}),1e3);u.ZP.loadPage(n+r).then((o=>{if(!o||o.status===u.uQ.Error)return window.history.replaceState({},"",location.href),window.location=n,void clearTimeout(c);o&&o.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),window.location=n+r+a),(0,i.navigate)(e,t),clearTimeout(c)}))};function w(e,t){let{location:n}=t;const{pathname:r,hash:a}=n,i=(0,o.h)("shouldUpdateScroll",{prevRouterProps:e,pathname:r,routerProps:{location:n},getSavedScrollPosition:e=>[0,this._stateStorage.read(e,e.key)]});if(i.length>0)return i[i.length-1];if(e){const{location:{pathname:t}}=e;if(t===r)return a?decodeURI(a.slice(1)):[0,0]}return!0}let E=function(e){function t(t){var n;return(n=e.call(this,t)||this).announcementRef=a.createRef(),n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidUpdate=function(e,t){requestAnimationFrame((()=>{let e="new page at "+this.props.location.pathname;document.title&&(e=document.title);const t=document.querySelectorAll("#gatsby-focus-wrapper h1");t&&t.length&&(e=t[0].textContent);const n="Navigated to "+e;if(this.announcementRef.current){this.announcementRef.current.innerText!==n&&(this.announcementRef.current.innerText=n)}}))},n.render=function(){return a.createElement("div",Object.assign({},f,{ref:this.announcementRef}))},t}(a.Component);const _=(e,t)=>{var n,r;return e.href!==t.href||(null==e||null===(n=e.state)||void 0===n?void 0:n.key)!==(null==t||null===(r=t.state)||void 0===r?void 0:r.key)};let x=function(e){function t(t){var n;return n=e.call(this,t)||this,b(t.location,null),n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidMount=function(){v(this.props.location,null)},n.shouldComponentUpdate=function(e){return!!_(this.props.location,e.location)&&(b(e.location,this.props.location),!0)},n.componentDidUpdate=function(e){_(e.location,this.props.location)&&v(this.props.location,e.location)},n.render=function(){return a.createElement(a.Fragment,null,this.props.children,a.createElement(E,{location:location}))},t}(a.Component);var A=n(94779),S=n(85418);function C(e,t){for(var n in e)if(!(n in t))return!0;for(var r in t)if(e[r]!==t[r])return!0;return!1}var L=function(e){function t(t){var n;n=e.call(this)||this;const{location:r,pageResources:o}=t;return n.state={location:{...r},pageResources:o||u.ZP.loadPageSync(r.pathname+r.search,{withErrorDetails:!0})},n}(0,r.Z)(t,e),t.getDerivedStateFromProps=function(e,t){let{location:n}=e;if(t.location.href!==n.href){return{pageResources:u.ZP.loadPageSync(n.pathname+n.search,{withErrorDetails:!0}),location:{...n}}}return{location:{...n}}};var n=t.prototype;return n.loadResources=function(e){u.ZP.loadPage(e).then((t=>{t&&t.status!==u.uQ.Error?this.setState({location:{...window.location},pageResources:t}):(window.history.replaceState({},"",location.href),window.location=e)}))},n.shouldComponentUpdate=function(e,t){return t.pageResources?this.state.pageResources!==t.pageResources||(this.state.pageResources.component!==t.pageResources.component||(this.state.pageResources.json!==t.pageResources.json||(!(this.state.location.key===t.location.key||!t.pageResources.page||!t.pageResources.page.matchPath&&!t.pageResources.page.path)||function(e,t,n){return C(e.props,t)||C(e.state,n)}(this,e,t)))):(this.loadResources(e.location.pathname+e.location.search),!1)},n.render=function(){return this.props.children(this.state)},t}(a.Component),k=n(41505),D=n(24941);const P=new u.kL(S,[],window.pageData);(0,u.N1)(P),P.setApiRunner(o.h);const{render:T,hydrate:R}=(0,D.U)();window.asyncRequires=S,window.___emitter=p.Z,window.___loader=u.jN,i.globalHistory.listen((e=>{e.location.action=e.action})),window.___push=e=>y(e,{replace:!1}),window.___replace=e=>y(e,{replace:!0}),window.___navigate=(e,t)=>y(e,t);const O="gatsby-reload-compilation-hash-match";(0,o.I)("onClientEntry").then((()=>{(0,o.h)("registerServiceWorker").filter(Boolean).length>0&&n(29939);const e=e=>a.createElement(i.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},a.createElement(A.Z,e)),t=a.createContext({}),d={renderEnvironment:"browser"};let p=function(e){function n(){return e.apply(this,arguments)||this}return(0,r.Z)(n,e),n.prototype.render=function(){const{children:e}=this.props;return a.createElement(i.Location,null,(n=>{let{location:r}=n;return a.createElement(L,{location:r},(n=>{let{pageResources:r,location:o}=n;const i=(0,u.hs)(),s=(0,u.Nt)();return a.createElement(c.B9.Provider,{value:i},a.createElement(l.Bs.Provider,{value:d},a.createElement(l.m3.Provider,{value:s},a.createElement(l.u0.Provider,{value:r.page.slicesMap},a.createElement(t.Provider,{value:{pageResources:r,location:o}},e)))))}))}))},n}(a.Component),f=function(n){function o(){return n.apply(this,arguments)||this}return(0,r.Z)(o,n),o.prototype.render=function(){return a.createElement(t.Consumer,null,(t=>{let{pageResources:n,location:r}=t;return a.createElement(x,{location:r},a.createElement(s.$C,{location:r,shouldUpdateScroll:w},a.createElement(i.Router,{basepath:"",location:r,id:"gatsby-focus-wrapper"},a.createElement(e,Object.assign({path:"/404.html"===n.page.path||"/500.html"===n.page.path?(0,k.Z)(r.pathname,""):encodeURI((n.page.matchPath||n.page.path).split("?")[0])},this.props,{location:r,pageResources:n},n.json)))))}))},o}(a.Component);const{pagePath:h,location:m}=window;h&&""+h!==m.pathname+(h.includes("?")?m.search:"")&&!(P.findMatchPath((0,k.Z)(m.pathname,""))||h.match(/^\/(404|500)(\/?|.html)$/)||h.match(/^\/offline-plugin-app-shell-fallback\/?$/))&&(0,i.navigate)(""+h+(h.includes("?")?"":m.search)+m.hash,{replace:!0});const g=()=>{try{return sessionStorage}catch{return null}};u.jN.loadPage(m.pathname+m.search).then((e=>{var t;const n=g();if(null!=e&&null!==(t=e.page)&&void 0!==t&&t.webpackCompilationHash&&e.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),n)){if(!("1"===n.getItem(O)))return n.setItem(O,"1"),void window.location.reload(!0)}if(n&&n.removeItem(O),!e||e.status===u.uQ.Error){const t="page resources for "+m.pathname+" not found. Not rendering React";if(e&&e.error)throw console.error(t),e.error;throw new Error(t)}const r=(0,o.h)("wrapRootElement",{element:a.createElement(f,null)},a.createElement(f,null),(e=>{let{result:t}=e;return{element:t}})).pop(),i=function(){const e=a.useRef(!1);return a.useEffect((()=>{e.current||(e.current=!0,performance.mark&&performance.mark("onInitialClientRender"),(0,o.h)("onInitialClientRender"))}),[]),a.createElement(p,null,r)},s=document.getElementById("gatsby-focus-wrapper");let c=T;s&&s.children.length&&(c=R);const l=(0,o.h)("replaceHydrateFunction",void 0,c)[0];function d(){const e="undefined"!=typeof window?document.getElementById("___gatsby"):null;l(a.createElement(i,null),e)}const h=document;if("complete"===h.readyState||"loading"!==h.readyState&&!h.documentElement.doScroll)setTimeout((function(){d()}),0);else{const e=function(){h.removeEventListener("DOMContentLoaded",e,!1),window.removeEventListener("load",e,!1),d()};h.addEventListener("DOMContentLoaded",e,!1),window.addEventListener("load",e,!1)}}))}))},90224:function(e,t,n){"use strict";n.r(t);var r=n(67294),o=n(1975),a=n(94779);t.default=e=>{let{location:t}=e;const n=o.ZP.loadPageSync(t.pathname);return n?r.createElement(a.Z,{location:t,pageResources:n,...n.json}):null}},82743:function(e,t,n){var r;e.exports=(r=n(90224))&&r.default||r},24941:function(e,t,n){"use strict";n.d(t,{U:function(){return o}});const r=new WeakMap;function o(){const e=n(20745);return{render:(t,n)=>{let o=r.get(n);o||r.set(n,o=e.createRoot(n)),o.render(t)},hydrate:(t,n)=>e.hydrateRoot(n,t)}}},96073:function(e,t,n){"use strict";n.d(t,{J:function(){return a}});const r=new Map,o=new Map;function a(e){let t=r.get(e);return t||(t=o.get(e.toLowerCase())),t}[].forEach((e=>{e.ignoreCase?o.set(e.fromPath,e):r.set(e.fromPath,e)}))},29939:function(e,t,n){"use strict";n.r(t);var r=n(3092);"https:"!==window.location.protocol&&"localhost"!==window.location.hostname?console.error("Service workers can only be used over HTTPS, or on localhost for development"):"serviceWorker"in navigator&&navigator.serviceWorker.register("/sw.js").then((function(e){e.addEventListener("updatefound",(()=>{(0,r.h)("onServiceWorkerUpdateFound",{serviceWorker:e});const t=e.installing;console.log("installingWorker",t),t.addEventListener("statechange",(()=>{switch(t.state){case"installed":navigator.serviceWorker.controller?(window.___swUpdated=!0,(0,r.h)("onServiceWorkerUpdateReady",{serviceWorker:e}),window.___failedResources&&(console.log("resources failed, SW updated - reloading"),window.location.reload())):(console.log("Content is now available offline!"),(0,r.h)("onServiceWorkerInstalled",{serviceWorker:e}));break;case"redundant":console.error("The installing service worker became redundant."),(0,r.h)("onServiceWorkerRedundant",{serviceWorker:e});break;case"activated":(0,r.h)("onServiceWorkerActive",{serviceWorker:e})}}))}))})).catch((function(e){console.error("Error during service worker registration:",e)}))},38995:function(e,t,n){"use strict";n.d(t,{Bs:function(){return a},Db:function(){return s},m3:function(){return o},u0:function(){return i}});var r=n(67294);const o=r.createContext({}),a=r.createContext({}),i=r.createContext({}),s=r.createContext({})},51757:function(e,t,n){"use strict";n.d(t,{i1:function(){return c},B9:function(){return o},K2:function(){return l}});var r=n(67294);const o=(a="StaticQuery",i={},r.createServerContext?function(e,t){return void 0===t&&(t=null),globalThis.__SERVER_CONTEXT||(globalThis.__SERVER_CONTEXT={}),globalThis.__SERVER_CONTEXT[e]||(globalThis.__SERVER_CONTEXT[e]=r.createServerContext(e,t)),globalThis.__SERVER_CONTEXT[e]}(a,i):r.createContext(i));var a,i;function s(e){let{staticQueryData:t,data:n,query:o,render:a}=e;const i=n?n.data:t[o]&&t[o].data;return r.createElement(r.Fragment,null,i&&a(i),!i&&r.createElement("div",null,"Loading (StaticQuery)"))}const c=e=>{const{data:t,query:n,render:a,children:i}=e;return r.createElement(o.Consumer,null,(e=>r.createElement(s,{data:t,query:n,render:a||i,staticQueryData:e})))},l=e=>{var t;r.useContext;const n=r.useContext(o);if(isNaN(Number(e)))throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql`"+e+"`);\n");if(null!==(t=n[e])&&void 0!==t&&t.data)return n[e].data;throw new Error("The result of this StaticQuery could not be fetched.\n\nThis is likely a bug in Gatsby and if refreshing the page does not fix it, please open an issue in https://github.com/gatsbyjs/gatsby/issues")}},41505:function(e,t,n){"use strict";function r(e,t){return void 0===t&&(t=""),t?e===t?"/":e.startsWith(t+"/")?e.slice(t.length):e:e}n.d(t,{Z:function(){return r}})},47420:function(e,t,n){"use strict";n.r(t),n.d(t,{onInitialClientRender:function(){return c},onRouteUpdate:function(){return l}});n(3289);var r=n(65928);let o=!1;const a=e=>{window.gas&&window.gas("send","pageview",e)},i=e=>{window.ga&&window.ga("send","pageview",e)},s=function(e,t,n){return void 0===n&&(n={}),new Promise((r=>{const o=document.createElement("script");o.src=e,Object.assign(o,n),o.onload=()=>{t(),r()},document.body.appendChild(o)}))},c=()=>{const{dap:e,ga:t}=r.siteMetadata,{pathname:n}=window.location,c=[];if(e&&e.agency){let t="https://dap.digitalgov.gov/Universal-Federated-Analytics-Min.js?agency="+e.agency;e.subagency&&(t+="&subagency="+e.subagency);const r=()=>a(n);c.push(s(t,r,{id:"_fed_an_ua_tag"}))}if(t&&t.ua){const e="https://www.googletagmanager.com/gtag/js?id="+t.ua,r=()=>i(n);c.push(s(e,r));const o=document.createElement("script");o.text="\n window.dataLayer = window.dataLayer || [];\n function gtag() { dataLayer.push(arguments); }\n gtag('js', new Date());\n gtag('config', '"+t.ua+"', { 'anonymize_ip': true, 'forceSSL': true });\n ",document.body.appendChild(o)}Promise.all(c).then((()=>{o=!0}))},l=e=>{let{location:t}=e;o&&(a(t.pathname),i(t.pathname))}},65928:function(e){e.exports={siteMetadata:{author:"CISA",title:"Crossfeed",description:"Crossfeed is a tool that continuously enumerates and monitors an organization's public-facing attack surface in order to discover assets and flag potential security flaws.",navigation:[{items:[{text:"Home",link:"/"}]},{items:[{text:"User Guide",link:"/user-guide/quickstart/",rootLink:"/user-guide/"}]},{items:[{text:"Development",link:"/dev/quickstart/",rootLink:"/dev/"}]},{items:[{text:"Scanning FAQ",link:"/scans/"}]},{title:"",items:[{text:"API Reference",link:"/api-reference/"}]}],secondaryLinks:[{text:"Find Crossfeed on GitHub",link:"https://github.com/cisagov/crossfeed"}],searchgov:{endpoint:"https://search.usa.gov",affiliate:"federalist-uswds-example",access_key:"...",inline:!0},dap:{},ga:{}},pathPrefix:{}.BASEURL||"/",plugins:["gatsby-plugin-sass","gatsby-plugin-sharp","gatsby-plugin-react-helmet",{resolve:"gatsby-source-filesystem",options:{name:"images",path:"//src/images"}},{resolve:"gatsby-source-filesystem",options:{name:"documentation-pages",path:"//src/documentation-pages"}},{resolve:"gatsby-transformer-remark",options:{plugins:["gatsby-remark-autolink-headers",{resolve:"gatsby-remark-prismjs",options:{prompt:{user:"root",host:"localhost"}}},{resolve:"gatsby-remark-images",options:{maxWidth:590}}]}},{resolve:"gatsby-plugin-manifest",options:{name:"Crossfeed Documentation",short_name:"Crossfeed",start_url:"/",background_color:"#663399",theme_color:"#663399",display:"minimal-ui",icon:"src/images/logo.png"}},"gatsby-plugin-meta-redirect"]}},29608:function(e,t,n){"use strict";n.r(t),n.d(t,{onRouteUpdate:function(){return r}});n(11883),n(20292);const r=function(e,t){let{location:n}=e}},20292:function(e,t,n){"use strict";var r=n(11883)},89650:function(e,t){"use strict";var n=0,r=function(e){var t=window.decodeURI(e.replace("#",""));if(""!==t){var r=document.getElementById(t);if(r){var o=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop,a=document.documentElement.clientTop||document.body.clientTop||0,i=window.getComputedStyle(r),s=i.getPropertyValue("scroll-margin-top")||i.getPropertyValue("scroll-snap-margin-top")||"0px";return r.getBoundingClientRect().top+o-parseInt(s,10)-a-n}}return null};t.onInitialClientRender=function(e,t){t.offsetY&&(n=t.offsetY),requestAnimationFrame((function(){var e=r(window.location.hash);null!==e&&window.scrollTo(0,e)}))},t.shouldUpdateScroll=function(e){var t=e.routerProps.location,n=r(t.hash);return null===n||[0,n]}},50855:function(e,t){"use strict";t.DEFAULT_OPTIONS={maxWidth:650,wrapperStyle:"",backgroundColor:"white",linkImagesToOriginal:!0,showCaptions:!1,markdownCaptions:!1,withWebp:!1,withAvif:!1,tracedSVG:!1,loading:"lazy",decoding:"async",disableBgImageOnAlpha:!1,disableBgImage:!1},t.EMPTY_ALT="GATSBY_EMPTY_ALT",t.imageClass="gatsby-resp-image-image",t.imageWrapperClass="gatsby-resp-image-wrapper",t.imageBackgroundClass="gatsby-resp-image-background-image"},72154:function(e,t,n){"use strict";var r=n(50855),o=r.DEFAULT_OPTIONS,a=r.imageClass,i=r.imageBackgroundClass,s=r.imageWrapperClass;t.onRouteUpdate=function(e,t){for(var n=Object.assign({},o,t),r=document.querySelectorAll("."+s),c=function(){var e=r[l],t=e.querySelector("."+i),o=e.querySelector("."+a),s=function(){t.style.transition="opacity 0.5s 0.5s",o.style.transition="opacity 0.5s",c()},c=function e(){t.style.opacity=0,o.style.opacity=1,o.style.color="inherit",o.style.boxShadow="inset 0px 0px 0px 400px "+n.backgroundColor,o.removeEventListener("load",s),o.removeEventListener("error",e)};o.style.opacity=0,o.addEventListener("load",s),o.addEventListener("error",c),o.complete&&c()},l=0;l"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"'],224:"Meta",225:"AltGraph",246:"Attn",247:"CrSel",248:"ExSel",249:"EraseEof",250:"Play",251:"ZoomOut"}},l=1;l<25;l++)c.keys[111+l]="F"+l;var u="";for(l=65;l<91;l++)u=String.fromCharCode(l),c.keys[l]=[u.toLowerCase(),u.toUpperCase()];void 0===(o="function"==typeof(r=c)?r.call(t,n,t,e):r)||(e.exports=o)},{}],5:[function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},r)).join("")?void 0:1}catch(e){return}}()?Object.assign:function(e,t){for(var n,i=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;sr(l,e).filter((t=>t.closest(c)===e)),p=(e,t)=>{const n=e.closest(c);if(!n)throw new Error(l+" is missing outer "+c);t=a(e,t);var r="true"===n.getAttribute("aria-multiselectable");t&&!r&&d(n).forEach((t=>{t!==e&&a(t,!1)}))};e=o({[s]:{[l](e){e.preventDefault(),p(this),"true"!==this.getAttribute(u)||i(this)||this.scrollIntoView()}}},{init(e){r(l,e).forEach((e=>{var t="true"===e.getAttribute(u);p(e,t)}))},ACCORDION:c,BUTTON:l,show:e=>p(e,!0),hide:e=>p(e,!1),toggle:p,getButtons:d}),t.exports=e},{"../config":34,"../events":35,"../utils/behavior":43,"../utils/is-in-viewport":45,"../utils/select":49,"../utils/toggle":52}],16:[function(e,t,n){"use strict";const r=e("../utils/behavior");var o=e("../events").CLICK;const a=`.${e=e("../config").prefix}-banner__header`,i=e+"-banner__header--expanded";t.exports=r({[o]:{[a+" [aria-controls]"]:function(e){e.preventDefault(),this.closest(a).classList.toggle(i)}}})},{"../config":34,"../events":35,"../utils/behavior":43}],17:[function(e,t,n){"use strict";const r=e("../utils/select"),o=e("../utils/behavior"),a=`.${e=e("../config").prefix}-character-count`,i=`.${e}-character-count__field`,s=`.${e}-character-count__message`,c="The content is too long.",l=e+"-character-count__message--invalid",u=e=>{const t=e.closest(a);if(!t)throw new Error(i+" is missing outer "+a);if(e=t.querySelector(s))return{characterCountEl:t,messageEl:e};throw new Error(a+" is missing inner "+s)},d=e=>{const{characterCountEl:t,messageEl:n}=u(e);var r=parseInt(t.getAttribute("data-maxlength"),10);if(r){let t="";var o=e.value.length,a=o&&r{{var t=e;const r=u(t).characterCountEl;var n=t.getAttribute("maxlength");n&&(t.removeAttribute("maxlength"),r.setAttribute("data-maxlength",n))}d(e)}))},MESSAGE_INVALID_CLASS:l,VALIDATION_MESSAGE:c}),t.exports=e},{"../config":34,"../utils/behavior":43,"../utils/select":49}],18:[function(e,t,n){"use strict";const r=e("receptor/keymap"),o=e("../utils/select"),a=e("../utils/behavior"),i=e("../utils/sanitizer");var s=e("../config").prefix;e=e("../events").CLICK;const c=(s=s+"-combo-box")+"--pristine",l=s+"__select",u=s+"__input",d=s+"__clear-input",p=d+"__wrapper",f=s+"__input-button-separator",h=s+"__toggle-list",m=h+"__wrapper",g=s+"__list",b=s+"__list-option",v=b+"--focused",y=b+"--selected",w=s+"__status",E="."+s,_="."+l,x="."+u,A="."+d,S="."+h,C="."+g,L="."+b,k="."+v,D="."+y,P="."+w,T=function(e){var t=1{const t=e.closest(E);if(!t)throw new Error("Element is missing outer "+E);e=t.querySelector(_);var n=t.querySelector(x),r=t.querySelector(C),o=t.querySelector(P),a=t.querySelector(k),i=t.querySelector(D),s=t.querySelector(S),l=t.querySelector(A),u=t.classList.contains(c);return{comboBoxEl:t,selectEl:e,inputEl:n,listEl:r,statusEl:o,focusedOptionEl:a,selectedOptionEl:i,toggleListBtnEl:s,clearInputBtnEl:l,isPristine:u,disableFiltering:"true"===t.dataset.disableFiltering}},O=e=>{const{inputEl:t,toggleListBtnEl:n,clearInputBtnEl:r}=R(e);r.hidden=!0,r.disabled=!0,n.disabled=!0,t.disabled=!0},j=e=>{const t=e.closest(E);if(!t.dataset.enhanced){const v=t.querySelector("select");if(!v)throw new Error(E+" is missing inner select");e=v.id;const y=document.querySelector(`label[for="${e}"]`);var n=e+"--list",r=e+"-label",o=e+"--assistiveHint";const _=[];var a=t.dataset.defaultValue,s=t.dataset.placeholder;let x;if(s&&_.push({placeholder:s}),a)for(let e=0,t=v.options.length;e{var t;v.hasAttribute(e)&&(t=v.getAttribute(e),_.push({[e]:t}),v.removeAttribute(e))}));const A=document.createElement("input");A.setAttribute("id",e),A.setAttribute("aria-owns",n),A.setAttribute("aria-controls",n),A.setAttribute("aria-autocomplete","list"),A.setAttribute("aria-describedby",o),A.setAttribute("aria-expanded","false"),A.setAttribute("autocapitalize","off"),A.setAttribute("autocomplete","off"),A.setAttribute("class",u),A.setAttribute("type","text"),A.setAttribute("role","combobox"),_.forEach((e=>Object.keys(e).forEach((t=>{var n=i.escapeHTML`${e[t]}`;A.setAttribute(t,n)})))),t.insertAdjacentElement("beforeend",A),t.insertAdjacentHTML("beforeend",i.escapeHTML`
+
+
+
+
+
+
+
+
+
+
+
+ When autocomplete results are available use up and down arrows to review and enter to select.
+ Touch device users, explore by touch or with swipe gestures.
+ `),x&&(s=R(t).inputEl,T(v,x.value),T(s,x.text),t.classList.add(c)),v.disabled&&(O(t),v.disabled=!1),t.dataset.enhanced="true"}},M=function(e,t){var{skipFocus:n,preventScroll:r}=2e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return e=`^(?:${e.replace(/{{(.*?)}}/g,((e,o)=>{o=o.trim();var a=n[o];return"query"!==o&&a?(o=new RegExp(a,"i"),(a=t.match(o))?r(a[1]):""):r(t)}))})$`,new RegExp(e,"i")},$=e=>{const{comboBoxEl:t,selectEl:n,inputEl:r,listEl:o,statusEl:a,isPristine:i,disableFiltering:s}=R(e);let c,l;const u=o.id+"--option-";var d=(r.value||"").toLowerCase();e=t.dataset.filter||".*{{query}}.*";const p=N(e,d,t.dataset),f=[];for(let b=0,v=n.options.length;b{var n=u+t;const r=[b];let o="-1",a="false";n===c&&(r.push(y,v),o="0",a="true"),c||0!==t||(r.push(v),o="0");const i=document.createElement("li");return i.setAttribute("aria-setsize",f.length),i.setAttribute("aria-posinset",t+1),i.setAttribute("aria-selected",a),i.setAttribute("id",n),i.setAttribute("class",r.join(" ")),i.setAttribute("tabindex",o),i.setAttribute("role","option"),i.setAttribute("data-value",e.value),i.textContent=e.text,i})),w=document.createElement("li");let E;w.setAttribute("class",b+"--no-results"),w.textContent="No results found",o.hidden=!1,e?(o.innerHTML="",g.forEach((e=>o.insertAdjacentElement("beforeend",e)))):(o.innerHTML="",o.insertAdjacentElement("beforeend",w)),r.setAttribute("aria-expanded","true"),a.textContent=e?e+` result${1{const{inputEl:t,listEl:n,statusEl:r,focusedOptionEl:o}=R(e);r.innerHTML="",t.setAttribute("aria-expanded","false"),t.setAttribute("aria-activedescendant",""),o&&o.classList.remove(v),n.scrollTop=0,n.hidden=!0},q=e=>{const{comboBoxEl:t,selectEl:n,inputEl:r}=R(e);T(n,e.dataset.value),T(r,e.textContent),t.classList.add(c),I(t),r.focus()},H=e=>{const{comboBoxEl:t,selectEl:n,inputEl:r}=R(e);var o=n.value,a=(r.value||"").toLowerCase();if(o)for(let s=0,l=n.options.length;s{const{comboBoxEl:t,listEl:n}=R(e.target);n.hidden&&$(t);var r=n.querySelector(k)||n.querySelector(L);r&&M(t,r),e.preventDefault()},F=e=>{var t=e.target,n=t.nextSibling;n&&M(t,n),e.preventDefault()},U=e=>{var{comboBoxEl:t,listEl:n,focusedOptionEl:r}=R(e.target),r=r&&r.previousSibling,n=!n.hidden;M(t,r),n&&e.preventDefault(),r||I(t)};e=a({[e]:{[x](){var e,t;this.disabled||(e=this,({comboBoxEl:e,listEl:t}=R(e)),t.hidden&&$(e))},[S](){if(!this.disabled){const{comboBoxEl:e,listEl:t,inputEl:n}=R(this);(t.hidden?$:I)(e),n.focus()}},[L](){this.disabled||q(this)},[A](){if(!this.disabled){var e=this;const{comboBoxEl:t,listEl:n,selectEl:r,inputEl:o}=R(e);e=!n.hidden,r.value&&T(r),o.value&&T(o),t.classList.remove(c),e&&$(t),o.focus()}}},focusout:{[E](e){this.contains(e.relatedTarget)||(H(this),I(this))}},keydown:{[E]:r({Escape:e=>{const{comboBoxEl:t,inputEl:n}=R(e.target);I(t),H(t),n.focus()}}),[x]:r({Enter:e=>{var{comboBoxEl:t,listEl:n}=R(e.target),n=!n.hidden;(e=>{const{comboBoxEl:t,selectEl:n,inputEl:r,statusEl:o}=R(e);o.textContent="";var a=(r.value||"").toLowerCase();if(a)for(let i=0,s=n.options.length;i{q(e.target),e.preventDefault()},Tab:e=>{q(e.target),e.preventDefault()},"Shift+Tab":()=>{}})},input:{[x](){this.closest(E).classList.remove(c),$(this)}},mouseover:{[L](){var e;(e=this).classList.contains(v)||M(e,e,{preventScroll:!0})}}},{init(e){o(E,e).forEach((e=>{j(e)}))},getComboBoxContext:R,enhanceComboBox:j,generateDynamicRegExp:N,disable:O,enable:e=>{const{inputEl:t,toggleListBtnEl:n,clearInputBtnEl:r}=R(e);r.hidden=!1,r.disabled=!1,n.disabled=!1,t.disabled=!1},displayList:$,hideList:I,COMBO_BOX_CLASS:s}),t.exports=e},{"../config":34,"../events":35,"../utils/behavior":43,"../utils/sanitizer":47,"../utils/select":49,"receptor/keymap":12}],19:[function(e,t,n){"use strict";const r=e("receptor/keymap"),o=e("../utils/behavior"),a=e("../utils/select");var i=e("../config").prefix,s=e("../events").CLICK;const c=e("../utils/active-element"),l=e("../utils/is-ios-device"),u=e("../utils/sanitizer"),d=(e=i+"-date-picker")+"__wrapper",p=e+"--initialized",f=e+"--active",h=e+"__internal-input",m=e+"__external-input",g=e+"__button",b=e+"__calendar",v=e+"__status",y=b+"__date",w=y+"--focused",E=y+"--selected",_=y+"--previous-month",x=y+"--current-month",A=y+"--next-month",S=y+"--range-date",C=y+"--today",L=y+"--range-date-start",k=y+"--range-date-end",D=y+"--within-range",P=b+"__previous-year",T=b+"__previous-month",R=b+"__next-year",O=b+"__next-month",j=b+"__month-selection",M=b+"__year-selection",N=b+"__month",$=N+"--focused",I=N+"--selected",q=b+"__year",H=q+"--focused",B=q+"--selected",F=b+"__previous-year-chunk",U=b+"__next-year-chunk",W=b+"__date-picker",Q=b+"__month-picker",Y=b+"__year-picker",J=b+"__table",Z=b+"__row",K=b+"__cell",V=K+"--center-items",z=b+"__month-label",G=b+"__day-of-week",X="."+e,ee="."+g,te="."+h,ne="."+m,re="."+b,oe="."+v;i="."+y;const ae="."+w;e="."+x;const ie="."+P,se="."+T,ce="."+R,le="."+O;var ue="."+M,de="."+j,pe="."+N;const fe="."+q,he="."+F,me="."+U,ge="."+W;var be="."+Q;const ve="."+Y,ye="."+$,we="."+H,Ee="Please enter a valid date",_e=["January","February","March","April","May","June","July","August","September","October","November","December"],xe=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Ae=12,Se="MM/DD/YYYY",Ce="YYYY-MM-DD";function Le(){for(var e=arguments.length,t=new Array(e),n=0;ne+":not([disabled])")).join(", ")}var ke=Le(ie,se,ue,de,ce,le,ae),De=Le(ye),Pe=Le(he,me,we);const Te=(e,t)=>(t!==e.getMonth()&&e.setDate(0),e),Re=(e,t,n)=>{const r=new Date(0);return r.setFullYear(e,t,n),r},Oe=()=>{const e=new Date;var t=e.getDate(),n=e.getMonth(),r=e.getFullYear();return Re(r,n,t)},je=e=>{const t=new Date(0);return t.setFullYear(e.getFullYear(),e.getMonth(),1),t},Me=e=>{const t=new Date(0);return t.setFullYear(e.getFullYear(),e.getMonth()+1,0),t},Ne=(e,t)=>{const n=new Date(e.getTime());return n.setDate(n.getDate()+t),n},$e=(e,t)=>Ne(e,-t),Ie=(e,t)=>Ne(e,7*t),qe=e=>{var t=e.getDay();return $e(e,t)},He=(e,t)=>{const n=new Date(e.getTime());return e=(n.getMonth()+12+t)%12,n.setMonth(n.getMonth()+t),Te(n,e),n},Be=(e,t)=>He(e,-t),Fe=(e,t)=>He(e,12*t),Ue=(e,t)=>Fe(e,-t),We=(e,t)=>{const n=new Date(e.getTime());return n.setMonth(t),Te(n,t),n},Qe=(e,t)=>{const n=new Date(e.getTime());return e=n.getMonth(),n.setFullYear(t),Te(n,e),n},Ye=(e,t)=>e&&t&&e.getFullYear()===t.getFullYear(),Je=(e,t)=>Ye(e,t)&&e.getMonth()===t.getMonth(),Ze=(e,t)=>Je(e,t)&&e.getDate()===t.getDate(),Ke=(e,t,n)=>{let r=e;return et<=e&&(!n||e<=n),ze=(e,t,n)=>Me(We(e,11))n,Ge=function(e){var t=1("0000"+e).slice(-t),r=e.getMonth()+1,o=e.getDate();e=e.getFullYear();return t===Se?[n(r,2),n(o,2),n(e,4)].join("/"):[n(e,4),n(r,2),n(o,2)].join("-")},et=(e,t)=>{const n=[];let r=[],o=0;for(;o{a.insertAdjacentElement("beforeend",e)})),n.push(a)}return n},tt=e=>{const t=document.createElement("tbody");return e.forEach((e=>{t.insertAdjacentElement("beforeend",e)})),t},nt=function(e){var t=1{const t=e.closest(X);if(!t)throw new Error("Element is missing outer "+X);e=t.querySelector(te);var n=t.querySelector(ne),r=t.querySelector(re),o=t.querySelector(ee),a=t.querySelector(oe),i=t.querySelector(fe),s=Ge(n.value,Se,!0),c=Ge(e.value),l=Ge(r.dataset.value),u=Ge(t.dataset.minDate),d=Ge(t.dataset.maxDate),p=Ge(t.dataset.rangeDate),f=Ge(t.dataset.defaultDate);if(u&&d&&d{const{externalInputEl:t,toggleBtnEl:n}=rt(e);n.disabled=!0,t.disabled=!0},at=e=>{var{externalInputEl:e,minDate:t,maxDate:n}=rt(e);const r=e.value;let o=!1;if(r){o=!0;const s=r.split("/");var[e,a,i]=s.map((e=>{let t;return e=parseInt(e,10),Number.isNaN(e)?t:e}));if(e&&a&&null!=i){const r=Re(i,e-1,a);r.getMonth()===e-1&&r.getDate()===a&&r.getFullYear()===i&&4===s[2].length&&Ve(r,t,n)&&(o=!1)}}return o},it=e=>{const t=rt(e).externalInputEl;(e=at(t))&&!t.validationMessage&&t.setCustomValidity(Ee),e||t.validationMessage!==Ee||t.setCustomValidity("")},st=(e,t)=>{var n,r,o=Ge(t);o&&(o=Xe(o,Se),({datePickerEl:e,internalInputEl:n,externalInputEl:r}=rt(e)),nt(n,t),nt(r,o),it(e))},ct=(e,t)=>{const{datePickerEl:n,calendarEl:r,statusEl:o,selectedDate:a,maxDate:i,minDate:s,rangeDate:c}=rt(e),l=Oe();let d=t||l;e=r.hidden;const p=Ne(d,0);var h=d.getMonth();t=d.getFullYear();const m=Be(d,1),g=He(d,1);var b=Xe(d),v=je(d),N=Je(d,s),$=Je(d,i),I=a||d;const q=c&&((e,t)=>new Date((tnew Date((e{const t=[y];var n=e.getDate(),r=e.getMonth(),o=e.getFullYear(),d=e.getDay(),f=Xe(e);let h="-1";var b=!Ve(e,s,i),v=Ze(e,a);Je(e,m)&&t.push(_),Je(e,p)&&t.push(x),Je(e,g)&&t.push(A),v&&t.push(E),Ze(e,l)&&t.push(C),c&&(Ze(e,c)&&t.push(S),Ze(e,q)&&t.push(L),Ze(e,H)&&t.push(k),Ve(e,B,F)&&t.push(D)),Ze(e,p)&&(h="0",t.push(w)),e=_e[r],d=xe[d];const P=document.createElement("button");return P.setAttribute("type","button"),P.setAttribute("tabindex",h),P.setAttribute("class",t.join(" ")),P.setAttribute("data-day",n),P.setAttribute("data-month",r+1),P.setAttribute("data-year",o),P.setAttribute("data-value",f),P.setAttribute("aria-label",u.escapeHTML`${n} ${e} ${o} ${d}`),P.setAttribute("aria-selected",v?"true":"false"),1==b&&(P.disabled=!0),P.textContent=n,P})(d)),d=Ne(d,1);v=et(U,7);const Q=r.cloneNode(),Y=(Q.dataset.value=b,Q.style.top=n.offsetHeight+"px",Q.hidden=!1,Q.innerHTML=u.escapeHTML`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,document.createElement("table")),X=(Y.setAttribute("class",J),Y.setAttribute("role","presentation"),document.createElement("thead")),ee=(Y.insertAdjacentElement("beforeend",X),document.createElement("tr")),te=(X.insertAdjacentElement("beforeend",ee),{Sunday:"S",Monday:"M",Tuesday:"T",Wednesday:"W",Thursday:"Th",Friday:"Fr",Saturday:"S"});Object.keys(te).forEach((e=>{const t=document.createElement("th");t.setAttribute("class",G),t.setAttribute("scope","presentation"),t.setAttribute("aria-label",e),t.textContent=te[e],ee.insertAdjacentElement("beforeend",t)})),b=tt(v),Y.insertAdjacentElement("beforeend",b);const ne=(Q.querySelector(ge).insertAdjacentElement("beforeend",Y),r.parentNode.replaceChild(Q,r),n.classList.add(f),[]);return Ze(a,p)&&ne.push("Selected date"),e?(ne.push("You can navigate by day using left and right arrows","Weeks by using up and down arrows","Months by using page up and page down keys","Years by using shift plus page up and shift plus page down","Home and end keys navigate to the beginning and end of a week"),o.textContent=""):ne.push(I+" "+t),o.textContent=ne.join(". "),Q},lt=e=>{const{datePickerEl:t,calendarEl:n,statusEl:r}=rt(e);t.classList.remove(f),n.hidden=!0,r.textContent=""},ut=e=>{var{calendarEl:e,inputDate:t,minDate:n,maxDate:r}=rt(e);!e.hidden&&t&&(t=Ke(t,n,r),ct(e,t))},dt=(e,t)=>{const{calendarEl:n,statusEl:r,calendarDate:o,minDate:a,maxDate:i}=rt(e),s=o.getMonth(),c=null==t?s:t;e=_e.map(((e,t)=>{var n=((e,t,n)=>Me(e)n)(n=We(o,t),a,i);let r="-1";const l=[N];var u=t===s;t===c&&(r="0",l.push($)),u&&l.push(I);const d=document.createElement("button");return d.setAttribute("type","button"),d.setAttribute("tabindex",r),d.setAttribute("class",l.join(" ")),d.setAttribute("data-value",t),d.setAttribute("data-label",e),d.setAttribute("aria-selected",u?"true":"false"),!0===n&&(d.disabled=!0),d.textContent=e,d}));const l=document.createElement("div"),u=(l.setAttribute("tabindex","-1"),l.setAttribute("class",Q),document.createElement("table"));u.setAttribute("class",J),u.setAttribute("role","presentation"),t=et(e,3),e=tt(t),u.insertAdjacentElement("beforeend",e),l.insertAdjacentElement("beforeend",u);const d=n.cloneNode();return d.insertAdjacentElement("beforeend",l),n.parentNode.replaceChild(d,n),r.textContent="Select a month.",d},pt=(e,t)=>{const{calendarEl:n,statusEl:r,calendarDate:o,minDate:a,maxDate:i}=rt(e);var s=o.getFullYear(),c=null==t?s:t,l=(e=c,t=(e-=e%Ae,e=Math.max(0,e),ze(Qe(o,e-1),a,i)),ze(Qe(o,e+Ae),a,i));const d=[];let p=e;for(;d.length{const{datePickerEl:t,externalInputEl:n}=rt(e.target);lt(t),n.focus(),e.preventDefault()};var ht=e=>t=>{var{calendarEl:n,calendarDate:r,minDate:o,maxDate:a}=rt(t.target),i=e(r);i=Ke(i,o,a);if(!Ze(r,i)){ct(n,i).querySelector(ae).focus()}t.preventDefault()},mt=ht((e=>((e,t)=>Ie(e,-1))(e))),gt=ht((e=>Ie(e,1))),bt=ht((e=>$e(e,1))),vt=ht((e=>Ne(e,1))),yt=ht((e=>qe(e))),wt=ht((e=>{var t=e.getDay();return Ne(e,6-t)})),Et=ht((e=>He(e,1))),_t=ht((e=>Be(e,1))),xt=ht((e=>Fe(e,1))),At=(ht=ht((e=>Ue(e,1))),e=>t=>{var n=t.target,r=parseInt(n.dataset.value,10),{calendarEl:n,calendarDate:o,minDate:a,maxDate:i}=rt(n),s=We(o,r),o=(r=e(r),r=Math.max(0,Math.min(11,r)),We(o,r));const c=Ke(o,a,i);if(!Je(s,c)){dt(n,c.getMonth()).querySelector(ye).focus()}t.preventDefault()}),St=At((e=>e-3)),Ct=At((e=>e+3)),Lt=At((e=>e-1)),kt=At((e=>e+1)),Dt=At((e=>e-e%3)),Pt=At((e=>e+2-e%3)),Tt=At((()=>11)),Rt=(At=At((()=>0)),e=>t=>{var n=t.target,r=parseInt(n.dataset.value,10),{calendarEl:n,calendarDate:o,minDate:a,maxDate:i}=rt(n),s=Qe(o,r),o=(r=e(r),r=Math.max(0,r),Qe(o,r));const c=Ke(o,a,i);if(!Ye(s,c)){pt(n,c.getFullYear()).querySelector(we).focus()}t.preventDefault()}),Ot=Rt((e=>e-3)),jt=Rt((e=>e+3)),Mt=Rt((e=>e-1)),Nt=Rt((e=>e+1)),$t=Rt((e=>e-e%3)),It=Rt((e=>e+2-e%3)),qt=Rt((e=>e-Ae)),Ht=(Rt=Rt((e=>e+Ae)),e=>{const t=t=>{t=rt(t).calendarEl;const n=a(e,t);t=n.length-1;var r=n[0],o=n[t],i=n.indexOf(c());return{focusableElements:n,isNotFound:-1===i,firstTabStop:r,isFirstTab:0===i,lastTabStop:o,isLastTab:i===t}};return{tabAhead(e){const{firstTabStop:n,isLastTab:r,isNotFound:o}=t(e.target);(r||o)&&(e.preventDefault(),n.focus())},tabBack(e){const{lastTabStop:n,isFirstTab:r,isNotFound:o}=t(e.target);(r||o)&&(e.preventDefault(),n.focus())}}});ke=Ht(ke),De=Ht(De),Ht=Ht(Pe);const Bt={[s]:{[ee](){var e=this;if(!e.disabled){var{calendarEl:t,inputDate:n,minDate:r,maxDate:o,defaultDate:a}=rt(e);if(t.hidden){n=Ke(n||a||Oe(),r,o);ct(t,n).querySelector(ae).focus()}else lt(e)}},[i](){var e=this;if(!e.disabled){const{datePickerEl:t,externalInputEl:n}=rt(e);st(e,e.dataset.value),lt(t),n.focus()}},[pe](){if(!(o=this).disabled){var{calendarEl:e,calendarDate:t,minDate:n,maxDate:r}=rt(o),o=parseInt(o.dataset.value,10),t=(t=We(t,o),Ke(t,n,r));ct(e,t).querySelector(ae).focus()}},[fe](){if(!(o=this).disabled){var{calendarEl:e,calendarDate:t,minDate:n,maxDate:r}=rt(o),o=parseInt(o.innerHTML,10),t=(t=Qe(t,o),Ke(t,n,r));ct(e,t).querySelector(ae).focus()}},[se](){var e;if(!(e=this).disabled){var{calendarEl:e,calendarDate:t,minDate:n,maxDate:r}=rt(e),t=(t=Be(t,1),Ke(t,n,r));const o=ct(e,t);let a=o.querySelector(se);(a=a.disabled?o.querySelector(ge):a).focus()}},[le](){var e;if(!(e=this).disabled){var{calendarEl:e,calendarDate:t,minDate:n,maxDate:r}=rt(e),t=(t=He(t,1),Ke(t,n,r));const o=ct(e,t);let a=o.querySelector(le);(a=a.disabled?o.querySelector(ge):a).focus()}},[ie](){var e;if(!(e=this).disabled){var{calendarEl:e,calendarDate:t,minDate:n,maxDate:r}=rt(e),t=(t=Ue(t,1),Ke(t,n,r));const o=ct(e,t);let a=o.querySelector(ie);(a=a.disabled?o.querySelector(ge):a).focus()}},[ce](){var e;if(!(e=this).disabled){var{calendarEl:e,calendarDate:t,minDate:n,maxDate:r}=rt(e),t=(t=Fe(t,1),Ke(t,n,r));const o=ct(e,t);let a=o.querySelector(ce);(a=a.disabled?o.querySelector(ge):a).focus()}},[he](){var e=this;if(!e.disabled){const{calendarEl:t,calendarDate:n,minDate:r,maxDate:o}=rt(e);e=t.querySelector(we),e=parseInt(e.textContent,10)-Ae,e=Math.max(0,e),e=Qe(n,e);const a=Ke(e,r,o),i=pt(t,a.getFullYear());let s=i.querySelector(he);(s=s.disabled?i.querySelector(ve):s).focus()}},[me](){var e=this;if(!e.disabled){const{calendarEl:t,calendarDate:n,minDate:r,maxDate:o}=rt(e);e=t.querySelector(we),e=parseInt(e.textContent,10)+Ae,e=Math.max(0,e),e=Qe(n,e);const a=Ke(e,r,o),i=pt(t,a.getFullYear());let s=i.querySelector(me);(s=s.disabled?i.querySelector(ve):s).focus()}},[de](){dt(this).querySelector(ye).focus()},[ue](){pt(this).querySelector(we).focus()}},keyup:{[re](e){var t=this.dataset.keydownKeyCode;""+e.keyCode!==t&&e.preventDefault()}},keydown:{[ne](e){13===e.keyCode&&it(this)},[i]:r({Up:mt,ArrowUp:mt,Down:gt,ArrowDown:gt,Left:bt,ArrowLeft:bt,Right:vt,ArrowRight:vt,Home:yt,End:wt,PageDown:Et,PageUp:_t,"Shift+PageDown":xt,"Shift+PageUp":ht,Tab:ke.tabAhead}),[ge]:r({Tab:ke.tabAhead,"Shift+Tab":ke.tabBack}),[pe]:r({Up:St,ArrowUp:St,Down:Ct,ArrowDown:Ct,Left:Lt,ArrowLeft:Lt,Right:kt,ArrowRight:kt,Home:Dt,End:Pt,PageDown:Tt,PageUp:At}),[be]:r({Tab:De.tabAhead,"Shift+Tab":De.tabBack}),[fe]:r({Up:Ot,ArrowUp:Ot,Down:jt,ArrowDown:jt,Left:Mt,ArrowLeft:Mt,Right:Nt,ArrowRight:Nt,Home:$t,End:It,PageDown:Rt,PageUp:qt}),[ve]:r({Tab:Ht.tabAhead,"Shift+Tab":Ht.tabBack}),[re](e){this.dataset.keydownKeyCode=e.keyCode},[X](e){r({Escape:ft})(e)}},focusout:{[ne](){it(this)},[X](e){this.contains(e.relatedTarget)||lt(this)}},input:{[ne](){{var{internalInputEl:e,inputDate:t}=rt(this);let n="";t&&!at(this)&&(n=Xe(t)),e.value!==n&&nt(e,n)}ut(this)}}};l()||(Bt.mouseover={[e](){if(!(e=this).disabled){var e,t=e.closest(re),n=t.dataset.value;if((e=e.dataset.value)!==n){n=Ge(e);ct(t,n).querySelector(ae).focus()}}},[pe](){var e=this;if(!e.disabled&&!e.classList.contains($)){var t=parseInt(e.dataset.value,10);dt(e,t).querySelector(ye).focus()}},[fe](){var e=this;if(!e.disabled&&!e.classList.contains(H)){var t=parseInt(e.dataset.value,10);pt(e,t).querySelector(we).focus()}}}),Pe=o(Bt,{init(e){a(X,e).forEach((e=>{{const n=e.closest(X),r=(e=n.dataset.defaultValue,n.querySelector("input"));if(!r)throw new Error(X+" is missing inner input");r.value&&(r.value="");var t=Ge(n.dataset.minDate||r.getAttribute("min"));n.dataset.minDate=t?Xe(t):"0000-01-01",(t=Ge(n.dataset.maxDate||r.getAttribute("max")))&&(n.dataset.maxDate=Xe(t));const o=document.createElement("div"),a=(o.classList.add(d),r.cloneNode());return a.classList.add(m),a.type="text",o.appendChild(a),o.insertAdjacentHTML("beforeend",u.escapeHTML`
+
+
+ `),r.setAttribute("aria-hidden","true"),r.setAttribute("tabindex","-1"),r.style.display="none",r.classList.add(h),r.removeAttribute("id"),r.removeAttribute("name"),r.required=!1,n.appendChild(o),n.classList.add(p),e&&st(n,e),void(r.disabled&&(ot(n),r.disabled=!1))}}))},getDatePickerContext:rt,disable:ot,enable:e=>{const{externalInputEl:t,toggleBtnEl:n}=rt(e);n.disabled=!1,t.disabled=!1},isDateInputInvalid:at,setCalendarValue:st,validateDateInput:it,renderCalendar:ct,updateCalendarIfVisible:ut}),t.exports=Pe},{"../config":34,"../events":35,"../utils/active-element":42,"../utils/behavior":43,"../utils/is-ios-device":46,"../utils/sanitizer":47,"../utils/select":49,"receptor/keymap":12}],20:[function(e,t,n){"use strict";const r=e("../utils/behavior"),o=e("../utils/select");var a=e("../config").prefix;const{getDatePickerContext:i,isDateInputInvalid:s,updateCalendarIfVisible:c}=e("./date-picker"),l=(e=a+"-date-range-picker")+"__range-start",u=e+"__range-end",d="."+a+"-date-picker",p="."+e,f="."+l,h="."+u,m=e=>{const t=e.closest(p);if(!t)throw new Error("Element is missing outer "+p);e=t.querySelector(f);var n=t.querySelector(h);return{dateRangePickerEl:t,rangeStartEl:e,rangeEndEl:n}},g=e=>{const{dateRangePickerEl:t,rangeStartEl:n,rangeEndEl:r}=m(e);var o=(e=i(n).internalInputEl).value;o&&!s(e)?(r.dataset.minDate=o,r.dataset.rangeDate=o,r.dataset.defaultDate=o):(r.dataset.minDate=t.dataset.minDate||"",r.dataset.rangeDate="",r.dataset.defaultDate=""),c(r)},b=e=>{const{dateRangePickerEl:t,rangeStartEl:n,rangeEndEl:r}=m(e);var o=(e=i(r).internalInputEl).value;o&&!s(e)?(n.dataset.maxDate=o,n.dataset.rangeDate=o,n.dataset.defaultDate=o):(n.dataset.maxDate=t.dataset.maxDate||"",n.dataset.rangeDate="",n.dataset.defaultDate=""),c(n)};a=r({"input change":{[f](){g(this)},[h](){b(this)}}},{init(e){o(p,e).forEach((e=>{{const t=e.closest(p),[n,r]=o(d,t);if(!n)throw new Error(`${p} is missing inner two '${d}' elements`);if(r)return n.classList.add(l),r.classList.add(u),t.dataset.minDate||(t.dataset.minDate="0000-01-01"),e=t.dataset.minDate,n.dataset.minDate=e,r.dataset.minDate=e,(e=t.dataset.maxDate)&&(n.dataset.maxDate=e,r.dataset.maxDate=e),g(t),void b(t);throw new Error(`${p} is missing second '${d}' element`)}}))}}),t.exports=a},{"../config":34,"../utils/behavior":43,"../utils/select":49,"./date-picker":19}],21:[function(e,t,n){"use strict";const r=e("../utils/select"),o=e("../utils/behavior");var a=e("../config").prefix;const i=e("../utils/sanitizer"),s=a+"-file-input",c="."+s,l=a+"-file-input__input",u=a+"-file-input__target",d="."+l,p=a+"-file-input__box",f=a+"-file-input__instructions",h=a+"-file-input__preview",m=a+"-file-input__preview-heading",g=a+"-file-input--disabled",b=a+"-file-input__choose",v=a+"-file-input__accepted-files-message",y=a+"-file-input__drag-text",w=a+"-file-input--drag",E="is-loading",_="display-none",x="has-invalid-file",A=a+"-file-input__preview-image",S=A+"--generic",C=A+"--pdf",L=A+"--word",k=A+"--video",D=A+"--excel",P="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";let T=Boolean(!0);const R=e=>{const t=e.closest(c);if(!t)throw new Error("Element is missing outer "+c);return e=t.querySelector(d),{dropZoneEl:t,inputEl:e}},O=e=>{const{dropZoneEl:t,inputEl:n}=R(e);n.disabled=!0,t.classList.add(g),t.setAttribute("aria-disabled","true")},j=e=>{const t=e.charCodeAt(0);return 32===t?"-":65<=t&&t<=90?"img_"+e.toLowerCase():"__"+t.toString(16).slice(-4)},M=e=>e.replace(/[^a-z0-9]/g,j),N=e=>e+"-"+Math.floor(Date.now().toString()/1e3),$=(e,t,n)=>{var r=e.querySelectorAll("."+h);const o=e.querySelector(d),a=e.querySelector("."+m),i=e.querySelector("."+v);a&&(a.outerHTML=""),i&&(i.outerHTML="",e.classList.remove(x)),null!==r&&(t&&t.classList.remove(_),o.setAttribute("aria-label",n),Array.prototype.forEach.call(r,(e=>{e.parentNode.removeChild(e)})))};e=o({},{init(e){r(c,e).forEach((e=>{const{instructions:t,dropTarget:n}=(e=>{var t=e.hasAttribute("multiple");const n=document.createElement("div"),r=document.createElement("div"),o=document.createElement("div"),a=document.createElement("div");var c=e.hasAttribute("disabled");let d;return e.classList.remove(s),e.classList.add(l),n.classList.add(s),o.classList.add(p),a.classList.add(f),a.setAttribute("aria-hidden","true"),r.classList.add(u),e.setAttribute("aria-live","polite"),e.parentNode.insertBefore(r,e),e.parentNode.insertBefore(n,r),r.appendChild(e),n.appendChild(r),e.parentNode.insertBefore(a,e),e.parentNode.insertBefore(o,e),c&&O(e),t?(d="No files selected",a.innerHTML=i.escapeHTML`Drag files here or choose from folder`):(d="No file selected",a.innerHTML=i.escapeHTML`Drag file here or choose from folder`),e.setAttribute("aria-label",d),e.setAttribute("data-default-aria-label",d),(/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(n.querySelector("."+y).outerHTML=""),{instructions:a,dropTarget:r}})(e);n.addEventListener("dragover",(function(){this.classList.add(w)}),!1),n.addEventListener("dragleave",(function(){this.classList.remove(w)}),!1),n.addEventListener("drop",(function(){this.classList.remove(w)}),!1),e.addEventListener("change",(r=>((e,t,n,r)=>{{var o=e,a=t,s=n,c=r;const i=a.getAttribute("accept");if(c.classList.remove(x),i){var l=i.split(",");const e=document.createElement("div");let t=!0;var u=o.target.files||o.dataTransfer.files;for(let n=0;n{let n=!1;return 0<=(e=e.indexOf(t))||n})(e.type,r.replace(/\*/g,""))){T=!0;break}}}t||($(c,s),a.value="",c.insertBefore(e,a),e.textContent=a.dataset.errormessage||"This is not a valid file type.",e.classList.add(v),c.classList.add(x),T=!1,o.preventDefault(),o.stopPropagation())}}if(!0===T){var d=t,p=n,f=r,g=(s=e).target.files;const o=document.createElement("div");s=d.dataset.defaultAriaLabel;const a=[];$(f,p,s);for(let e=0;e
+ ${n}
+
\n \n);\n\nexport default Highlights;\n","import React from 'react';\n\nimport Layout from '../components/layout';\nimport SEO from '../components/seo';\nimport Hero from '../components/hero';\nimport Tagline from '../components/tagline';\nimport Highlights from '../components/highlights';\n\nconst IndexPage = () => (\n \n \n \n \n \n \n);\n\nexport default IndexPage;\n"],"names":["Hero","React","className","style","backgroundImage","image","href","Tagline","target","_typeof","obj","Symbol","iterator","constructor","prototype","_defineProperties","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_defineProperty","value","_objectSpread","arguments","source","ownKeys","keys","getOwnPropertySymbols","concat","filter","sym","getOwnPropertyDescriptor","forEach","_slicedToArray","arr","Array","isArray","_arrayWithHoles","_arr","_n","_d","_e","undefined","_s","_i","next","done","push","err","_iterableToArrayLimit","TypeError","_nonIterableRest","noop","_WINDOW","_DOCUMENT","_PERFORMANCE","mark","measure","window","document","MutationObserver","performance","e","_ref$userAgent","navigator","userAgent","WINDOW","DOCUMENT","PERFORMANCE","IS_DOM","documentElement","head","addEventListener","createElement","NAMESPACE_IDENTIFIER","indexOf","DEFAULT_FAMILY_PREFIX","DEFAULT_REPLACEMENT_CLASS","DATA_FA_I2SVG","oneToTen","oneToTwenty","DUOTONE_CLASSES","GROUP","SWAP_OPACITY","PRIMARY","SECONDARY","initial","map","n","FontAwesomeConfig","querySelector","_ref","_ref2","attr","val","coerce","element","getAttribute","getAttrConfig","_config","familyPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","config","w","styles","hooks","shims","namespace","functions","doScroll","test","readyState","listener","removeEventListener","fn","asyncTimer","PENDING","SETTLED","FULFILLED","REJECTED","NOOP","isNode","g","process","emit","asyncSetTimer","setImmediate","setTimeout","asyncQueue","asyncFlush","asyncCall","callback","arg","invokeCallback","subscriber","owner","settled","_state","_data","promise","then","reject","handleThenable","resolve","resolved","call","fulfill","reason","publishFulfillment","publishRejection","publish","_then","_handled","notifyRejectionHandled","P","resolver","this","rejectPromise","invokeResolver","onFulfillment","onRejection","fulfilled","rejected","catch","all","promises","results","remaining","index","race","meaninglessTransform","size","x","y","rotate","flipX","flipY","insertCss","css","setAttribute","innerHTML","headChildren","childNodes","beforeChild","child","tagName","toUpperCase","insertBefore","idPool","nextUniqueId","id","Math","random","htmlEscape","str","replace","joinStyles","reduce","acc","styleName","transformIsMeaningful","transform","transformForSvg","containerWidth","iconWidth","outer","innerTranslate","innerScale","innerRotate","inner","path","ALL_SPACE","width","height","fillBlack","abstract","force","attributes","fill","makeInlineSvgAbstract","params","_params$icons","icons","main","mask","prefix","iconName","symbol","title","maskId","titleId","extra","_params$watchable","watchable","found","isUploadedIcon","widthClass","ceil","attrClass","c","classes","join","content","children","role","uploadedIconWidthStyle","tag","args","explicitMaskId","mainWidth","mainPath","icon","maskWidth","maskPath","trans","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","defs","makeIconMasking","styleString","makeIconStandard","asSymbol","offset","asIcon","noop$1","subject","initialValue","thisContext","result","func","a","b","d","bindInternal4","defineIcons","_params$skipHooks","skipHooks","normalized","addPack","build","lookup","reducer","o","ligatures","ligature","hasRegular","shim","oldName","iconFromMapping","mapping","toHtml","abstractNodes","_abstractNodes$attrib","_abstractNodes$childr","attributeName","trim","joinAttributes","parseTransformString","transformString","toLowerCase","split","parts","first","rest","slice","parseFloat","isNaN","MissingIcon","error","name","message","stack","Error","create","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","RING","OPACITY_ANIMATE","cx","cy","r","values","opacity","asFoundIcon","vectorData","class","baseStyles","dfp","drc","fp","rc","s","dPatt","RegExp","customPropPatt","rPatt","Library","instance","Constructor","_classCallCheck","definitions","protoProps","staticProps","_this","_len","_key","additions","_pullDefinitions","definition","_normalized$key","ensureCss","_cssInserted","apiObject","abstractCreator","get","container","html","findIconDefinition","iconLookup","_iconLookup$prefix","library","parse","iconDefinition","_params$transform","_params$symbol","_params$mask","_params$maskId","_params$title","_params$titleId","_params$classes","_params$attributes","_params$styles","type","maybeIconDefinition","object","enumerableOnly","symbols","apply","_objectSpread2","getOwnPropertyDescriptors","defineProperties","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","propertyIsEnumerable","_arrayLikeToArray","iter","from","minLen","toString","_unsupportedIterableToArray","len","arr2","camelize","string","match","chr","substr","_excluded","normalizeIconArgs","objectWithKey","FontAwesomeIcon","ref","iconArgs","maskArgs","_classes","beat","fade","beatFade","bounce","shake","flash","spin","spinPulse","spinReverse","pulse","fixedWidth","inverse","border","listItem","flip","rotation","pull","swapOpacity","classList","renderedIcon","_console","console","log","extraProps","defaultProps","hasOwnProperty","convertCurry","displayName","propTypes","convert","mixins","attrs","pair","prop","startsWith","charAt","_extraProps$style","existingStyle","bind","Highlights","src","circle","alt","faBoxes","faExclamationTriangle","faTasks","faChartLine","margin","display","IndexPage","Layout","SEO"],"sourceRoot":""}
\ No newline at end of file
diff --git a/component---src-pages-search-js-08757184eefc4ac09764.js b/component---src-pages-search-js-08757184eefc4ac09764.js
new file mode 100644
index 000000000..9f1f7094e
--- /dev/null
+++ b/component---src-pages-search-js-08757184eefc4ac09764.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunkcrossfeed_docs=self.webpackChunkcrossfeed_docs||[]).push([[996],{37654:function(e,a,t){t.d(a,{Z:function(){return u}});var n=t(67294),l=t(11883);var s=()=>n.createElement("div",{className:"usa-banner"},n.createElement("div",{className:"usa-accordion"},n.createElement("header",{className:"usa-banner__header"},n.createElement("div",{className:"usa-banner__inner"},n.createElement("div",{className:"grid-col-auto"},n.createElement("img",{className:"usa-banner__header-flag",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAMAAABBPP0LAAAAG1BMVEUdM7EeNLIeM7HgQCDaPh/bPh/bPx/////bPyBEby41AAAAUElEQVQI123MNw4CABDEwD3jC/9/MQ1BQrgeOSkIqYe2o2FZtthXgQLgbHVMZdlsfUQFQnHtjP1+8BUhBDKOqtmfot6ojqPzR7TjdU+f6vkED+IDPhTBcMAAAAAASUVORK5CYII=",alt:"U.S. flag"})),n.createElement("div",{className:"grid-col-fill tablet:grid-col-auto"},n.createElement("p",{className:"usa-banner__header-text"},"An official website of the United States government"),n.createElement("p",{className:"usa-banner__header-action","aria-hidden":"true"},"Here’s how you know")),n.createElement("button",{"aria-controls":"gov-banner","aria-expanded":!1,className:"usa-accordion__button usa-banner__button"},n.createElement("span",{className:"usa-banner__button-text"},"Here's how you know")))),n.createElement("div",{id:"gov-banner",className:"usa-accordion__content usa-banner__content",hidden:!0},n.createElement("div",{className:"grid-row grid-gap-lg"},n.createElement("div",{className:"usa-banner__guidance-gov tablet:grid-col-6"},n.createElement("img",{className:"usa-banner__icon usa-media-block__img",src:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWRvdC1nb3Y8L3RpdGxlPjxwYXRoIGZpbGw9IiMyMzc4QzMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDBjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMyIDAgMTcuNjczLTE0LjMyNyAzMi0zMiAzMkMxNC4zMjcgNjQgMCA0OS42NzMgMCAzMiAwIDE0LjMyNyAxNC4zMjcgMCAzMiAwem0wIDEuMjA4QzE0Ljk5NCAxLjIwOCAxLjIwOCAxNC45OTQgMS4yMDggMzJTMTQuOTk0IDYyLjc5MiAzMiA2Mi43OTIgNjIuNzkyIDQ5LjAwNiA2Mi43OTIgMzIgNDkuMDA2IDEuMjA4IDMyIDEuMjA4em0xMC41OSAzOC44NThhLjg1Ny44NTcgMCAwIDEgLjg4Mi44MjJ2MS42NDJIMTguODg2di0xLjY0MmEuODU3Ljg1NyAwIDAgMSAuODgyLS44MjJINDIuNTl6TTI1LjQ0MyAyNy43NzR2OS44MjloMS42NDJ2LTkuODNoMy4yNzN2OS44M0gzMnYtOS44M2gzLjI3MnY5LjgzaDEuNjQzdi05LjgzaDMuMjcydjkuODNoLjc2YS44NTcuODU3IDAgMCAxIC44ODIuODIxdi44MjFoLTIxLjN2LS44MDlhLjg1Ny44NTcgMCAwIDEgLjg4LS44MmguNzYydi05Ljg0MmgzLjI3MnptNS43MzYtOC4xODhsMTIuMjkzIDQuOTE1djEuNjQyaC0xLjYzYS44NTcuODU3IDAgMCAxLS44ODIuODIySDIxLjQxYS44NTcuODU3IDAgMCAxLS44ODItLjgyMmgtMS42NDJ2LTEuNjQybDEyLjI5My00LjkxNXoiLz48L3N2Zz4=",alt:"Dot gov"}),n.createElement("div",{className:"usa-media-block__body"},n.createElement("p",null,n.createElement("strong",null,"The .gov means it’s official."),n.createElement("br",null),"Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site."))),n.createElement("div",{className:"usa-banner__guidance-ssl tablet:grid-col-6"},n.createElement("img",{className:"usa-banner__icon usa-media-block__img",src:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWh0dHBzPC90aXRsZT48cGF0aCBmaWxsPSIjNzE5RjJBIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMiAwYzE3LjY3MyAwIDMyIDE0LjMyNyAzMiAzMiAwIDE3LjY3My0xNC4zMjcgMzItMzIgMzJDMTQuMzI3IDY0IDAgNDkuNjczIDAgMzIgMCAxNC4zMjcgMTQuMzI3IDAgMzIgMHptMCAxLjIwOEMxNC45OTQgMS4yMDggMS4yMDggMTQuOTk0IDEuMjA4IDMyUzE0Ljk5NCA2Mi43OTIgMzIgNjIuNzkyIDYyLjc5MiA0OS4wMDYgNjIuNzkyIDMyIDQ5LjAwNiAxLjIwOCAzMiAxLjIwOHptMCAxOC44ODZhNy4yNDUgNy4yNDUgMCAwIDEgNy4yNDUgNy4yNDV2My4xMDNoLjUyYy44NiAwIDEuNTU3LjY5OCAxLjU1NyAxLjU1OHY5LjMyMmMwIC44Ni0uNjk3IDEuNTU4LTEuNTU3IDEuNTU4aC0xNS41M2MtLjg2IDAtMS41NTctLjY5Ny0xLjU1Ny0xLjU1OFYzMmMwLS44Ni42OTctMS41NTggMS41NTctMS41NThoLjUyVjI3LjM0QTcuMjQ1IDcuMjQ1IDAgMCAxIDMyIDIwLjA5NHptMCAzLjEwM2E0LjE0MiA0LjE0MiAwIDAgMC00LjE0MiA0LjE0MnYzLjEwM2g4LjI4NFYyNy4zNEE0LjE0MiA0LjE0MiAwIDAgMCAzMiAyMy4xOTd6Ii8+PC9zdmc+",alt:"Https"}),n.createElement("div",{className:"usa-media-block__body"},n.createElement("p",null,n.createElement("strong",null,"The site is secure."),n.createElement("br",null),"The ",n.createElement("strong",null,"https://")," ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.")))))));var i=()=>n.createElement("footer",{className:"usa-footer site-footer",role:"contentinfo"});const c=e=>{let{children:a,siteTitle:t}=e;return n.createElement("header",{className:"usa-header usa-header--extended",role:"banner"},n.createElement("div",{className:"usa-navbar"},n.createElement("div",{className:"usa-logo",id:"extended-logo"},n.createElement("em",{className:"usa-logo__text"},n.createElement(l.Link,{to:"/",title:"Home","aria-label":"Home"},t))),n.createElement("button",{className:"usa-menu-btn"},"Menu")),a)};c.defaultProps={siteTitle:""};var r=c,M=t(87896);var m=e=>{let{navigation:a,secondaryLinks:t}=e;return n.createElement("nav",{role:"navigation",className:"usa-nav"},n.createElement("div",{className:"usa-nav__inner"},n.createElement("button",{className:"usa-nav__close"},n.createElement("img",{src:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5jbG9zZTwvdGl0bGU+PHBhdGggZmlsbD0iIzU2NUM2NSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNTcuMDQyIDEuMTVsNS44MDkgNS44MDhhNCA0IDAgMCAxIDAgNS42NTdMNDMuNDY1IDMybDE5LjM4NiAxOS4zODVhNCA0IDAgMCAxIDAgNS42NTdsLTUuODA5IDUuODA5YTQgNCAwIDAgMS01LjY1NyAwTDMyIDQzLjQ2NSAxMi42MTUgNjIuODUxYTQgNCAwIDAgMS01LjY1NyAwbC01LjgwOS01LjgwOWE0IDQgMCAwIDEgMC01LjY1N0wyMC41MzUgMzIgMS4xNDkgMTIuNjE1YTQgNCAwIDAgMSAwLTUuNjU3bDUuODA5LTUuODA5YTQgNCAwIDAgMSA1LjY1NyAwTDMyIDIwLjUzNSA1MS4zODUgMS4xNDlhNCA0IDAgMCAxIDUuNjU3IDB6Ii8+PC9zdmc+",alt:"close"})),n.createElement("ul",{className:"usa-accordion usa-nav__primary"},a.map(((e,a)=>n.createElement("li",{key:a,className:"usa-nav__primary-item"},e.items.length>1?n.createElement(n.Fragment,null,n.createElement("button",{className:"usa-accordion__button usa-nav__link "+(0===a?"usa-current":""),"aria-controls":"extended-nav-section-"+a,"aria-expanded":!1},n.createElement("span",null,e.title)),n.createElement("ul",{id:"extended-nav-section-"+a,className:"usa-accordion__content usa-nav__submenu",hidden:!0},e.items.map(((e,a)=>n.createElement("li",{key:a,className:"usa-nav__submenu-item"},n.createElement(l.Link,{to:e.link},e.text)))))):n.createElement(M.Location,null,(a=>{let{location:t}=a;return n.createElement(l.Link,{className:"usa-nav__link "+(t.pathname.startsWith(e.items[0].rootLink)?"usa-current":""),activeClassName:"usa-current",to:e.items[0].link},n.createElement("span",null,e.items[0].text))})))))),n.createElement("div",{className:"usa-nav__secondary"},n.createElement("ul",{className:"usa-nav__secondary-links"},t.map(((e,a)=>n.createElement("li",{key:a,className:"usa-nav__secondary-item"},e.link.startsWith("http")?n.createElement("a",{target:"_blank",href:e.link},e.text):n.createElement(l.Link,{to:e.link},e.text))))))))};var u=e=>{let{children:a}=e;const t=(0,l.useStaticQuery)("3841949133"),{title:c,navigation:M,secondaryLinks:u}=t.site.siteMetadata;return n.createElement(n.Fragment,null,n.createElement("a",{className:"usa-skipnav",href:"#main-content"},"Skip to main content"),n.createElement(s,null),n.createElement("div",{className:"usa-overlay"}),n.createElement(r,{siteTitle:c},n.createElement(m,{navigation:M,secondaryLinks:u})),a,n.createElement(i,null))}},95875:function(e,a,t){t.r(a);var n=t(67294),l=t(37654);a.default=e=>{let{data:a,location:t}=e;return n.createElement(l.Z,null,n.createElement("div",{className:"usa-layout-docs usa-section"}))}}}]);
+//# sourceMappingURL=component---src-pages-search-js-08757184eefc4ac09764.js.map
\ No newline at end of file
diff --git a/component---src-pages-search-js-08757184eefc4ac09764.js.map b/component---src-pages-search-js-08757184eefc4ac09764.js.map
new file mode 100644
index 000000000..f1ed10533
--- /dev/null
+++ b/component---src-pages-search-js-08757184eefc4ac09764.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"component---src-pages-search-js-08757184eefc4ac09764.js","mappings":"gLA8EA,MAzEeA,IACbC,EAAAA,cAAA,OAAKC,UAAU,cACbD,EAAAA,cAAA,OAAKC,UAAU,iBACbD,EAAAA,cAAA,UAAQC,UAAU,sBAChBD,EAAAA,cAAA,OAAKC,UAAU,qBACbD,EAAAA,cAAA,OAAKC,UAAU,iBACbD,EAAAA,cAAA,OACEC,UAAU,0BACVC,ICbd,qQDccC,IAAI,eAGRH,EAAAA,cAAA,OAAKC,UAAU,sCACbD,EAAAA,cAAA,KAAGC,UAAU,2BAA0B,uDAGvCD,EAAAA,cAAA,KAAGC,UAAU,4BAA4B,cAAY,QAAO,wBAI9DD,EAAAA,cAAA,UACE,gBAAc,aACd,iBAAe,EACfC,UAAU,4CAEVD,EAAAA,cAAA,QAAMC,UAAU,2BAA0B,0BAIhDD,EAAAA,cAAA,OACEI,GAAG,aACHH,UAAU,6CACVI,QAAM,GAENL,EAAAA,cAAA,OAAKC,UAAU,wBACbD,EAAAA,cAAA,OAAKC,UAAU,8CACbD,EAAAA,cAAA,OACEC,UAAU,wCACVC,IE3Cd,ykCF4CcC,IAAI,YAENH,EAAAA,cAAA,OAAKC,UAAU,yBACbD,EAAAA,cAAA,SACEA,EAAAA,cAAA,cAAQ,iCACRA,EAAAA,cAAA,WAAM,iJAOZA,EAAAA,cAAA,OAAKC,UAAU,8CACbD,EAAAA,cAAA,OACEC,UAAU,wCACVC,IG3Dd,69BH4DcC,IAAI,UAENH,EAAAA,cAAA,OAAKC,UAAU,yBACbD,EAAAA,cAAA,SACEA,EAAAA,cAAA,cAAQ,uBACRA,EAAAA,cAAA,WAAM,OACFA,EAAAA,cAAA,cAAQ,YAAiB,8II9B7C,MAjCeM,IACbN,EAAAA,cAAA,UAAQC,UAAU,yBAAyBM,KAAK,gBCAlD,MAAMC,EAASC,IAAA,IAAC,SAAEC,EAAQ,UAAEC,GAAWF,EAAA,OACrCT,EAAAA,cAAA,UAAQC,UAAU,kCAAkCM,KAAK,UACvDP,EAAAA,cAAA,OAAKC,UAAU,cACbD,EAAAA,cAAA,OAAKC,UAAU,WAAWG,GAAG,iBAC3BJ,EAAAA,cAAA,MAAIC,UAAU,kBACZD,EAAAA,cAACY,EAAAA,KAAI,CAACC,GAAG,IAAIC,MAAM,OAAO,aAAW,QAClCH,KAIPX,EAAAA,cAAA,UAAQC,UAAU,gBAAe,SAElCS,EACM,EAOXF,EAAOO,aAAe,CACpBJ,UAAU,IAGZ,Q,WCoDA,MAzEYF,IAAA,IAAC,WAAEO,EAAU,eAAEC,GAAgBR,EAAA,OACzCT,EAAAA,cAAA,OAAKO,KAAK,aAAaN,UAAU,WAC/BD,EAAAA,cAAA,OAAKC,UAAU,kBACbD,EAAAA,cAAA,UAAQC,UAAU,kBAChBD,EAAAA,cAAA,OAAKE,ICXb,irBDWyBC,IAAI,WAEvBH,EAAAA,cAAA,MAAIC,UAAU,kCACXe,EAAWE,KAAI,CAACC,EAAUC,IACzBpB,EAAAA,cAAA,MAAIqB,IAAKD,EAAKnB,UAAU,yBACrBkB,EAASG,MAAMC,OAAS,EACvBvB,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,UACEC,UAAS,wCACC,IAARmB,EAAY,cAAgB,IAE9B,wCAAuCA,EACvC,iBAAe,GAEfpB,EAAAA,cAAA,YAAOmB,EAASL,QAElBd,EAAAA,cAAA,MACEI,GAAE,wBAA0BgB,EAC5BnB,UAAU,0CACVI,QAAM,GAELc,EAASG,MAAMJ,KAAI,CAACM,EAASJ,IAC5BpB,EAAAA,cAAA,MAAIqB,IAAKD,EAAKnB,UAAU,yBACtBD,EAAAA,cAACY,EAAAA,KAAI,CAACC,GAAIW,EAAQC,MAAOD,EAAQE,WAMzC1B,EAAAA,cAAC2B,EAAAA,SAAQ,MACNC,IAAA,IAAC,SAAEC,GAAUD,EAAA,OACZ5B,EAAAA,cAACY,EAAAA,KAAI,CACHX,UACE,kBACC4B,EAASC,SAASC,WAAWZ,EAASG,MAAM,GAAGU,UAC5C,cACA,IAENC,gBAAgB,cAChBpB,GAAIM,EAASG,MAAM,GAAGG,MAEtBzB,EAAAA,cAAA,YAAOmB,EAASG,MAAM,GAAGI,MACpB,QAOnB1B,EAAAA,cAAA,OAAKC,UAAU,sBACbD,EAAAA,cAAA,MAAIC,UAAU,4BACXgB,EAAeC,KAAI,CAACgB,EAAed,IAClCpB,EAAAA,cAAA,MAAIqB,IAAKD,EAAKnB,UAAU,2BACrBiC,EAAcT,KAAKM,WAAW,QAC7B/B,EAAAA,cAAA,KAAGmC,OAAO,SAASC,KAAMF,EAAcT,MACpCS,EAAcR,MAGjB1B,EAAAA,cAACY,EAAAA,KAAI,CAACC,GAAIqB,EAAcT,MAAOS,EAAcR,YAQrD,EEhBR,MA7CejB,IAAmB,IAAlB,SAAEC,GAAUD,EAC1B,MAAM4B,GAAOC,EAAAA,EAAAA,gBAAe,eAsBtB,MAAExB,EAAK,WAAEE,EAAU,eAAEC,GAAmBoB,EAAKE,KAAKC,aAExD,OACExC,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,KAAGC,UAAU,cAAcmC,KAAK,iBAAgB,wBAGhDpC,EAAAA,cAACD,EAAM,MACPC,EAAAA,cAAA,OAAKC,UAAU,gBACfD,EAAAA,cAACQ,EAAM,CAACG,UAAWG,GACjBd,EAAAA,cAACyC,EAAG,CAAOzB,aAAYC,oBAExBP,EACDV,EAAAA,cAACM,EAAM,MACN,C,yDC0EP,UAxHmBG,IAAyB,IAAxB,KAAE4B,EAAI,SAAER,GAAUpB,EA0BpC,OACET,EAAAA,cAAC0C,EAAAA,EAAM,KACL1C,EAAAA,cAAA,OAAKC,UAAU,gCAyER,C","sources":["webpack://crossfeed-docs/./src/components/banner.js","webpack://crossfeed-docs/./node_modules/uswds/dist/img/us_flag_small.png","webpack://crossfeed-docs/./node_modules/uswds/dist/img/icon-dot-gov.svg","webpack://crossfeed-docs/./node_modules/uswds/dist/img/icon-https.svg","webpack://crossfeed-docs/./src/components/footer.js","webpack://crossfeed-docs/./src/components/header.js","webpack://crossfeed-docs/./src/components/nav.js","webpack://crossfeed-docs/./node_modules/uswds/dist/img/close.svg","webpack://crossfeed-docs/./src/components/layout.js","webpack://crossfeed-docs/./src/pages/search.js"],"sourcesContent":["import React from 'react';\nimport flag from '../../node_modules/uswds/dist/img/us_flag_small.png';\nimport dotGov from '../../node_modules/uswds/dist/img/icon-dot-gov.svg';\nimport https from '../../node_modules/uswds/dist/img/icon-https.svg';\n\nconst Banner = () => (\n
\n
\n \n
\n
\n \n
\n
\n
\n An official website of the United States government\n
\n
\n Here’s how you know\n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n The .gov means it’s official.\n \n Federal government websites often end in .gov or .mil. Before\n sharing sensitive information, make sure you’re on a federal\n government site.\n
\n
\n
\n
\n \n
\n
\n The site is secure.\n \n The https:// ensures that you are connecting to\n the official website and that any information you provide is\n encrypted and transmitted securely.\n
\n
\n
\n
\n
\n
\n
\n);\n\nexport default Banner;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAMAAABBPP0LAAAAG1BMVEUdM7EeNLIeM7HgQCDaPh/bPh/bPx/////bPyBEby41AAAAUElEQVQI123MNw4CABDEwD3jC/9/MQ1BQrgeOSkIqYe2o2FZtthXgQLgbHVMZdlsfUQFQnHtjP1+8BUhBDKOqtmfot6ojqPzR7TjdU+f6vkED+IDPhTBcMAAAAAASUVORK5CYII=\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWRvdC1nb3Y8L3RpdGxlPjxwYXRoIGZpbGw9IiMyMzc4QzMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDBjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMyIDAgMTcuNjczLTE0LjMyNyAzMi0zMiAzMkMxNC4zMjcgNjQgMCA0OS42NzMgMCAzMiAwIDE0LjMyNyAxNC4zMjcgMCAzMiAwem0wIDEuMjA4QzE0Ljk5NCAxLjIwOCAxLjIwOCAxNC45OTQgMS4yMDggMzJTMTQuOTk0IDYyLjc5MiAzMiA2Mi43OTIgNjIuNzkyIDQ5LjAwNiA2Mi43OTIgMzIgNDkuMDA2IDEuMjA4IDMyIDEuMjA4em0xMC41OSAzOC44NThhLjg1Ny44NTcgMCAwIDEgLjg4Mi44MjJ2MS42NDJIMTguODg2di0xLjY0MmEuODU3Ljg1NyAwIDAgMSAuODgyLS44MjJINDIuNTl6TTI1LjQ0MyAyNy43NzR2OS44MjloMS42NDJ2LTkuODNoMy4yNzN2OS44M0gzMnYtOS44M2gzLjI3MnY5LjgzaDEuNjQzdi05LjgzaDMuMjcydjkuODNoLjc2YS44NTcuODU3IDAgMCAxIC44ODIuODIxdi44MjFoLTIxLjN2LS44MDlhLjg1Ny44NTcgMCAwIDEgLjg4LS44MmguNzYydi05Ljg0MmgzLjI3MnptNS43MzYtOC4xODhsMTIuMjkzIDQuOTE1djEuNjQyaC0xLjYzYS44NTcuODU3IDAgMCAxLS44ODIuODIySDIxLjQxYS44NTcuODU3IDAgMCAxLS44ODItLjgyMmgtMS42NDJ2LTEuNjQybDEyLjI5My00LjkxNXoiLz48L3N2Zz4=\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWh0dHBzPC90aXRsZT48cGF0aCBmaWxsPSIjNzE5RjJBIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMiAwYzE3LjY3MyAwIDMyIDE0LjMyNyAzMiAzMiAwIDE3LjY3My0xNC4zMjcgMzItMzIgMzJDMTQuMzI3IDY0IDAgNDkuNjczIDAgMzIgMCAxNC4zMjcgMTQuMzI3IDAgMzIgMHptMCAxLjIwOEMxNC45OTQgMS4yMDggMS4yMDggMTQuOTk0IDEuMjA4IDMyUzE0Ljk5NCA2Mi43OTIgMzIgNjIuNzkyIDYyLjc5MiA0OS4wMDYgNjIuNzkyIDMyIDQ5LjAwNiAxLjIwOCAzMiAxLjIwOHptMCAxOC44ODZhNy4yNDUgNy4yNDUgMCAwIDEgNy4yNDUgNy4yNDV2My4xMDNoLjUyYy44NiAwIDEuNTU3LjY5OCAxLjU1NyAxLjU1OHY5LjMyMmMwIC44Ni0uNjk3IDEuNTU4LTEuNTU3IDEuNTU4aC0xNS41M2MtLjg2IDAtMS41NTctLjY5Ny0xLjU1Ny0xLjU1OFYzMmMwLS44Ni42OTctMS41NTggMS41NTctMS41NThoLjUyVjI3LjM0QTcuMjQ1IDcuMjQ1IDAgMCAxIDMyIDIwLjA5NHptMCAzLjEwM2E0LjE0MiA0LjE0MiAwIDAgMC00LjE0MiA0LjE0MnYzLjEwM2g4LjI4NFYyNy4zNEE0LjE0MiA0LjE0MiAwIDAgMCAzMiAyMy4xOTd6Ii8+PC9zdmc+\"","import React from 'react';\nimport logo from '../../node_modules/uswds/dist/img/logo-img.png';\n\nconst Footer = () => (\n \n);\n\nexport default Footer;\n","import { Link } from 'gatsby';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nconst Header = ({ children, siteTitle }) => (\n \n
\n
\n \n \n {siteTitle}\n \n \n
\n \n
\n {children}\n \n);\n\nHeader.propTypes = {\n siteTitle: PropTypes.string,\n};\n\nHeader.defaultProps = {\n siteTitle: ``,\n};\n\nexport default Header;\n","import { Link } from 'gatsby';\nimport React from 'react';\nimport { Location } from '@reach/router';\n\nimport close from '../../node_modules/uswds/dist/img/close.svg';\nimport SearchForm from './search-form';\n\nconst Nav = ({ navigation, secondaryLinks }) => (\n \n);\n\nexport default Nav;\n","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5jbG9zZTwvdGl0bGU+PHBhdGggZmlsbD0iIzU2NUM2NSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNTcuMDQyIDEuMTVsNS44MDkgNS44MDhhNCA0IDAgMCAxIDAgNS42NTdMNDMuNDY1IDMybDE5LjM4NiAxOS4zODVhNCA0IDAgMCAxIDAgNS42NTdsLTUuODA5IDUuODA5YTQgNCAwIDAgMS01LjY1NyAwTDMyIDQzLjQ2NSAxMi42MTUgNjIuODUxYTQgNCAwIDAgMS01LjY1NyAwbC01LjgwOS01LjgwOWE0IDQgMCAwIDEgMC01LjY1N0wyMC41MzUgMzIgMS4xNDkgMTIuNjE1YTQgNCAwIDAgMSAwLTUuNjU3bDUuODA5LTUuODA5YTQgNCAwIDAgMSA1LjY1NyAwTDMyIDIwLjUzNSA1MS4zODUgMS4xNDlhNCA0IDAgMCAxIDUuNjU3IDB6Ii8+PC9zdmc+\"","/**\n * Layout component that queries for data\n * with Gatsby's useStaticQuery component\n *\n * See: https://www.gatsbyjs.org/docs/use-static-query/\n */\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { useStaticQuery, graphql } from 'gatsby';\n\nimport Banner from './banner';\nimport Footer from './footer';\nimport Header from './header';\nimport Nav from './nav';\n\nconst Layout = ({ children }) => {\n const data = useStaticQuery(graphql`\n query SiteTitleQuery {\n site {\n siteMetadata {\n title\n navigation {\n title\n items {\n text\n link\n rootLink\n }\n }\n secondaryLinks {\n text\n link\n }\n }\n }\n }\n `);\n\n const { title, navigation, secondaryLinks } = data.site.siteMetadata;\n\n return (\n <>\n \n Skip to main content\n \n \n \n \n \n \n {children}\n \n >\n );\n};\n\nLayout.propTypes = {\n children: PropTypes.node.isRequired,\n};\n\nexport default Layout;\n","import React, { useEffect, useState } from 'react';\nimport { graphql } from 'gatsby';\n\nimport Layout from '../components/layout';\n\n// Crossfeed does not use the functionality of this page for the gatsby template.\n\nconst SearchPage = ({ data, location }) => {\n //\n // const { access_key, affiliate, endpoint } = data.site.siteMetadata.searchgov;\n // const query = new URLSearchParams(location.search).get('query');\n\n // const [results, setResults] = useState([]);\n\n // useEffect(() => {\n // const searchEndpoint = new URL(`${endpoint}/api/v2/search/i14y`);\n // searchEndpoint.searchParams.append('affiliate', affiliate);\n // searchEndpoint.searchParams.append('access_key', access_key);\n // searchEndpoint.searchParams.append('query', query);\n\n // fetch(searchEndpoint)\n // .then((r) => {\n // if (r.ok) {\n // return r.json();\n // }\n // throw new Error(r.statusText);\n // })\n // .then((posts) => {\n // setResults(posts.web.results);\n // })\n // .catch((err) => console.log(err));\n // }, [query, access_key, affiliate, endpoint]);\n\n return (\n \n
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
To manually SSH into the accessor instance, we use AWS Session Manager. This way, we don't need to run an EC2 bastion instance that's exposed to the public Internet.
+
+
+
First, install the AWS CLI on your development machine and run aws configure and enter your credentials.
Set up a Session Manager port forwarding session to allow SSH access to the instance.
+
# Set this environment variable to the ID of the EC2 bastion instance (which should be in a private subnet, but able to connect to the RDS instance).
+exportINSTANCE_ID=i-053b6d4bb95b01b28 # Dev instance ID
+# Generate an SSH key and send it to the EC2 instance
+# (this only needs to be done once).
+ssh-keygen -f accessor_rsa
+chmod600 accessor_rsa
+aws ec2-instance-connect send-ssh-public-key \
+ --instance-id $INSTANCE_ID\
+ --availability-zone us-east-1b \
+ --instance-os-user ubuntu \
+ --ssh-public-key file://accessor_rsa.pub
+
+# Start port forwarding.
+aws ssm start-session \
+ --target$INSTANCE_ID\
+ --document-name AWS-StartPortForwardingSession \
+ --parameters'{"portNumber":["22"], "localPortNumber":["9999"]}'
+
+
+
In another terminal, SSH into the instance:
+
+ssh ubuntu@localhost -p9999-i accessor_rsa
+
+
+
Once you SSH into the instance, you should now be able to access the database and run scripts on it. (Contact Ashwin for the database credentials)
+
+
+
+
\ No newline at end of file
diff --git a/dev/analytics/index.html b/dev/analytics/index.html
new file mode 100644
index 000000000..74cd7d3a4
--- /dev/null
+++ b/dev/analytics/index.html
@@ -0,0 +1,76 @@
+Matomo | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
Matomo is an open source analytics platform.
+We host an instance of Matomo as part of Crossfeed to collect analytics on its usage.
+
Matomo requires both an instance to host it and a MariaDB database.
+When running Matomo locally, we run it using the crossfeed_matomo_1
+and crossfeed_matomodb_1 Docker containers. When deployed, we run
+Matomo on AWS Fargate and use RDS to host the Matomo DB instance.
+
Only globalAdmin users can currently access Matomo. When accessing Matomo, you must use
+a separate shared username and password (in addition to the standard global admin authentication).
+
Directory structure
+
The file infrastructure/matomo.tf contains the Terraform infrastructure needed for deploying Matomo.
+
Setting up Matomo locally
+
Before you run Matomo for the first time locally, you must run ./setup-matomo.sh.
+
You can access Matomo by clicking on the "Matomo" button from the "My Account" page. Click
+through the original setup (keep the default values for database connection, etc.),
+then set the superuser username and password to "root" and "password" (for development only; for deployment to production, you should generate a random password).
+
Matomo proxy
+
The deployed Matomo instance isn't directly accessible to the Internet. Instead, all paths to the REST API
+that begin with /matomo are proxied to the Matomo instance. The JWT stored in the crossfeed-token
+cookie is checked to ensure that the user is a global admin before the API proxies the user's request.
+
+
\ No newline at end of file
diff --git a/dev/architecture-diagram/index.html b/dev/architecture-diagram/index.html
new file mode 100644
index 000000000..1b1d3971c
--- /dev/null
+++ b/dev/architecture-diagram/index.html
@@ -0,0 +1,59 @@
+
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
+
+
\ No newline at end of file
diff --git a/dev/architecture/index.html b/dev/architecture/index.html
new file mode 100644
index 000000000..045733e93
--- /dev/null
+++ b/dev/architecture/index.html
@@ -0,0 +1,72 @@
+Overall System Architecture | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
+
+
\ No newline at end of file
diff --git a/dev/database/index.html b/dev/database/index.html
new file mode 100644
index 000000000..78ea92b84
--- /dev/null
+++ b/dev/database/index.html
@@ -0,0 +1,183 @@
+Database | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
Crossfeed uses a relational database that uses Postgres. When running Crossfeed locally, the database is served from the container crossfeed_db_1. We rarely issue direct SQL queries to the database, but instead
+use TypeORM to communicate with it.
+
Directory structure
+
The backend/src/models folder contains all the TypeORM models.
+
The database is deployed onto AWS RDS. Configuration for this deployment is located in infrastructure/database.tf.
+
Models
+
Here is a list of database models used by Crossfeed:
+
+
+
+
Model Name
+
Description
+
+
+
+
+
Domain
+
A Domain stores a record for each domain / subdomain found by Crossfeed.
+
+
+
Service
+
A Service runs on a given port on a domain, for example, "http" or "ftp".
+
+
+
Vulnerability
+
A Vulnerability is an indicator of a vulnerability, unique to a domain, such as a CVE.
+
+
+
Webpage
+
A Webpage is a web path that has been scraped on a Domain.
+
+
+
ApiKey
+
An ApiKey can be generated by users to programmatically access the Crossfeed API.
+
+
+
Organization
+
An Organization represents an entity to be scanned that has a defined scope of root domains.
+
+
+
OrganizationTag
+
An OrganizationTag can be used to group multiple organizations.
+
+
+
Role
+
A Role represents a User's access level to an Organization.
+
+
+
User
+
A User is an account that can access Crossfeed.
+
+
+
SavedSearch
+
A SavedSearch is a search that a User has saved.
+
+
+
Scan
+
A Scan is a scheduled data collection job.
+
+
+
ScanTask
+
A ScanTask represents a specific run, at a certain time and date, of a Scan.
You should sync the database using the syncdb command whenever models change and
+you want to update the database schemas.
+
cd backend
+# Generate schema
+npm run syncdb
+# Populate sample data
+npm run syncdb -- -d populate
+
Manual access
+
To manually access the database, we use AWS Session Manager. This way, we don't need to run an EC2 bastion instance that's exposed to the public Internet.
Set up a Session Manager port forwarding session to allow SSH access to the instance.
+
# Set this environment variable to the ID of the EC2 bastion instance (which should be in a private subnet, but able to connect to the RDS instance).
+exportINSTANCE_ID=
+# Generate an SSH key and send it to the EC2 instance
+# (this only needs to be done once).
+ssh-keygen -f cisa_bastion_rsa
+aws ec2-instance-connect send-ssh-public-key \
+ --instance-id $INSTANCE_ID\
+ --availability-zone us-east-1b \
+ --instance-os-user ec2-user \
+ --ssh-public-key file://cisa_bastion_rsa.pub
+
+# Start port forwarding.
+aws ssm start-session \
+ --target$INSTANCE_ID\
+ --document-name AWS-StartPortForwardingSession \
+ --parameters'{"portNumber":["22"], "localPortNumber":["9999"]}'
+
+
+
In another terminal, forward the RDS connection to your local computer using the SSH connection from earlier:
+
# Set this environment variable to the URL of the RDS instance (XXX.rds.amazonaws.com)
+exportRDS_URL=
+
+# Forward RDS instance to localhost:5432
+ssh ec2-user@localhost \
+ -p9999\
+ -N\
+ -i cisa_bastion_rsa \
+ -L5432:$RDS_URL:5432
+
+
+
You should now be able to connect to the database directly from your local computer (with the actual RDS database credentials), at the URL localhost:5432. You can use a tool such as DBeaver to more easily handle / manage connections.
+
+
\ No newline at end of file
diff --git a/dev/deployment/index.html b/dev/deployment/index.html
new file mode 100644
index 000000000..de961fa69
--- /dev/null
+++ b/dev/deployment/index.html
@@ -0,0 +1,90 @@
+Deployment | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
Deployment of CISA Crossfeed is done automatically through GitHub Actions from the cisagov/crossfeed GitHub repository.
+
Any code pushed to the master branch is automatically deployed to the staging site, and any code pushed to the production branch is automatically deployed to the production site.
+
Environments are configured to ensure that only specific users with the appropriate permissions can trigger workflows on GitHub Actions or access secrets that perform deployments. At the moment, GitHub Actions jobs that deploy to staging and prod or access credentials for those AWS environments must be manually approved.
+
Setting up automatic deployment
+
To set up automatic deployment to your own AWS environment, you must first create an IAM user with enough permissions to the right resources on AWS. Then, set the GitHub repository's secrets AWS_ACCESS_KEY and AWS_SECRET_KEY to the access credentials of this user.
+
Manual deployment steps
+
Here are instructions on how to deploy the different components of Crossfeed manually.
+
Infrastructure
+
Infrastructure is managed by Terraform. To deploy to staging, run:
+
cd infrastructure
+make init
+make plan
+make apply
+
Backend
+
The backend API is managed by the Serverless Framework. To deploy, run:
+
cd backend
+npx sls create_domain --stage=staging
+npx sls deploy --stage=staging
+
To change the environment variables used to build the backend, edit env.yaml. Most of these
+variables are set through SSM variables (which should be set manually / through Terraform -- see below),
+but some of these variables are hard-coded and configurable by just editing env.yaml.
+
Worker
+
Deploying the worker involves building the Docker image and pushing it to ECR:
+
cd backend
+npm run deploy-worker
+
If the worker_ecs_repository_url output from Terraform changes, you will need to modify ./src/tools/deploy-worker.sh.
+
Frontend
+
Deploying the frontend involves building the React code, uploading it to an S3 bucket, then invalidating the Cloudfront cache:
+
cd frontend
+cp stage.env .env
+npm run build
+aws s3 sync build/ s3://staging.crossfeed.cyber.dhs.gov --delete
+
+
\ No newline at end of file
diff --git a/dev/frontend/index.html b/dev/frontend/index.html
new file mode 100644
index 000000000..035569032
--- /dev/null
+++ b/dev/frontend/index.html
@@ -0,0 +1,136 @@
+Frontend | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
The frontend is built in React. The code can be found in the frontend directory.
+When running Crossfeed locally, the frontend is served from the container
+crossfeed_frontend_1. We use the following technologies
+on the frontend:
+
+
React
+
AWS Cognito
+
AWS Amplify
+
Elastic Search UI
+
Material UI
+
+
Directory structure
+
The src folder contains all the React components.
+
Some React components contain tests, which are located in the __tests__ directory.
+
Configuration
+
To configure properties on the frontend (such as Cognito user pool settings), you can modify
+all environment variables beginning with REACT_APP_, which are accessbile to the frontend.
+
If you are running Crossfeed locally, you can just modify these variables in .env in the root
+directory. If you need to configure the frontend for deployment, you should update the
+prod.env and stage.env files.
+
Here is a list of all environment variables:
+
+
+
+
Name
+
Description
+
Sample value
+
+
+
+
+
REACT_APP_API_URL
+
URL for REST API
+
https://api.staging.crossfeed.cyber.dhs.gov
+
+
+
REACT_APP_FARGATE_LOG_GROUP
+
Fargate log group (used for linking to the logs of ScanTasks)
+
crossfeed-staging-worker
+
+
+
REACT_APP_USE_COGNITO
+
Set to use cognito, unset to use login.gov
+
1
+
+
+
REACT_APP_USER_POOL_ID
+
Cognito user pool ID
+
us-east-1_uxiY8DOum
+
+
+
REACT_APP_USER_POOL_CLIENT_ID
+
Cognito user pool client ID
+
1qf4cii9v0t9hn1hnr54f2ao0j
+
+
+
REACT_APP_TERMS_VERSION
+
TOS version
+
1
+
+
+
REACT_APP_COOKIE_DOMAIN
+
Cookie domain (stores JWT, used to access Matomo)
+
staging.crossfeed.cyber.dhs.gov
+
+
+
REACT_APP_TOTP_ISSUER
+
TOTP issuer (shows up as the default name of the credential in a 2FA app)
+
Staging Crossfeed
+
+
+
+
Authentication
+
We use the AWS Amplify library to make REST API calls.
+
When a user signs in, we store the JWT for that user in the token variable in localStorage. This JWT is
+passed to all REST API endpoint calls. We do not support refresh tokens at the moment.
+
Search UI
+
We use the @elastic/react-search-ui library to power our Search UI.
+Most of the integration with this library can be found in the SearchProvider component.
+
+
\ No newline at end of file
diff --git a/dev/guidelines/index.html b/dev/guidelines/index.html
new file mode 100644
index 000000000..aba29d53f
--- /dev/null
+++ b/dev/guidelines/index.html
@@ -0,0 +1,71 @@
+Contribution Guidelines | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
Ensure the pull request updates automated tests,
+especially if it involves backend or API changes.
+
This project is in the public domain within the United States, and
+copyright and related rights in the work worldwide are waived through
+the CC0 1.0 Universal public domain
+dedication.
+All contributions to this project will be released under the CC0
+dedication. By submitting a pull request, you are agreeing to comply
+with this waiver of copyright interest.
+
+
+
\ No newline at end of file
diff --git a/dev/own-instance/index.html b/dev/own-instance/index.html
new file mode 100644
index 000000000..9acf188fd
--- /dev/null
+++ b/dev/own-instance/index.html
@@ -0,0 +1,151 @@
+
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
When you create your own instance of Crossfeed, you can customize many aspects of how it looks. The dev.env.example file contains a full list of all customizable variables.
+
To deploy Crossfeed for the first time in a fresh AWS environment, you need to do a couple of things:
+
+
Set up a custom domain for the frontend and create an ACM certificate for it
+
Set up authentication mechanism (Cognito or login.gov) Generate a login.gov RSA key
+
Set initial SSM variables
+
Configure User Agent and request signing
+
Configure other environment variables
+
+
Set up a custom domain for the frontend
+
Pick a custom domain for your frontend and create an ACM certificate for your domain. Then, set the frontend_domain and frontend_cert_arn variables in infrastructure/stage.tfvars and infrastructure/prod.tfvars accordingly.
+
Set up authentication mechanism (Cognito or login.gov)
+
Choose between using Cognito or login.gov. login.gov can only be used if you are
+a government agency, so you'll most likely just want to use Cognito.
+
Cognito setup
+
You can perform these Cognito setup steps after the user pools have been created after you first run Terraform (mentioned below).
In backend/env.yml, frontend/stage.env, and frontend/prod.env, remove the lines that set the USE_COGNITO or REACT_APP_USE_COGNITO environment variables. Both variables must be unset for login.gov authentication to be used!
+
Run the following to generate a login.gov RSA key (preferably in a non-git directory outside of crossfeed!):
Visit the Login.gov sandbox dashboard to create a login.gov application, providing cert.pem as the public certificate. Copy the contents of private.jwk to use as your LOGIN_GOV_JWT_KEY, which is stored in SSM in the next step.
+
Set initial SSM variables
+
First, make sure you set the following SSM variables manually through the AWS Console (replace staging with prod as needed). Make sure these variables are set as "SecureString":
+
+
/crossfeed/staging/DATABASE_USER
+
/crossfeed/staging/DATABASE_PASSWORD
+
/crossfeed/staging/APP_JWT_SECRET
+
/crossfeed/staging/REACT_APP_TERMS_VERSION
+
+
Optional variables:
+
+
/crossfeed/staging/WORKER_USER_AGENT
+
/crossfeed/staging/WORKER_SIGNATURE_PUBLIC_KEY
+
/crossfeed/staging/WORKER_SIGNATURE_PRIVATE_KEY
+
/crossfeed/staging/CENSYS_API_ID
+
/crossfeed/staging/CENSYS_API_SECRET
+
/crossfeed/staging/SHODAN_API_KEY
+
/crossfeed/staging/HIBP_API_KEY
+
/crossfeed/staging/SIXGILL_CLIENT_ID
+
/crossfeed/staging/SIXGILL_CLIENT_SECRET
+
/crossfeed/staging/PE_SHODAN_API_KEYS
+
/crossfeed/staging/LG_API_KEY
+
/crossfeed/staging/LG_WORKSPACE_NAME
+
/crossfeed/staging/LOGIN_GOV_REDIRECT_URI
+
/crossfeed/staging/LOGIN_GOV_BASE_URL
+
/crossfeed/staging/LOGIN_GOV_JWT_KEY
+
/crossfeed/staging/LOGIN_GOV_ISSUER
+
+
Use Terraform
+
Run cd infrastructure. Then, create a new bucket on S3 that can be used to store terraform state; make sure the bucket is private, bucket versioning is enabled, and server-side encryption is enabled. Then run cp stage.config .env and change the variables in .env to use this bucket name.
+
Make sure you configure the default AWS profile using aws configure , or set the AWS_PROFILE environment variable in .env.
aws iam create-service-linked-role --aws-service-name es.amazonaws.com
+
Then run:
+
make init
+make plan
+make apply
+
Configure User Agent and request signing
+
Crossfeed's workers, when performing requets, can optionally send a User Agent identifying the requestor as Crossfeed
+and a Signature header to verify that Crossfeed is performing the request.
+
To do this, you can set the WORKER_USER_AGENT, the WORKER_SIGNATURE_PUBLIC_KEY, and the WORKER_SIGNATURE_PRIVATE_KEY parameters in your env file:
+
WORKER_USER_AGENT="Crossfeed (Test request from Crossfeed Staging Environment, for development use only. For more information, see https://github.com/cisagov/crossfeed)"
+WORKER_SIGNATURE_PUBLIC_KEY="public key, can have newlines"
+WORKER_SIGNATURE_PRIVATE_KEY="private key, can have newlines"
+
Note that when deploying Crossfeed to AWS, the worker signature public and private keys should also be set as SSM secrets (such as /crossfeed/staging/WORKER_SIGNATURE_PUBLIC_KEY and /crossfeed/staging/WORKER_SIGNATURE_PRIVATE_KEY).
+
Generating RSA keys
+
The public and private key values can be generated by running:
The public key is the value of test_key.pem and the private key is the value of test_key.
+
Verifying a request
+
One can then verify that requests are coming from Crossfeed by providing you with the following parts of the request:
+
+
Value of the Date header
+
Value of the Signature header
+
Request method
+
Request URL
+
+
You can call the SignRequests.verify_signature method (found in backend/worker/mitmproxy_sign_requests.py) to verify a signature with
+the above four parts of a request. Crossfeed will later have an admin UI that allows admins to run this check directly from the web interface.
+
Configure other environment variables
+
The full list of configurable environment variables are provided in .env (used in local development), frontend/stage.env, frontend/prod.env, and backend/env.yml. Additionally, more settings from the Terraform end are stored in infrastructure/stage.tfvars and infrastructure/prod.tfvars.
+
+
\ No newline at end of file
diff --git a/dev/pe/index.html b/dev/pe/index.html
new file mode 100644
index 000000000..d75670e99
--- /dev/null
+++ b/dev/pe/index.html
@@ -0,0 +1,92 @@
+
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
+
+
\ No newline at end of file
diff --git a/dev/quickstart/index.html b/dev/quickstart/index.html
new file mode 100644
index 000000000..ef8b94cff
--- /dev/null
+++ b/dev/quickstart/index.html
@@ -0,0 +1,177 @@
+Quickstart | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
Start the entire environment from the root directory:
+
npm start
+
+
+
Generate the initial DB schema and populate it with sample data:
+
cd backend
+# Generate schema
+npm run syncdb
+# Populate sample data
+npm run syncdb -- -d populate
+
If you ever need to drop and recreate the database, you can run npm run syncdb -- -d dangerouslyforce.
+
+
+
Navigate to http://localhost in a browser. The first time please navigate to http://localhost/signup to create account. Local accounts can be set to Global Admin to aide in development.
+
+
+
Hot reloading for source files is enabled, but after changes to non-source code files stopping and starting Docker Compose is required. The following are examples of changes that will require restarting the environment:
+
+
Frontend or backend dependency changes
+
Backend changes to serverless.yml or env.yml
+
Environment variables in root .env
+
+
+
+
Install Prettier in your dev environment to format code on save.
+
+
+
Running tests
+
To run tests, first make sure you have already started Crossfeed with npm start (or, at bare minimum, that the database container is running). Then run:
+
cd backend
+npmtest
+
If snapshot tests fail, update snapshots by running npm test -- -u.
+
To run tests for the subset of worker code that is written in Python, you need to run:
+
pip install-r worker/requirements.txt
+pytest
+
To view a code coverage report (a minimum code coverage threshold is checked in CI), run npm test -- --collectCoverage. You can then view a HTML coverage report in the coverage/lcov-report directory.
+
Monitoring Docker containers
+
To see which Docker containers are running, you can run:
+
dockerps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+2a155c5bb9ce crossfeed_backend "docker-entrypoint.s…"13 minutes ago Up 13 minutes 0.0.0.0:3000->3000/tcp crossfeed_backend_1
+0177dff83a80 docker.elastic.co/elasticsearch/elasticsearch:7.9.0 "/tini -- /usr/local…"13 minutes ago Up 13 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp crossfeed_es_1
+c0f3dee36d5e crossfeed_frontend "docker-entrypoint.s…"13 minutes ago Up 13 minutes 0.0.0.0:80->3000/tcp crossfeed_frontend_1
+f3491e1b547e matomo:3.14.1 "/entrypoint.sh apac…"13 minutes ago Up 13 minutes 80/tcp crossfeed_matomo_1
+c3ed457a71d2 postgres:latest "docker-entrypoint.s…"13 minutes ago Up 13 minutes 0.0.0.0:5432->5432/tcp crossfeed_db_1
+98c14a4f8886 mariadb:10.5 "docker-entrypoint.s…"13 minutes ago Up 13 minutes 3306/tcp crossfeed_matomodb_1
+9f70dbdbe867 crossfeed_docs "docker-entrypoint.s…"13 minutes ago Up 13 minutes 0.0.0.0:4000->4000/tcp crossfeed_docs_1
+746956c514ed bitnami/minio:2020.9.26 "/opt/bitnami/script…"13 minutes ago Up 13 minutes 0.0.0.0:9000->9000/tcp crossfeed_minio_1
+
You can then check the logs of a particular container by specifying a container's name with the docker logs command. For example:
+
docker logs crossfeed_backend_1 --follow
+
Further information
+
To see more information about the design and development of each component of Crossfeed,
+see the following links:
The documentation files are stored in the docs directory and served from a Gatsby site. To work on this, you should run npm start from before. You can then open up http://localhost:4000 in your browser to view the docs.
+
The docs are based on the federalist-uswds-gatsby theme. See that repository for more information on additional theme customizations that can be done.
+
Common Issues
+
+
Node Error issue occurs due to "npm install"
+
+
npm ERR! code EBADENGINE
+ npm ERR! engine Unsupported engine
+ npm ERR! engine Not compatible with your version of node/npm: crossfeed-backend@1.0.0
+ npm ERR! notsup Not compatible with your version of node/npm: crossfeed-backend@1.0.0
+ npm ERR! notsup Required: {"node":">=16.0.0 <17.0.0"}
+ npm ERR! notsup Actual: {"npm":"9.5.0","node":"v18.14.2"}
+
+ npm ERR! A complete log of this run can be found in:
+ npm ERR! /Users/combsc/.npm/_logs/2023-03-10T20_01_15_851Z-debug-0.log
+
In this case install nvm for nodes 16.0.0 to 17.0.0.
+for example nvm install 16.19.0 then check it by node -- version and npm -- version
+
+
Sometimes you may get an error in package-lock.json. This error is due to the package downloading the docker build. Remove the package-lock.json file and reinstall it using npm install.
+
+
rm package-lock.json
+ npminstall
+
If successful then continue to step 3.
+
+
Permission Issue / Permissions not permitted / Operation not permitted / Module build Failed
+
+
Failed to compile.
+ crossfeed-frontend-1 |
+ crossfeed-frontend-1 | Error: EPERM: operation not permitted, open'/app/src/index.tsx'
+ crossfeed-frontend-1 | ERROR in ./src/index.tsx
+ crossfeed-frontend-1 | Module build failed (from ./node_modules/source-map-loader/dist/cjs.js):
+ crossfeed-frontend-1 | Error: EPERM: operation not permitted, open'/app/src/index.tsx'
+ crossfeed-frontend-1 |
+ crossfeed-frontend-1 | ERROR in[eslint] EPERM: operation not permitted, open'/app/src/index.tsx'
+ crossfeed-frontend-1 |
+ crossfeed-frontend-1 | webpack compiled with 2 errors
+ crossfeed-frontend-1 | No issues found.
+
If you receive the above error check the following:
+
system settings > Privacy & Security > Files and Folder >"Find Docker"> click on Docker > Under Documents Folder ensure its on by swipping right and showing blue icon.
+
+
\ No newline at end of file
diff --git a/dev/rest-api/index.html b/dev/rest-api/index.html
new file mode 100644
index 000000000..744e46e8b
--- /dev/null
+++ b/dev/rest-api/index.html
@@ -0,0 +1,92 @@
+REST API | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
The REST API is built using Express. The code can be found in the backend directory.
+When running Crossfeed locally, the REST API is served from the container
+crossfeed_backend_1. We use the following technologies
+on the backend:
+
+
Express
+
TypeScript
+
Serverless Framework
+
TypeORM
+
+
Directory structure
+
The src folder contains all the code for the REST API. Most endpoints are located
+within the src/api directories, while database models are in the src/models directory.
+
Most endpoints have tests, which are located in the test directory.
+
The serverless.yml file contains configuration for REST API deployment. The REST API
+is deployed as a single lambda function that serves multiple routes through API Gateway
+and Express.
+
Configuration
+
To configure properties for the REST API, you can modify
+environment variables in .env in the root directory.
+
If you need to configure the REST API for deployment, you should update the
+env.yml file. You may also need to update parameters in AWS SSM, as several
+environment variables use values that are stored in SSM.
+
+
+
Authentication
+
Once a user logs in either with Cognito or login.gov, they call the /auth/callback on the REST API
+with their credential from either provider.
+
The REST API then verifies the credential and issues the user a JWT. The user uses this server-provided JWT
+to authenticate any future requests to the Crossfeed API by passing the JWT in the Authorization header.
+
One can also pass an API Key in the Authorization header when accessing the REST API programmatically. For more details, see API Reference.
+
+
\ No newline at end of file
diff --git a/dev/search/index.html b/dev/search/index.html
new file mode 100644
index 000000000..df3dc2007
--- /dev/null
+++ b/dev/search/index.html
@@ -0,0 +1,117 @@
+Search | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
The worker is what runs scans. The code can be found in the backend directory.
+
When running Crossfeed locally, the Elasticsearch cluster is run as the
+crossfeed_es_1 Docker container. When deployed, we run an Elasticsearch cluster managed
+by Amazon Elasticsearch Service.
+
Directory structure
+
The file tasks/es-client.ts handles the task of interfacing with the Elasticsearch cluster.
+
Configuration
+
To configure properties for Elasticsearch, you can modify
+environment variables in .env in the root directory.
+
If you need to configure Elasticsearch for deployment, you should update the
+env.yml file. You may also need to update parameters in AWS SSM, as several
+environment variables use values that are stored in SSM.
+
+
+
Kibana
+
Kibana is a tool that helps visualize and query data that is stored
+in Elasticsearch. By default, Kibana is disabled because it adds a lot of overhead to local
+development and isn't required for normally running Crossfeed locally.
+
If you want to view a local version of Kibana (if you, for example, want to inspect the data of the
+local Elasticsearch instance), you should first uncomment the "kib" section of docker-compose.yml,
+re-launch Crossfeed, and then navigate to http://localhost:5601.
+
Syncing with the database
+
All data is populated to the database by other scans, and synchronization between the database and Elasticsearch is done by the searchSync scan.
+
The searchSync scan retrieves all domains / services / vulnerabilities / webpages that need to be synced to Elasticsearch, then bulk
+uploads them to Elasticsearch. Afterwards, it sets the syncedAt column on these entities so that they will not be synced again in the future,
+until they are updated by other scans.
+
Indexes and mapping
+
We use a single index called "domains"; its name might change due to reindexing, so the current name is stored as the DOMAINS_INDEX constant in es-client.ts.
+
The domain index has a mapping. In order to create or update the mapping, you can run npm run syncdb from the backend directory. This calls
+the ESClient.syncDomainsIndex(), which will update the index's mapping if it exists, or create a new index if it doesn't exist.
+
Both services and vulnerabilities are stored with the
+nested field type. This means that they are all stored on the same domain
+document, and adding services / vulnerabilities will require updating / reindexing of an entire domain document.
+
However, webpages are stored with the join field type. This means
+that each webpage is stored as a separate document in the "domains" index, but contains a value for the parent_join field that indicates that
+that webpage is a child of another domain document. This makes it more efficient to add or remove single webpages, since it doesn't require
+reindexing all the webpages for a given domain.
+
So that the webpage fields don't conflict with fields in regular parent domain records, fields in webpage records are stored with the
+webpage_ prefix
+(see schema here).
+
Building search queries
+
The search query is built by the buildRequest function on the frontend. As of now, the logic there roughly corresponds to:
+
(
+ (
+ (has a domain matching query) OR
+ (has a webpage with body matching query)
+ )
+ AND (matches filters)
+)
+
Search results are individual domains, but they may contain snippets of webpage bodies if they contain the webpage content. For example:
+
![search result](./img/search result.png)
+
Webpage scraping
+
Webpage scraping is done by the webscraper scan. This scan uses the scrapy Python library to follow and scrape all links, observing
+rate limits and respecting robots.txt as well.
+
When a webpage is scraped, basic information such as the URL and status code are stored in the database through the Webpage model. However,
+webpage contents and headers are not stored in the database; instead, they are directly uploaded to Elasticsearch.
+
+
\ No newline at end of file
diff --git a/dev/worker/index.html b/dev/worker/index.html
new file mode 100644
index 000000000..29a4f539e
--- /dev/null
+++ b/dev/worker/index.html
@@ -0,0 +1,128 @@
+Worker | Crossfeed
An official website of the United States government
Here’s how you know
The .gov means it’s official. Federal government websites often end in .gov or .mil. Before sharing sensitive information, make sure you’re on a federal government site.
The site is secure. The https:// ensures that you are connecting to the official website and that any information you provide is encrypted and transmitted securely.
The worker is what runs scans. The code can be found in the backend directory.
+
When running Crossfeed locally, instances of the worker are launched as Docker containers
+by the scheduler. When deployed, every worker instance is launched as a
+Fargate task.
+
Directory structure
+
The src/tasks folder contains the code for every scan that the worker supports. src/worker.ts
+is the main JavaScript entrypoint for the worker, which picks the right scan to run and runs it.
+
The Dockerfile.worker file contains the code required to download the right dependencies
+and launch the worker file. It launches worker/worker-entry.sh, which sets up MITMProxy
+to sign worker requests and then starts the JavaScript worker entrypoint (src/worker.ts).
+
The file infrastructure/worker.tf contains the Fargate task definition used to launch
+the worker and the ECR repository used to store the worker's built Dockerfile.
+
The file tasks/scheduler.ts handles scheduling workers based on existing Scans that
+have been configured on Crossfeed.
+
The file tasks/ecs-client.ts handles the task of actually launching workers,
+interfacing with the Docker API (if local) or the AWS ECS API (if launching on Fargate).
+
Configuration
+
To configure properties for the worker, you can modify
+environment variables in .env in the root directory.
+
If you need to configure the worker for deployment, you should update the
+env.yml file. You may also need to update parameters in AWS SSM, as several
+environment variables use values that are stored in SSM.
+
+
+
Scheduling
+
The Scan model represents a scheduled scan that is run on all organizations.
+A scan can be of multiple types -- for example, amass , or findomain .
+
The lambda function scheduler.ts goes through each organization and sees which scans
+need to be run based on their schedule and when they were last run on a particular organization.
+
ScanTask
+
The ScanTask model represents a single scan task on a single organization and stores the status
+and errors, if any, of that particular task.
+
When a scan is run, a ScanTask model is created, which launches a Fargate task. When the worker runs, it
+connects to the database and updates its ScanTask's status accordingly.
+
All information needed for the scan (defined in the CommandOptions interface) is specified
+through the CROSSFEED_COMMAND_OPTIONS environment variable. Other secrets needed for the Fargate
+task to run are specified in the task configuration through Terraform.
+
You can view the most recent Scan Tasks, as well as their logs, on the "Scan History" page:
+
![scan tasks](./img/scan tasks.png)
+
ScanTask status reference
+
+
created : model is created
+
queued : Fargate capacity has been reached, so the task will run whenever there is available capacity.
+
requested : a request to Fargate has been sent to start the task
+
started : the Fargate container has started running the task
+
finished : the Fargate container has finished running the task
+
failed : any of the steps above have failed
+
+
Running scans locally
+
In order to run scans locally or work on scanning infrastructure,
+you will need to set up the Fargate worker and rebuild it periodically
+when worker code changes.
+
Building the worker Docker image
+
Each time you make changes to the worker code, you should run the following command to re-build the worker docker image:
+
npm run build-worker
+
Running workers locally
+
To run a worker locally, just create a scan from the Crossfeed UI.
+When running locally, the scheduler function runs every 30 seconds, for convenience, so it will
+start your worker soon. To manually trigger a run immediately, click on the "Manually run scheduler" button on the Scans page.
+
Once a worker has started, it is accessible as a running Docker container.
+You can examine it by running docker ps or ( docker ps -a | head -n 3 for stopped workers ) to view Docker containers.
+and check its logs with docker logs [containername] .
+
You can check the scheduler logs locally by checking the backend container logs.
+
Generating censys types
+
The censysIpv4.ts and censysCertificates.ts type files in the backend/src/models/generated files have been
+automatically generated from Censys's published schemas. If you need to re-generate these type files, run: