Introducing Mistral Large 2411: Transforming Industries with Cutting-Edge AI Capabilities
December 14, 2024
Protect PaaS Resources With Network Security Perimeter
December 14, 2024I had been working with Elasticsearch to implement a site wide search feature and an agentic AI system that will help developers find the right information at the right time for the task at hand.
The content being searched and reasoned over is technical in nature.
To support the agent AI feature, a vector database is required. I did find an open-source Elastic connector project but could not get it to fully work without a lot of integration code.
Fortunately, just a few weeks ago, Elastic released a Vector Store connector that is compatible with Semantic Kernel.
In this blog post, I outline the steps you need to implement to use this new connector.
The following is covered:
- Creating index mapping
- Creating an object with relevant attributes to represent vector content
- Generating content embeddings
- Chunking content
- Indexing content
- Representing the search query as an array of vectors
- Running the search using the array of vectors
I did have an issue with defining mappings but found a work around. The connector is currently in preview mode so either there is an issue with it, or my original mapping implementation requires some work.
~
Creating the Index Mapping
For reference, Elasticsearch version 8.10 is used and running locally on port 9200. The following code we create a connection do this instance using the http://client.
I could not get the vector mappings configured correctly in code so hard to define them using the JSON object you can see in the code below.
private static async Task CreateIndexAsync() { // creating index example using httpclient using var hclient = new HttpClient(); // Define the Elasticsearch endpoint var uri = "http://localhost:9200/contentvectorcollection"; // Define the raw JSON mapping var mappingJson = @" { ""mappings"": { ""properties"": { ""KEY"": { ""type"": ""keyword"" }, ""DOCUMENT_URI"": { ""type"": ""text"" }, ""PARAGRAPH_ID"": { ""type"": ""text"" }, ""TEXT"": { ""type"": ""text"" }, ""TEXT_EMBEDDING"": { ""type"": ""dense_vector"", ""dims"": 1536, ""index"": true, ""similarity"": ""cosine"" } } } }"; // Create the index with raw JSON var content = new StringContent(mappingJson, Encoding.UTF8, "application/json"); var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"admin:password1")); hclient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentials); var createIndexResponse = await hclient.PutAsync(uri, content); if (createIndexResponse.StatusCode == System.Net.HttpStatusCode.OK) { Console.WriteLine("Index created successfully."); } else { Console.WriteLine($"Failed to create index: {createIndexResponse.StatusCode}"); var reply = createIndexResponse.Content.ReadAsStringAsync().Result; } }
In the code above we create a StringContent
object and define the credentials which are converted to a base 64 string. The method PutAsync
in our code creates the index.
Note the definition for the TEXT_EMBEDDING
mapping:
"TEXT_EMBEDDING": "type": "dense_vector", "dims"": 1536, "index"": true, "similarity": "cosine" }
A description of each attribute follows:
type: “dense_vector”
Specifies that this field will store dense vector data, which is commonly used for representing high-dimensional numerical data, such as embeddings generated by machine learning models (e.g., text embeddings from models like OpenAI’s CLIP or sentence transformers).
dims: 1536
Indicates the dimensionality of the vector. In this case, each vector stored in the TEXT_EMBEDDING field will have 1,536 dimensions. This matches the output size of the embedding model used to generate these vectors.
index: true
Enables indexing of the vectors for similarity search. When set to true, Elasticsearch can perform operations like nearest neighbour (KNN) search on this field.
similarity: “cosine”`
Specifies the similarity metric to use for comparing vectors during queries. Cosine similarity measures the angular similarity between vectors, making it suitable for comparing embeddings regardless of their magnitude.
Learn more about cosine similarity here.
~
Indexing Content
With the index created data can then be inserted. For reference I need to store a URL and raw HTML content. The following code does this:
private static async Task IndexDataAsync(ElasticsearchClient client, DataUploaderService dataUploader, string url, string htmlContent) { var collection = new ElasticsearchVectorStoreRecordCollection(client, "contentvectorcollection"); await collection.CreateCollectionIfNotExistsAsync(); // Load the data. var paragraphs = DataReaderService.ReadTextFromHtml(htmlContent, url); await dataUploader.GenerateEmbeddingsAndUpload(client, paragraphs); }
In the above code, the collection contentvectorcollection
will store any ingested content.
Before ingesting content, we need away for the entire HTML to be split into chunks.
Splitting documents into manageable focused pieces (chunks) is a key step when implementing for Retrieval-Augmented Generation (RAG) solutions.
It enhances retrieval efficiency, improves context relevance for generation, and enables scalable processing.
The method ReadTextFromHTML
creates the chunks. It returns a list of TextParagraph
objects You can see this here:
public static IEnumerable ReadTextFromHtml(string htmlContents, string url) { // Load the HTML document HtmlDocument htmlDoc = new HtmlDocument(); try { htmlDoc.LoadHtml(htmlContents); } catch (Exception ex) { Console.WriteLine($"Error loading HTML: {ex.Message}"); yield break; } // Start extracting text from the root node int paragraphCount = 0; foreach (var text in ExtractTextFromNode(htmlDoc.DocumentNode)) { if (!string.IsNullOrWhiteSpace(text)) { Console.WriteLine("Found text content:"); Console.WriteLine(text); Console.WriteLine(); yield return new TextParagraph { Key = Guid.NewGuid().ToString(), DocumentUri = url, ParagraphId = (++paragraphCount).ToString(), Text = text.Trim() }; } } }
For clarity, the recursive method ExtractTextFromNode
code is shown:
private static IEnumerable ExtractTextFromNode(HtmlNode node) { // Base case: If the node is a text node, return its text content if (node.NodeType == HtmlNodeType.Text) { var text = node.InnerText; if (!string.IsNullOrWhiteSpace(text)) { yield return System.Text.RegularExpressions.Regex.Replace(text, @"s+", " "); // Normalize whitespace } } // Recursive case: Traverse child nodes foreach (var child in node.ChildNodes) { foreach (var text in ExtractTextFromNode(child)) { yield return text; } } }
The returned list is of type TextParagraph
objects.
A definition of this is show below. Pay attention to the decorator attributes, these dictate the behaviour of each property in relation to the mappings defined for the vector store in the earlier section:
public class TextParagraph { ///A unique key for the text paragraph. [VectorStoreRecordKey] [Key] public required string Key { get; init; } ///A uri that points at the original location of the document containing the text. [VectorStoreRecordData] public required string DocumentUri { get; init; } ///The id of the paragraph from the document containing the text. [VectorStoreRecordData] public required string ParagraphId { get; init; } ///The text of the paragraph. [VectorStoreRecordData] public required string Text { get; init; } ///The embedding generated from the Text. [VectorStoreRecordVector(1536)] public ReadOnlyMemory TextEmbedding { get; set; } }
At this point, we have:
- defined the mappings for the index
- created the index
- a model to represent chunked content (TextParagraph)
- a method to generate chunked content from a raw HTML string
The next step is to generate upload embeddings.
~
Generate Embeddings and Upload
After generating a list of TextParagraph
objects from an input HTML string, we can index them using the method GenerateEmbeddingsAndUpload
.
The code for this method is show below:
public async Task GenerateEmbeddingsAndUpload(ElasticsearchClient elasticClient, IEnumerable textParagraphs) { foreach (var paragraph in textParagraphs) { // Generate the text embedding. Console.WriteLine($"Generating embedding for paragraph: {paragraph.ParagraphId}"); paragraph.TextEmbedding = await textEmbeddingGenerationService.GenerateEmbeddingAsync(paragraph.Text); var serializedParagraph = JsonConvert.SerializeObject(paragraph); Console.WriteLine(serializedParagraph); var response = await elasticClient.IndexAsync(paragraph, idx => idx.Index("contentvectorcollection").Id(paragraph.Key)); Console.WriteLine(); Console.WriteLine($"Indexed paragraph: {paragraph.ParagraphId}"); } }
In the above code, we loop through the list of TextParagraph
objects.
For each object in the list, we generate the embeddings for the paragraph text.
The method generate GenerateEmbeddingAsync
performs this:
paragraph.TextEmbedding = await textEmbeddingGenerationService.GenerateEmbeddingAsync(paragraph.Text);
For example, the following text embedding represents the text from content found in the following url: https://www.scichart.com/documentation/js/current/Axis%20Alignment%20-%20Create%20a%20Vertical%20Chart.html
"hits": [ { "_index": "contentvectorcollection", "_id": "9a41cf98-0ce4-46c2-aa07-05b6b2f92641", "_score": 1.0, "_source": { "KEY": "9a41cf98-0ce4-46c2-aa07-05b6b2f92641", "DOCUMENT_URI": ""https://www.scichart.com/documentation/js/current/Axis%20Alignment%20-%20Create%20a%20Vertical%20Chart.html", "PARAGRAPH_ID": "1", "TEXT": "n n n Vertical Charts (Rotate, Transpose Axis)n It is possible to create Vertical (Rotated) Charts with SciChart. This transposes the entire chart, swapping X-Axis for Y and renders series top to bottom intead of left to right. Tooltips and markers also are transposed to the final effect is like a vertical chart.rnrnAbove: The JavaScript Oil and Gas Dashboard showcase from the SciChart.js Demo, showing a use-case of transposing the X,Y axis to achieve a vertical chart, visualising well drill depth.rnrnTo achieve this, simply set axis.axisAlignment to Left or Right for X Axis and Top or Bottom for Y Axis. And that's it - SciChart takes care of the rest:rnrnrn rn Javascriptrnrn json-builderrn rnrn rn rn// Demonstrates how to configure a vertical chart in SciChart.jsrnconst {rn SciChartSurface,rn NumericAxis,rn SciChartJsNavyTheme,rn EAxisAlignment,rn HorizontalLineAnnotation,rn ELabelPlacement,rn FastLineRenderableSeries,rn XyDataSeriesrn} = SciChart;rnrn// or, for npm, import { SciChartSurface, ... } from "scichart"rnrnconst { wasmContext, sciChartSurface } = await SciChartSurface.create(divElementId, {rn theme: new SciChartJsNavyTheme()rn});rnrn// Add the xAxis to the chartrnsciChartSurface.xAxes.add(new NumericAxis(wasmContext, {rn axisTitle: "X Axis",rn axisAlignment: EAxisAlignment.Leftrn}));rnrn// Creating a NumericAxis as a YAxis on the leftrnsciChartSurface.yAxes.add(new NumericAxis(wasmContext, {rn axisTitle: "Y Axis",rn axisAlignment: EAxisAlignment.Toprn}));rnrn// Show how a line series responds to vertical chartrnconst xValues = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];rnconst yValues = xValues.map(x => Math.sin(x * 0.4));rnsciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {rn dataSeries: new XyDataSeries(wasmContext, {rn xValues,rn yValuesrn }),rn stroke: "#0066FF",rn strokeThickness: 3,rn}));rnrn// Show how a HorizontalLineAnnotation responds to vertical chartrnsciChartSurface.annotations.add(new HorizontalLineAnnotation({rn // normally we set y1 but with vertical charts, we set annotation.x1rn x1: 10,rn labelValue: "HorizontalLineAnnotation with x1 = 10",rn showLabel: true,rn stroke: "#F48420",rn strokeThickness: 2,rn labelPlacement: ELabelPlacement.TopLeftrn}));rnrn rnrn rn rn// Demonstrates how to configure a vertical chart in SciChart.js using the Builder APIrnconst {rn chartBuilder,rn EThemeProviderType,rn EAxisType,rn EAxisAlignmentrn} = SciChart;rnrn// or, for npm, import { chartBuilder, ... } from "scichart"rnrnconst xValues = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];rnconst yValues = xValues.map(x => Math.sin(x * 0.4));rnrnconst { wasmContext, sciChartSurface } = await chartBuilder.build2DChart(divElementId, {rn surface: { theme: { type: EThemeProviderType.Dark } },rn xAxes: {rn type: EAxisType.NumericAxis,rn options: {rn axisTitle: "X Axis",rn axisAlignment: EAxisAlignment.Leftrn }rn },rn yAxes: {rn type: EAxisType.NumericAxis,rn options: {rn axisTitle: "Y Axis",rn axisAlignment: EAxisAlignment.Toprn }rn },rn series: [rn {rn type: ESeriesType.LineSeries,rn options: {rn stroke: "#0066FF",rn strokeThickness: 3,rn },rn xyData: {rn xValues,rn yValuesrn }}rn ]rn});rnrn rnrnrnThis results in the following output, where the XAxis is on the left, the YAxis is on the top. The chart series is rotated automatically and now draws top to bottom, rather than left to right.rnrnrn rn<div id="scichart-root" ></div>rn rnrn rnbody { margin: 0; }rn#scichart-root { width: 100%; height: 100vh; }rn rnrn rnasync function verticalCharts(divElementId) {rn // #region ExampleArn // Demonstrates how to configure a vertical chart in SciChart.jsrn const {rn SciChartSurface,rn NumericAxis,rn SciChartJsNavyTheme,rn EAxisAlignment,rn HorizontalLineAnnotation,rn ELabelPlacement,rn FastLineRenderableSeries,rn XyDataSeriesrn } = SciChart;rnrn // or, for npm, import { SciChartSurface, ... } from "scichart"rnrn const { wasmContext, sciChartSurface } = await SciChartSurface.create(divElementId, {rn theme: new SciChartJsNavyTheme()rn });rnrn // Add the xAxis to the chartrn sciChartSurface.xAxes.add(new NumericAxis(wasmContext, {rn axisTitle: "X Axis",rn axisAlignment: EAxisAlignment.Leftrn }));rnrn // Creating a NumericAxis as a YAxis on the leftrn sciChartSurface.yAxes.add(new NumericAxis(wasmContext, {rn axisTitle: "Y Axis",rn axisAlignment: EAxisAlignment.Toprn }));rnrn // Show how a line series responds to vertical chartrn const xValues = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];rn const yValues = xValues.map(x => Math.sin(x * 0.4));rn sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {rn dataSeries: new XyDataSeries(wasmContext, {rn xValues,rn yValuesrn }),rn stroke: "#0066FF",rn strokeThickness: 3,rn }));rnrn // Show how a HorizontalLineAnnotation responds to vertical chartrn sciChartSurface.annotations.add(new HorizontalLineAnnotation({rn // normally we set y1 but with vertical charts, we set annotation.x1rn x1: 10,rn labelValue: "HorizontalLineAnnotation with x1 = 10",rn showLabel: true,rn stroke: "#F48420",rn strokeThickness: 2,rn labelPlacement: ELabelPlacement.TopLeftrn }));rnrn // #endregionrn};rnrnverticalCharts("scichart-root");rnrnrnrnrnrnasync function builderExample(divElementId) {rn // #region ExampleBrn // Demonstrates how to configure a vertical chart in SciChart.js using the Builder APIrn const {rn chartBuilder,rn EThemeProviderType,rn EAxisType,rn EAxisAlignmentrn } = SciChart;rnrn // or, for npm, import { chartBuilder, ... } from "scichart"rnrn const xValues = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];rn const yValues = xValues.map(x => Math.sin(x * 0.4));rnrn const { wasmContext, sciChartSurface } = await chartBuilder.build2DChart(divElementId, {rn surface: { theme: { type: EThemeProviderType.Dark } },rn xAxes: {rn type: EAxisType.NumericAxis,rn options: {rn axisTitle: "X Axis",rn axisAlignment: EAxisAlignment.Leftrn }rn },rn yAxes: {rn type: EAxisType.NumericAxis,rn options: {rn axisTitle: "Y Axis",rn axisAlignment: EAxisAlignment.Toprn }rn },rn series: [rn {rn type: ESeriesType.LineSeries,rn options: {rn stroke: "#0066FF",rn strokeThickness: 3,rn },rn xyData: {rn xValues,rn yValuesrn }}rn ]rn });rn // #endregionrn};rnrnrnrn// Uncomment this to use the builder examplern //builderExample("scichart-root");rnrn rnrnrnrn rnrnFlipping the Axis when Horizontal or Vertical.rnrnAn Axis may be flipped when horizontal or vertical (coordinates drawn in opposite directions) by setting the AxisCore.flippedCoordinates property.rnrnFor example, taking the code sample above, and setting xAxis.flippedCoordinates = true, we get the following result. Notice the XAxis is now drawn in reverse and the series is now drawn from bottom to top..rnrnrnrnrnrnConsiderations when using Vertical ChartsrnrnThis Flexibility of SciChart allows for some pretty interesting configurations of charts. However, here are some considerations when using a Vertical Chart.rnrnrn Tooltips, Cursors and the RolloverModifier will also be transposed (rotated 90 degrees). When applying a RolloverModifier the cursor line is usually vertical, but in a vertical chart the cursor line will be horizontal.rnrn Annotations will behave differently. For example a HorizontalLineAnnotation will still draw horizontally but instead of setting the y1 property to place on the YAxis, now you must set x1 property to place on the XAxis.rnrnrn rnrn n n See AlsonVertical (Rotated) Chart Examplernrnn n n n", "TEXT_EMBEDDING": [ -0.00260936772, -0.020350378, 0.00168717816, -0.00864184927, -0.00564914662, 0.0070210821, ………………. -0.0248158928, -0.010175189, -0.0077070496, -0.0416422784, 0.0340024829, 0.00753219519, 0.0012071688, 0.00479168678, -0.00308181113 ] } }
After we have generated embedding for any text it can be indexed, the method index async performs this:
var response = await elasticClient.IndexAsync(paragraph, idx => idx.Index("contentvectorcollection").Id(paragraph.Key));
We can verify content has been indexed by querying the Elasticsearch instance using postman:
~
Generate Embeddings for Search Query
Before executing a search, we need to implement a method that generates vectors from the search query text. The method below does this:
private static async Task<ReadOnlyMemory> GenerateVectorsFromSearchQueryText(Kernel kernel, string queryText) { Console.WriteLine("Generating embedding for query text..."); var embeddingGenerator = kernel.Services.GetRequiredService(); var queryVector = await embeddingGenerator.GenerateEmbeddingAsync(queryText); return queryVector; }
The vectorized representation of the query-text can then be used to perform a search against the vector database.
~
Run Search
The code below accepts a query vector which is used to perform a search against the vector database.:
private static async Task<Elastic.Clients.Elasticsearch.SearchResponse> QueryDataAsyncUsingVectorQuery(Kernel kernel, ReadOnlyMemory queryVector, ElasticsearchClient client) { // Perform vector search var response = await client.SearchAsync(s => s .Index("contentvectorcollection") .Knn(k => k .Field(f => f.TextEmbedding) // Specify the dense_vector field .QueryVector(queryVector.ToArray()) // Use the query vector .k(5) // Number of nearest neighbours to return .NumCandidates(10) // Number of candidates to consider ) ); // Check the response if (response.ApiCallDetails.HasSuccessfulStatusCode) { Console.WriteLine("Found search results:"); return response; } else { Console.WriteLine($"Search failed: {response.DebugInformation}"); return null; } }
The property KNN
Is responsible for setting the vector field, supplying the query vector.
Specifying the amount of neighbours to return in this instance (5) and the number of candidates to consider.
We can execute a natural language query that references the content we generated vectors for:
var vectorisedSearchTerm = await GenerateVectorsFromSearchQueryText(kernel, "create vertical charts"); var results = await QueryDataAsyncUsingVectorQuery(kernel, vectorisedSearchTerm, client); foreach (var hit in results.Hits) { Console.WriteLine($"Id: {hit.Id}, Score: {hit.Score}"); }
We get several hits:
Search results are sorted by the relevance probability score:
Several results are found:
Expanding the Source
property for shows the associated indexed/vector/document :
We can examine the text
property for the embedding in the Visual Studio debugger:
Vertical Charts (Rotate, Transpose Axis)n It is possible to create Vertical (Rotated) Charts with SciChart.
..and browse to the associated URL that we defined for vector storage:
"https://www.scichart.com/documentation/js/current/Axis%20Alignment%20-%20Create%20a%20Vertical%20Chart.html
Perfect.
You can learn more about the KNN (or known nearest neighbour) algorithm here.
~
Summary
In this blog post, we have seen how to use the Elasticsearch Vector Store Connector with Semantic Kernel.
We’ve also seen how to: creating index mappings, generating content embeddings, chunk and index content.
We saw how to represent the search query as an array of vectors and how to use this as search criteria to return indexed and vectorised data.
The concepts in this blog pave the way for you to implement a RAG AI solution using Elasticsearch vector database with Semantic Kernel.
~
Further Reading and Resources
You can learn more about Elastic, Semantic Kernel and Vector databases here:
- Elastic Vector Database – https://www.elastic.co/elasticsearch/vector-database
- Vector Connector – https://www.elastic.co/blog/microsoft-semantic-kernel-elasticsearch
- Semantic Kernel– https://learn.microsoft.com/en-us/semantic-kernel/overview/
Enjoy what you’ve read, have questions about this content, or would like to see another topic? Drop me a note below.
You can schedule a call using my Calendly link to discuss consulting and development services..fca_eoi_form{ margin: auto; } .fca_eoi_form p { width: auto; } #fca_eoi_form_560 input{ max-width: 9999px; }#fca_eoi_form_560 .fca_eoi_layout_name_field_wrapper {display: none !important;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper {float:none;margin-left:auto;margin-right:auto;}#fca_eoi_form_560 .fca_eoi_form_input_element::-webkit-input-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_form_input_element::-moz-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_form_input_element:-ms-input-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_form_input_element:-moz-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper:hover, #fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input:hover {background-color:#1e73be !important;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox {width:100%;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper {width:100%;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper {width:100%;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input {width:100%;}div.fca_eoi_form_text_element,input.fca_eoi_form_input_element,input.fca_eoi_form_button_element{display:block;margin:0;padding:0;line-height:normal;font-size:14px;letter-spacing:normal;word-spacing:normal;text-indent:0;text-shadow:none;text-decoration:none;text-transform:none;white-space:normal;width:inherit;height:inherit;background-image:none;border:none;border-radius:0;box-shadow:none;box-sizing:border-box;transition:none;outline:none;-webkit-transition:none;-webkit-appearance:none;-moz-appearance:none;color:#000;font-family:”Open Sans”, sans-serif;font-weight:normal;transition:background 350ms linear;}div.fca_eoi_form_text_element{text-align:center;}div.fca_eoi_layout_headline_copy_wrapper{font-weight:bold;}div.fca_eoi_layout_0,form.fca_eoi_layout_0{display:inline-block;}div.fca_eoi_layout_0.fca_eoi_layout_widget,form.fca_eoi_layout_0.fca_eoi_layout_widget{max-width:300px;}div.fca_eoi_layout_0.fca_eoi_layout_postbox,form.fca_eoi_layout_0.fca_eoi_layout_postbox{max-width:600px;}div.fca_eoi_layout_0.fca_eoi_layout_popup,form.fca_eoi_layout_0.fca_eoi_layout_popup{max-width:650px;}div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_field_wrapper{float:none;width:100%;}div.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper{margin:20px;}div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper{border:solid 1px transparent;width:49%;border-radius:3px;margin-bottom:10px;position:relative;}div.fca_eoi_layout_0 div.fca_eoi_layout_name_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_name_field_wrapper{float:left;box-sizing:border-box;display:inline-block;}div.fca_eoi_layout_0 div.fca_eoi_layout_email_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_email_field_wrapper{float:right;box-sizing:border-box;display:inline-block;}div.fca_eoi_layout_0 div.fca_eoi_layout_inputs_wrapper_no_name div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_inputs_wrapper_no_name div.fca_eoi_layout_field_wrapper{float:none;width:100%;}div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input,div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input:focus,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input:focus{border:none !important;width:100%;height:auto;font-size:16px;line-height:1.2em;padding:7px 0;outline:none;background:none !important;box-shadow:none;}div.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper{clear:both;transition:background 350ms linear, border-color 350ms linear;margin-left:auto;margin-right:auto;}div.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a{display:block;margin:10px 0 0;font-size:12px;}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a{font-size:13px !important;}}@media (min-width:1px) and (max-width:320px),(min-height:1px) and (max-height:320px){div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a{font-size:12px !important;}}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper{margin:8px 13px;}div.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a{margin:0;}div.fca_eoi_layout_0 div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper,form.fca_eoi_layout_0 div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper{margin-bottom:5px;}}@media (min-width:1px) and (max-width:768px){div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper{float:none;width:100%;}}div.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper{text-align:center;width:100%;}div.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper input{width:100%;border:0 !important;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox { background-color: #ffffff !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox { border-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_headline_copy_wrapper div { font-size: 25px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_headline_copy_wrapper div { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper p, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper div { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper p, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper div { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper input { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper input { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper { border-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper input { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper input { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper { border-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input { font-size: 23px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input { color: #ffffff !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input { background-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_privacy_copy_wrapper div { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_privacy_copy_wrapper div { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_fatcatapps_link_wrapper a, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_fatcatapps_link_wrapper a:hover { color: #3197e1 !important; }