tecitheme 0.9.1 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PageNav.svelte +1 -1
- package/dist/components/PartnersList.svelte +228 -0
- package/dist/components/PartnersList.svelte.d.ts +23 -0
- package/dist/layouts/blocks.svelte +2 -0
- package/dist/partners.d.ts +34 -0
- package/dist/partners.js +38 -0
- package/dist/partners.json +723 -0
- package/package.json +1 -1
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
</button>
|
|
81
81
|
|
|
82
82
|
<!-- Desktop Nav Icon-->
|
|
83
|
-
<div class="hidden
|
|
83
|
+
<div class="hidden md:flex md:flex-shrink-0">
|
|
84
84
|
<a href={logo_link_url} class="flex">
|
|
85
85
|
<span class="sr-only">{logo_alt_text}</span>
|
|
86
86
|
<Icon classes="h-10 w-auto" icon={logo} />
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { filter_partners, get_supported_regions } from "../partners";
|
|
3
|
+
import { fade, slide } from "svelte/transition";
|
|
4
|
+
import { cubicIn, cubicOut } from "svelte/easing";
|
|
5
|
+
import Icon from "./Icon.svelte";
|
|
6
|
+
import HeadingCentered from "./HeadingCentered.svelte";
|
|
7
|
+
|
|
8
|
+
export let data;
|
|
9
|
+
let {name, product} = data;
|
|
10
|
+
|
|
11
|
+
//List of all partners for the specified product
|
|
12
|
+
let partners = filter_partners(product, []).partners;
|
|
13
|
+
|
|
14
|
+
//For tracking which List items are expaned
|
|
15
|
+
let expanded = {};
|
|
16
|
+
partners.forEach(partner => expanded[partner.name] = false);
|
|
17
|
+
|
|
18
|
+
//List of all known regions
|
|
19
|
+
let regions = get_supported_regions(product);
|
|
20
|
+
let regionSelector = {};
|
|
21
|
+
regions.forEach(region => regionSelector[region] = false);
|
|
22
|
+
|
|
23
|
+
let id;
|
|
24
|
+
if (name) {
|
|
25
|
+
id = encodeURIComponent(name).toLowerCase()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//Filter the list of partners again using new information
|
|
29
|
+
function refresh() {
|
|
30
|
+
let selectedRegions = Object.entries(regionSelector).filter(([_, v]) => v).map(([region, _]) => region);
|
|
31
|
+
partners = filter_partners(product, selectedRegions).partners;
|
|
32
|
+
}
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<div id={id} class="flex flex-col space-y-12 py-6">
|
|
36
|
+
|
|
37
|
+
<div id={id} class="flex w-full sm:space-x-6">
|
|
38
|
+
|
|
39
|
+
<!-- Region Filter -->
|
|
40
|
+
<div class="hidden md:block sticky py-5 flex-shrink-0 px-6 overflow-y-scroll max-h-96 top-20 overscroll-contain max-w-xs">
|
|
41
|
+
<fieldset>
|
|
42
|
+
<!-- Title -->
|
|
43
|
+
<legend class="text-base font-semibold leading-6 text-gray-900">Regions</legend>
|
|
44
|
+
|
|
45
|
+
<!-- Regions List -->
|
|
46
|
+
<div class="mt-4 divide-y divide-gray-200 border-b border-t border-gray-200">
|
|
47
|
+
{#each regions as region}
|
|
48
|
+
<div class="relative flex items-start py-4">
|
|
49
|
+
<div class="min-w-0 flex-1 text-sm leading-6">
|
|
50
|
+
<label for={region} class="select-none font-medium text-gray-900 overflow-ellipsis">{region}</label>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="ml-3 flex h-6 items-center">
|
|
53
|
+
<input
|
|
54
|
+
id={region}
|
|
55
|
+
name={region}
|
|
56
|
+
type="checkbox"
|
|
57
|
+
class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600"
|
|
58
|
+
on:change={(e) => {
|
|
59
|
+
regionSelector[region] = e.target.checked;
|
|
60
|
+
refresh();
|
|
61
|
+
}}
|
|
62
|
+
>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
{/each}
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
</fieldset>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<!-- Partners list-->
|
|
72
|
+
<ul
|
|
73
|
+
role="list"
|
|
74
|
+
class="divide-y divide-gray-100 mx-auto w-full"
|
|
75
|
+
>
|
|
76
|
+
{#each partners as partner}
|
|
77
|
+
<!-- List Items -->
|
|
78
|
+
<li
|
|
79
|
+
class="relative py-5 hover:bg-gray-50 transform"
|
|
80
|
+
in:slide={{ duration: 250, easing: cubicOut }}
|
|
81
|
+
out:slide={{ duration: 150, easing: cubicIn }}
|
|
82
|
+
>
|
|
83
|
+
<button class="w-full" on:click={() => expanded[partner.name] = !expanded[partner.name]}>
|
|
84
|
+
<div class="px-2">
|
|
85
|
+
<div class="mx-auto flex justify-between gap-x-6">
|
|
86
|
+
|
|
87
|
+
<!-- Left Info -->
|
|
88
|
+
<div class="flex min-w-0 gap-x-4 text-left">
|
|
89
|
+
<div class="min-w-0 flex-auto">
|
|
90
|
+
|
|
91
|
+
<!-- Company Name -->
|
|
92
|
+
<p class="text-sm font-semibold leading-6 text-gray-900">
|
|
93
|
+
<span class="absolute inset-x-0 -top-px bottom-0"></span>
|
|
94
|
+
{partner.name}
|
|
95
|
+
</p>
|
|
96
|
+
|
|
97
|
+
<!-- Regions -->
|
|
98
|
+
<p class="mt-1 flex text-xs leading-5 text-gray-500">
|
|
99
|
+
{partner.regions.join(", ")}
|
|
100
|
+
</p>
|
|
101
|
+
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<!-- Right Info -->
|
|
106
|
+
<div class="flex shrink-0 items-center gap-x-4">
|
|
107
|
+
|
|
108
|
+
<!-- Label and Product Icons -->
|
|
109
|
+
<div class="hidden sm:flex sm:flex-col sm:items-end">
|
|
110
|
+
<p class="text-sm leading-6 text-gray-900">Partner</p>
|
|
111
|
+
<div class="flex space-x-2">
|
|
112
|
+
{#each partner.products as product}
|
|
113
|
+
<Icon icon={product.name.toLowerCase()} classes="h-4 w-auto"/>
|
|
114
|
+
{/each}
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<!-- Caret -->
|
|
119
|
+
<svg
|
|
120
|
+
class="ml-2 h-5 w-5 group-hover:text-gray-900 {expanded[partner.name] == true
|
|
121
|
+
? 'rotate-180 text-gray-900'
|
|
122
|
+
: 'text-gray-400'}"
|
|
123
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
124
|
+
viewBox="0 0 20 20"
|
|
125
|
+
fill="currentColor"
|
|
126
|
+
aria-hidden="true"
|
|
127
|
+
>
|
|
128
|
+
<path
|
|
129
|
+
fill-rule="evenodd"
|
|
130
|
+
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
|
131
|
+
clip-rule="evenodd"
|
|
132
|
+
/>
|
|
133
|
+
</svg>
|
|
134
|
+
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</button>
|
|
139
|
+
</li>
|
|
140
|
+
|
|
141
|
+
<!-- Expanding Info Panels -->
|
|
142
|
+
{#if expanded[partner.name]}
|
|
143
|
+
<div
|
|
144
|
+
class="flex flex-col mx-auto px-6 bg-gray-50 transform"
|
|
145
|
+
in:slide={{ duration: 250, easing: cubicOut }}
|
|
146
|
+
out:slide={{ duration: 150, easing: cubicIn }}
|
|
147
|
+
>
|
|
148
|
+
<div class="border-t border-gray-100 w-full">
|
|
149
|
+
<dl class="divide-y divide-gray-100">
|
|
150
|
+
|
|
151
|
+
<!-- Products -->
|
|
152
|
+
<div class="py-3 gap-4 sm:grid sm:grid-cols-3 sm:gap-4">
|
|
153
|
+
<dt class="text-sm mb-3 sm:mb-0 font-medium text-gray-900">Products Offered</dt>
|
|
154
|
+
<dd class="grid grid-cols-2 gap-x-12 gap-y-2 divide-solid w-full">
|
|
155
|
+
<h5 class="font-medium text-gray-900 text-sm">Product</h5>
|
|
156
|
+
<h5 class="font-medium text-gray-900 text-sm">Languages</h5>
|
|
157
|
+
{#each partner.products as prod}
|
|
158
|
+
<p class="text-sm leading-6 text-gray-700 sm:mt-0">{prod.name}</p>
|
|
159
|
+
<p class="text-sm leading-6 text-gray-700 sm:mt-0">{prod.languages.join(", ")}</p>
|
|
160
|
+
{/each}
|
|
161
|
+
</dd>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
<!-- Web -->
|
|
165
|
+
<div class="py-3 sm:grid sm:grid-cols-3 sm:gap-4">
|
|
166
|
+
<dt class="text-sm font-medium text-gray-900">Web</dt>
|
|
167
|
+
<dd class="flex flex-col">
|
|
168
|
+
{#each partner.websites as web}
|
|
169
|
+
<div class="flex flex-row space-x-4">
|
|
170
|
+
{#if web.name}
|
|
171
|
+
<a class="underline mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0 whitespace-nowrap" href={web.address}>{web.name}</a>
|
|
172
|
+
{:else}
|
|
173
|
+
<a class="underline mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0 whitespace-nowrap" href={web.address}>{web.address}</a>
|
|
174
|
+
{/if}
|
|
175
|
+
</div>
|
|
176
|
+
{/each}
|
|
177
|
+
</dd>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<!-- Email -->
|
|
181
|
+
<div class="py-3 sm:grid sm:grid-cols-3 sm:gap-4">
|
|
182
|
+
<dt class="text-sm font-medium text-gray-900">Email</dt>
|
|
183
|
+
<dd class="flex flex-col">
|
|
184
|
+
{#each partner.emails as email}
|
|
185
|
+
<div class="flex flex-row space-x-4">
|
|
186
|
+
{#if email.name}
|
|
187
|
+
<span class="underline mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0 font-medium">{email.name}:</span>
|
|
188
|
+
{/if}
|
|
189
|
+
<a class="underline mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0 whitespace-nowrap" href="mailto:{email.address}">{email.address}</a>
|
|
190
|
+
</div>
|
|
191
|
+
{/each}
|
|
192
|
+
</dd>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<!-- Phone -->
|
|
196
|
+
<div class="py-3 sm:grid sm:grid-cols-3 sm:gap-4">
|
|
197
|
+
<dt class="text-sm font-medium text-gray-900">Telephone</dt>
|
|
198
|
+
<dd class="flex flex-col">
|
|
199
|
+
{#each partner.telephones as phone}
|
|
200
|
+
<div class="flex flex-row space-x-4">
|
|
201
|
+
{#if phone.name}
|
|
202
|
+
<span class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0 font-medium">{phone.name}:</span>
|
|
203
|
+
{/if}
|
|
204
|
+
<span class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0 whitespace-nowrap">{phone.number}</span>
|
|
205
|
+
</div>
|
|
206
|
+
{/each}
|
|
207
|
+
</dd>
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
<!-- Address -->
|
|
211
|
+
<div class="py-3 sm:grid sm:grid-cols-3 sm:gap-4">
|
|
212
|
+
<dt class="text-sm font-medium text-gray-900">Address</dt>
|
|
213
|
+
<dd class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0">
|
|
214
|
+
{#each partner.address as sect}
|
|
215
|
+
{sect}<br/>
|
|
216
|
+
{/each}
|
|
217
|
+
</dd>
|
|
218
|
+
</div>
|
|
219
|
+
|
|
220
|
+
</dl>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
{/if}
|
|
224
|
+
{/each}
|
|
225
|
+
</ul>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} PartnersListProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} PartnersListEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} PartnersListSlots */
|
|
4
|
+
export default class PartnersList extends SvelteComponent<{
|
|
5
|
+
data: any;
|
|
6
|
+
}, {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
}, {}> {
|
|
9
|
+
}
|
|
10
|
+
export type PartnersListProps = typeof __propDef.props;
|
|
11
|
+
export type PartnersListEvents = typeof __propDef.events;
|
|
12
|
+
export type PartnersListSlots = typeof __propDef.slots;
|
|
13
|
+
import { SvelteComponent } from "svelte";
|
|
14
|
+
declare const __propDef: {
|
|
15
|
+
props: {
|
|
16
|
+
data: any;
|
|
17
|
+
};
|
|
18
|
+
events: {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
};
|
|
21
|
+
slots: {};
|
|
22
|
+
};
|
|
23
|
+
export {};
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import Stats from "../components/Stats.svelte";
|
|
19
19
|
import PageNav from "../components/PageNav.svelte";
|
|
20
20
|
import Testimonial from "../components/Testimonial.svelte";
|
|
21
|
+
import PartnersList from "../components/PartnersList.svelte";
|
|
21
22
|
|
|
22
23
|
let blocks = [
|
|
23
24
|
{ ref: "accordion", component: Accordion},
|
|
@@ -39,6 +40,7 @@
|
|
|
39
40
|
{ ref: "stats", component: Stats },
|
|
40
41
|
{ ref: "pageNav", component: PageNav },
|
|
41
42
|
{ ref: "testimonial", component: Testimonial },
|
|
43
|
+
{ ref: "partners", component: PartnersList },
|
|
42
44
|
];
|
|
43
45
|
|
|
44
46
|
export let data = {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type Partner = {
|
|
2
|
+
name: String;
|
|
3
|
+
regions: String[];
|
|
4
|
+
address: String[];
|
|
5
|
+
emails: {
|
|
6
|
+
name?: String;
|
|
7
|
+
address: String;
|
|
8
|
+
}[];
|
|
9
|
+
telephones: {
|
|
10
|
+
name?: String;
|
|
11
|
+
number: String;
|
|
12
|
+
}[];
|
|
13
|
+
websites: {
|
|
14
|
+
name?: String;
|
|
15
|
+
address: string;
|
|
16
|
+
}[];
|
|
17
|
+
products: {
|
|
18
|
+
name: String;
|
|
19
|
+
languages: String[];
|
|
20
|
+
}[];
|
|
21
|
+
};
|
|
22
|
+
/**Filters our list of known partners by product and region
|
|
23
|
+
*
|
|
24
|
+
* product (string): The product the user is looking to purchase
|
|
25
|
+
* region (string): Name of the region the user is looking to purchase in\
|
|
26
|
+
*/
|
|
27
|
+
export declare function filter_partners(product: string, region: string[]): {
|
|
28
|
+
"partners": Partner[];
|
|
29
|
+
};
|
|
30
|
+
/** Gets the regions supported by resellers for a product
|
|
31
|
+
*
|
|
32
|
+
* product (string): The product the customer is interested in purchasing
|
|
33
|
+
*/
|
|
34
|
+
export declare function get_supported_regions(product: string): string[];
|
package/dist/partners.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import all_partners from "./partners.json";
|
|
2
|
+
/**Filters our list of known partners by product and region
|
|
3
|
+
*
|
|
4
|
+
* product (string): The product the user is looking to purchase
|
|
5
|
+
* region (string): Name of the region the user is looking to purchase in\
|
|
6
|
+
*/
|
|
7
|
+
export function filter_partners(product, region) {
|
|
8
|
+
product = product.toLowerCase();
|
|
9
|
+
region = region.map(reg => reg.toLowerCase());
|
|
10
|
+
let partners = all_partners.partners.filter((partner) => {
|
|
11
|
+
let intersecting_regions = region.filter(reg => partner.regions.map(reg => reg.toLowerCase()).includes(reg));
|
|
12
|
+
//Partner sells the relevant product
|
|
13
|
+
return (product == "any" ? true : partner.products.map(prod => prod.name.toLowerCase()).includes(product)) &&
|
|
14
|
+
//Partner sells in the relevant region
|
|
15
|
+
(region.length == 0 ? true : intersecting_regions.length != 0);
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
partners: partners
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Gets the regions supported by resellers for a product
|
|
22
|
+
*
|
|
23
|
+
* product (string): The product the customer is interested in purchasing
|
|
24
|
+
*/
|
|
25
|
+
export function get_supported_regions(product) {
|
|
26
|
+
product = product.toLowerCase();
|
|
27
|
+
let regions = [];
|
|
28
|
+
let partners = product == "any" ?
|
|
29
|
+
all_partners.partners :
|
|
30
|
+
all_partners.partners.filter(partner => partner.products.map(prod => prod.name.toLowerCase()).includes(product));
|
|
31
|
+
partners.forEach(partner => {
|
|
32
|
+
partner.regions.forEach(region => {
|
|
33
|
+
regions.push(region);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
regions = [...new Set(regions)].sort();
|
|
37
|
+
return regions;
|
|
38
|
+
}
|
|
@@ -0,0 +1,723 @@
|
|
|
1
|
+
{
|
|
2
|
+
"partners": [
|
|
3
|
+
{
|
|
4
|
+
"name": "Aeolus Consulting",
|
|
5
|
+
"regions": ["Belgium", "Netherlands", "Luxembourg"],
|
|
6
|
+
"address": ["Kol. Begaultlaan 1A/51", "3012Leuven", "Belgium"],
|
|
7
|
+
"emails": [
|
|
8
|
+
{
|
|
9
|
+
"address": "info@aeolus-consulting.be"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"telephones": [
|
|
13
|
+
{
|
|
14
|
+
"number": "+32 (0) 496/10.94.63"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"websites": [
|
|
18
|
+
{
|
|
19
|
+
"name": "https://www.aeolus-consulting.be",
|
|
20
|
+
"address": "https://www.aeolus-consulting.be"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"products": [
|
|
24
|
+
{
|
|
25
|
+
"name": "Pyrosim",
|
|
26
|
+
"languages": ["English"]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "Pathfinder",
|
|
30
|
+
"languages": ["English"]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "Ventus",
|
|
34
|
+
"languages": ["English"]
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "Beijing HuanZhongRuiChi Technology Co., Ltd. (Reachsoft)",
|
|
40
|
+
"regions": ["China", "Hong Kong"],
|
|
41
|
+
"address": ["ROOM 1106, A3 Building, RongJingDao", "BJUT Software Park", "YiZhuang, Beijing, 100176", "China"],
|
|
42
|
+
"emails": [
|
|
43
|
+
{
|
|
44
|
+
"address": "cal@reachsoft.com.cn"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"address": "reach@reachsoft.com.cn"
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"telephones": [
|
|
51
|
+
{
|
|
52
|
+
"number": "86 1855 1855 019"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"websites": [
|
|
56
|
+
{
|
|
57
|
+
"name": "https://www.reachsoft.cn",
|
|
58
|
+
"address": "https://www.reachsoft.cn"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"products": [
|
|
62
|
+
{
|
|
63
|
+
"name": "Pyrosim",
|
|
64
|
+
"languages": ["English", "Chinese"]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "Pathfinder",
|
|
68
|
+
"languages": ["English", "Chinese"]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "Ventus",
|
|
72
|
+
"languages": ["English"]
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "Shanghai IGN Network Technology. Co.Ltd (GDI)",
|
|
78
|
+
"regions": ["China", "Hong Kong"],
|
|
79
|
+
"address": ["Venture International Park", "3A Floor, Building A, No.2679", "Hechuan Road, Minhang District", "Shanghai, 201103", "China"],
|
|
80
|
+
"emails": [
|
|
81
|
+
{
|
|
82
|
+
"address": "fjj@gdi.cn"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"address": "sales@gdi.com.cn"
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
"telephones": [
|
|
89
|
+
{
|
|
90
|
+
"name": "Telephone",
|
|
91
|
+
"number": "86 21 61022284"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "Fax",
|
|
95
|
+
"number": "86 21 51010862"
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"websites": [
|
|
99
|
+
{
|
|
100
|
+
"name": "https://www.bitmap3d.com.cn",
|
|
101
|
+
"address": "https://www.bitmap3d.com.cn"
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"products": [
|
|
105
|
+
{
|
|
106
|
+
"name": "Pyrosim",
|
|
107
|
+
"languages": ["English"]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "Pathfinder",
|
|
111
|
+
"languages": ["English"]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"name": "Ventus",
|
|
115
|
+
"languages": ["English"]
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "Recognity s.r.o.",
|
|
121
|
+
"regions": ["Czech Republic", "Slovak Republic"],
|
|
122
|
+
"address": ["Purkyňova 649/127", "Brno, 612 00", "Czech Republic"],
|
|
123
|
+
"emails": [
|
|
124
|
+
{
|
|
125
|
+
"address": "software@recognity.cz"
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"telephones": [
|
|
129
|
+
{
|
|
130
|
+
"name": "Telephone",
|
|
131
|
+
"number": "+420 737 383 389"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"websites": [
|
|
135
|
+
{
|
|
136
|
+
"name": "https://www.recognity.cz",
|
|
137
|
+
"address": "https://www.recognity.cz"
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"products": [
|
|
141
|
+
{
|
|
142
|
+
"name": "Pyrosim",
|
|
143
|
+
"languages": ["English"]
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"name": "Pathfinder",
|
|
147
|
+
"languages": ["English"]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"name": "Ventus",
|
|
151
|
+
"languages": ["English"]
|
|
152
|
+
}
|
|
153
|
+
]
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "Fire Raters",
|
|
157
|
+
"regions": ["Egypt", "Jordan", "Lebanon", "Oman", "Qatar", "Saudi Arabia", "United Arab Emirates"],
|
|
158
|
+
"address": ["5th Settlement", "Cairo", "Egypt"],
|
|
159
|
+
"emails": [
|
|
160
|
+
{
|
|
161
|
+
"address": "info@fireraters.com"
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
"telephones": [],
|
|
165
|
+
"websites": [
|
|
166
|
+
{
|
|
167
|
+
"name": "https://www.fireraters.com",
|
|
168
|
+
"address": "https://www.fireraters.com"
|
|
169
|
+
}
|
|
170
|
+
],
|
|
171
|
+
"products": [
|
|
172
|
+
{
|
|
173
|
+
"name": "Pyrosim",
|
|
174
|
+
"languages": ["English"]
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"name": "Pathfinder",
|
|
178
|
+
"languages": ["English"]
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "Ventus",
|
|
182
|
+
"languages": ["English"]
|
|
183
|
+
}
|
|
184
|
+
]
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"name": "1Point2",
|
|
188
|
+
"regions": ["France", "French Language Customers"],
|
|
189
|
+
"address": ["5 rue de la poste", "38170 Seyssinet-Pariset", "France"],
|
|
190
|
+
"emails": [
|
|
191
|
+
{
|
|
192
|
+
"address": "infos@1Point2.com"
|
|
193
|
+
}
|
|
194
|
+
],
|
|
195
|
+
"telephones": [
|
|
196
|
+
{
|
|
197
|
+
"number": "+33 (0)4 76 27 77 85"
|
|
198
|
+
}
|
|
199
|
+
],
|
|
200
|
+
"websites": [
|
|
201
|
+
{
|
|
202
|
+
"name": "https://www.1point2.com",
|
|
203
|
+
"address": "https://www.1point2.com"
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
"products": [
|
|
207
|
+
{
|
|
208
|
+
"name": "Pyrosim",
|
|
209
|
+
"languages": ["English", "French"]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"name": "Pathfinder",
|
|
213
|
+
"languages": ["English", "French"]
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"name": "Ventus",
|
|
217
|
+
"languages": ["English"]
|
|
218
|
+
}
|
|
219
|
+
]
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"name": "SIMTEGO GmbH",
|
|
223
|
+
"regions": ["Germany", "Switzerland", "Austria", "Liechtenstein"],
|
|
224
|
+
"address": ["Einsteinstr. 55", "89077 Ulm", "Germany"],
|
|
225
|
+
"emails": [
|
|
226
|
+
{
|
|
227
|
+
"address": "info@simtego.de"
|
|
228
|
+
}
|
|
229
|
+
],
|
|
230
|
+
"telephones": [
|
|
231
|
+
{
|
|
232
|
+
"number": "+49 (0)731 850702-31"
|
|
233
|
+
}
|
|
234
|
+
],
|
|
235
|
+
"websites": [
|
|
236
|
+
{
|
|
237
|
+
"name": "https://www.simtego.de",
|
|
238
|
+
"address": "https://www.simtego.de"
|
|
239
|
+
}
|
|
240
|
+
],
|
|
241
|
+
"products": [
|
|
242
|
+
{
|
|
243
|
+
"name": "Pyrosim",
|
|
244
|
+
"languages": ["English", "German"]
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"name": "Pathfinder",
|
|
248
|
+
"languages": ["English", "German"]
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"name": "Ventus",
|
|
252
|
+
"languages": ["English"]
|
|
253
|
+
}
|
|
254
|
+
]
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"name": "ELITESOFT SRL",
|
|
258
|
+
"regions": ["Greece", "Cyprus"],
|
|
259
|
+
"address": ["Rue Picard 40A", "1080 Brussels", "Belgium"],
|
|
260
|
+
"emails": [
|
|
261
|
+
{
|
|
262
|
+
"address": "info@elitesoft.eu"
|
|
263
|
+
}
|
|
264
|
+
],
|
|
265
|
+
"telephones": [
|
|
266
|
+
{
|
|
267
|
+
"number": "+32 492 832256"
|
|
268
|
+
}
|
|
269
|
+
],
|
|
270
|
+
"websites": [
|
|
271
|
+
{
|
|
272
|
+
"name": "https://www.elitesoft.eu",
|
|
273
|
+
"address": "https://www.elitesoft.eu"
|
|
274
|
+
}
|
|
275
|
+
],
|
|
276
|
+
"products": [
|
|
277
|
+
{
|
|
278
|
+
"name": "Pyrosim",
|
|
279
|
+
"languages": ["English"]
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"name": "Pathfinder",
|
|
283
|
+
"languages": ["English"]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"name": "Ventus",
|
|
287
|
+
"languages": ["English"]
|
|
288
|
+
}
|
|
289
|
+
]
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"name": "Shiretechnik Solutions",
|
|
293
|
+
"regions": ["India", "Bangladesh", "Sri Lanka", "Nepal", "Bhutan", "Myanmar"],
|
|
294
|
+
"address": ["No. 166, 5th Main K.E.B layout", "Sanjaynagar, Bangalore", "Karnataka", "India, Pin - 560 094"],
|
|
295
|
+
"emails": [
|
|
296
|
+
{
|
|
297
|
+
"address": "contact@shiretechnik.com"
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
"telephones": [
|
|
301
|
+
{
|
|
302
|
+
"name": "Mobile",
|
|
303
|
+
"number": "+91-9620031209"
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
"name": "Office",
|
|
307
|
+
"number": "+91-80-41149803"
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
"websites": [
|
|
311
|
+
{
|
|
312
|
+
"name": "https://www.shiretechnik.com",
|
|
313
|
+
"address": "https://www.shiretechnik.com"
|
|
314
|
+
}
|
|
315
|
+
],
|
|
316
|
+
"products": [
|
|
317
|
+
{
|
|
318
|
+
"name": "Pyrosim",
|
|
319
|
+
"languages": ["English"]
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"name": "Pathfinder",
|
|
323
|
+
"languages": ["English"]
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
"name": "Ventus",
|
|
327
|
+
"languages": ["English"]
|
|
328
|
+
}
|
|
329
|
+
]
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
"name": "Cantene S.r.l",
|
|
333
|
+
"regions": ["Italy", "Hungary"],
|
|
334
|
+
"address": ["Via Marco Polo 24/A", "10129 Torino", "Italy"],
|
|
335
|
+
"emails": [
|
|
336
|
+
{
|
|
337
|
+
"address": "info@cantene.it"
|
|
338
|
+
}
|
|
339
|
+
],
|
|
340
|
+
"telephones": [
|
|
341
|
+
{
|
|
342
|
+
"number": "+39 011 19707165"
|
|
343
|
+
}
|
|
344
|
+
],
|
|
345
|
+
"websites": [
|
|
346
|
+
{
|
|
347
|
+
"name": "https://www.cantene.it",
|
|
348
|
+
"address": "https://www.cantene.it"
|
|
349
|
+
}
|
|
350
|
+
],
|
|
351
|
+
"products": [
|
|
352
|
+
{
|
|
353
|
+
"name": "Pyrosim",
|
|
354
|
+
"languages": ["English", "Italian"]
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
"name": "Pathfinder",
|
|
358
|
+
"languages": ["English", "Italian"]
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"name": "Ventus",
|
|
362
|
+
"languages": ["English"]
|
|
363
|
+
}
|
|
364
|
+
]
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"name": "CAE Solutions Corporation",
|
|
368
|
+
"regions": ["Japan"],
|
|
369
|
+
"address": ["7F Shosankan", "1-3-2 Iidabashi", "Chiyoda, Tokyo", "102-0072", "Japan"],
|
|
370
|
+
"emails": [
|
|
371
|
+
{
|
|
372
|
+
"address": "sales@cae-sc.com"
|
|
373
|
+
}
|
|
374
|
+
],
|
|
375
|
+
"telephones": [
|
|
376
|
+
{
|
|
377
|
+
"name": "Telephone",
|
|
378
|
+
"number": "+81-3-3514-1506"
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"name": "Fax",
|
|
382
|
+
"number": "+81-3-3514-1507"
|
|
383
|
+
}
|
|
384
|
+
],
|
|
385
|
+
"websites": [
|
|
386
|
+
{
|
|
387
|
+
"name": "https://www.cae-sc.com",
|
|
388
|
+
"address": "https://www.cae-sc.com"
|
|
389
|
+
}
|
|
390
|
+
],
|
|
391
|
+
"products": [
|
|
392
|
+
{
|
|
393
|
+
"name": "Pyrosim",
|
|
394
|
+
"languages": ["English", "Japanese"]
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"name": "Pathfinder",
|
|
398
|
+
"languages": ["English", "Japanese"]
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"name": "Ventus",
|
|
402
|
+
"languages": ["English"]
|
|
403
|
+
}
|
|
404
|
+
]
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"name": "BasisSoft Inc.",
|
|
408
|
+
"regions": ["Korea"],
|
|
409
|
+
"address": ["3rd Floor. Iho Bldg.", "151-29 Samsung-Dong, Kangnam-Gu", "Seoul 135-876", "Korea"],
|
|
410
|
+
"emails": [
|
|
411
|
+
{
|
|
412
|
+
"address": "minsu@basis.co.kr"
|
|
413
|
+
}
|
|
414
|
+
],
|
|
415
|
+
"telephones": [
|
|
416
|
+
{
|
|
417
|
+
"name": "Telephone",
|
|
418
|
+
"number": "+82 2 571 8718"
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
"name": "Fax",
|
|
422
|
+
"number": "+82 2 572 9709"
|
|
423
|
+
}
|
|
424
|
+
],
|
|
425
|
+
"websites": [
|
|
426
|
+
{
|
|
427
|
+
"name": "https://www.basis.co.kr",
|
|
428
|
+
"address": "https://www.basis.co.kr"
|
|
429
|
+
}
|
|
430
|
+
],
|
|
431
|
+
"products": [
|
|
432
|
+
{
|
|
433
|
+
"name": "Pyrosim",
|
|
434
|
+
"languages": ["English"]
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"name": "Pathfinder",
|
|
438
|
+
"languages": ["English"]
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
"name": "Ventus",
|
|
442
|
+
"languages": ["English"]
|
|
443
|
+
}
|
|
444
|
+
]
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"name": "Kimyoung Engineering Co., Ltd",
|
|
448
|
+
"regions": ["Korea"],
|
|
449
|
+
"address": ["#505 Saehan Venture World", "113-15, Shihung-dong", "Kumcheon-gu", "Seoul 153-031", "Korea"],
|
|
450
|
+
"emails": [
|
|
451
|
+
{
|
|
452
|
+
"address": "kimyoung@epcmart.co.kr"
|
|
453
|
+
}
|
|
454
|
+
],
|
|
455
|
+
"telephones": [
|
|
456
|
+
{
|
|
457
|
+
"name": "Telephone",
|
|
458
|
+
"number": "+82-2-807-7750"
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"name": "Fax",
|
|
462
|
+
"number": "+82-2-808-6108"
|
|
463
|
+
}
|
|
464
|
+
],
|
|
465
|
+
"websites": [
|
|
466
|
+
{
|
|
467
|
+
"name": "https://www.epcmart.co.kr",
|
|
468
|
+
"address": "https://www.epcmart.co.kr"
|
|
469
|
+
}
|
|
470
|
+
],
|
|
471
|
+
"products": [
|
|
472
|
+
{
|
|
473
|
+
"name": "Pyrosim",
|
|
474
|
+
"languages": ["English", "Korean"]
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"name": "Pathfinder",
|
|
478
|
+
"languages": ["English", "Korean"]
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"name": "Ventus",
|
|
482
|
+
"languages": ["English"]
|
|
483
|
+
}
|
|
484
|
+
]
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"name": "STIGO Sp. z o.o.",
|
|
488
|
+
"regions": ["Poland", "Ukraine"],
|
|
489
|
+
"address": ["ul. Longinusa Podbipięty 29", "31-980 Kraków", "Poland"],
|
|
490
|
+
"emails": [
|
|
491
|
+
{
|
|
492
|
+
"name": "Sales",
|
|
493
|
+
"address": "biuro@stigo.com.pl"
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
"name": "Przemysław Rożek",
|
|
497
|
+
"address": "p.rozek@stigo.com.pl"
|
|
498
|
+
}
|
|
499
|
+
],
|
|
500
|
+
"telephones": [
|
|
501
|
+
{
|
|
502
|
+
"number": "+48 12 346 58 00"
|
|
503
|
+
}
|
|
504
|
+
],
|
|
505
|
+
"websites": [
|
|
506
|
+
{
|
|
507
|
+
"name": "https://www.pyrosim.pl",
|
|
508
|
+
"address": "https://www.pyrosim.pl"
|
|
509
|
+
}
|
|
510
|
+
],
|
|
511
|
+
"products": [
|
|
512
|
+
{
|
|
513
|
+
"name": "Pyrosim",
|
|
514
|
+
"languages": ["English", "Polish"]
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
"name": "Pathfinder",
|
|
518
|
+
"languages": ["English", "Polish"]
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"name": "Ventus",
|
|
522
|
+
"languages": ["English"]
|
|
523
|
+
}
|
|
524
|
+
]
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"name": "FireCat - pyrosim.ru",
|
|
528
|
+
"regions": ["Russia", "CIS", "Armenia", "Azerbaijan", "Belarus", "Georgia", "Kazakhstan", "Kyrgyzstan", "Moldova", "Russia", "Tajikistan", "Turkmenistan", "Uzbekistan"],
|
|
529
|
+
"address": ["Первомайская 66 - 4", "г. Екатеринбург, ул.", "620062", "Russia"],
|
|
530
|
+
"emails": [
|
|
531
|
+
{
|
|
532
|
+
"address": "mail@pyrosim.ru"
|
|
533
|
+
}
|
|
534
|
+
],
|
|
535
|
+
"telephones": [
|
|
536
|
+
{
|
|
537
|
+
"name": "Telephone",
|
|
538
|
+
"number": "+7 (343) 319-12-62"
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
"name": "Fax",
|
|
542
|
+
"number": "+7 (343) 319-12-62"
|
|
543
|
+
}
|
|
544
|
+
],
|
|
545
|
+
"websites": [
|
|
546
|
+
{
|
|
547
|
+
"name": "https://www.pyrosim.ru",
|
|
548
|
+
"address": "https://www.pyrosim.ru"
|
|
549
|
+
}
|
|
550
|
+
],
|
|
551
|
+
"products": [
|
|
552
|
+
{
|
|
553
|
+
"name": "Pyrosim",
|
|
554
|
+
"languages": ["English", "Russian"]
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"name": "Pathfinder",
|
|
558
|
+
"languages": ["English", "Russian"]
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
"name": "Ventus",
|
|
562
|
+
"languages": ["English"]
|
|
563
|
+
}
|
|
564
|
+
]
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"name": "SIGURA Total Fire & Building Engineering srl.",
|
|
568
|
+
"regions": ["Romania"],
|
|
569
|
+
"address": ["Str. Balta Arin nr. 4A", "Sector 3", "032623 Bucuresti", "Romania"],
|
|
570
|
+
"emails": [
|
|
571
|
+
{
|
|
572
|
+
"address": "sigura@sigura.ro"
|
|
573
|
+
}
|
|
574
|
+
],
|
|
575
|
+
"telephones": [
|
|
576
|
+
{
|
|
577
|
+
"name": "Telephone",
|
|
578
|
+
"number": "(40)-21-312.31.32"
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"name": "Fax",
|
|
582
|
+
"number": "(40)-21-314.45.37"
|
|
583
|
+
}
|
|
584
|
+
],
|
|
585
|
+
"websites": [
|
|
586
|
+
{
|
|
587
|
+
"name": "https://www.sigura.ro",
|
|
588
|
+
"address": "https://www.sigura.ro"
|
|
589
|
+
}
|
|
590
|
+
],
|
|
591
|
+
"products": [
|
|
592
|
+
{
|
|
593
|
+
"name": "Pyrosim",
|
|
594
|
+
"languages": ["English"]
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"name": "Pathfinder",
|
|
598
|
+
"languages": ["English"]
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
"name": "Ventus",
|
|
602
|
+
"languages": ["English"]
|
|
603
|
+
}
|
|
604
|
+
]
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
"name": "Building System and Diagnostics Pte. Ltd. (BSD)",
|
|
608
|
+
"regions": ["Singapore", "Malaysia", "Indonesia", "Vietnam"],
|
|
609
|
+
"address": ["22 Veerasamy Road", "Singapore 207328", "Singapore"],
|
|
610
|
+
"emails": [
|
|
611
|
+
{
|
|
612
|
+
"address": "info@bsd.com.sg"
|
|
613
|
+
}
|
|
614
|
+
],
|
|
615
|
+
"telephones": [
|
|
616
|
+
{
|
|
617
|
+
"name": "Telephone",
|
|
618
|
+
"number": "(65) 6560 0702"
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
"name": "Fax",
|
|
622
|
+
"number": "(65) 6795 0020"
|
|
623
|
+
}
|
|
624
|
+
],
|
|
625
|
+
"websites": [
|
|
626
|
+
{
|
|
627
|
+
"name": "https://www.bsd.com.sg",
|
|
628
|
+
"address": "https://www.bsd.com.sg"
|
|
629
|
+
}
|
|
630
|
+
],
|
|
631
|
+
"products": [
|
|
632
|
+
{
|
|
633
|
+
"name": "Pyrosim",
|
|
634
|
+
"languages": ["English"]
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
"name": "Pathfinder",
|
|
638
|
+
"languages": ["English"]
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
"name": "Ventus",
|
|
642
|
+
"languages": ["English"]
|
|
643
|
+
}
|
|
644
|
+
]
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"name": "iNCENDIO3D",
|
|
648
|
+
"regions": ["Spain"],
|
|
649
|
+
"address": ["Plaza de Carlos Trias Bertrán, 4", "28020 Madrid", "Spain"],
|
|
650
|
+
"emails": [
|
|
651
|
+
{
|
|
652
|
+
"address": "support@incendio3d.com"
|
|
653
|
+
}
|
|
654
|
+
],
|
|
655
|
+
"telephones": [
|
|
656
|
+
{
|
|
657
|
+
"name": "Telephone",
|
|
658
|
+
"number": "+34 644 266 881"
|
|
659
|
+
}
|
|
660
|
+
],
|
|
661
|
+
"websites": [
|
|
662
|
+
{
|
|
663
|
+
"name": "https://www.incendio3d.com",
|
|
664
|
+
"address": "https://www.incendio3d.com"
|
|
665
|
+
}
|
|
666
|
+
],
|
|
667
|
+
"products": [
|
|
668
|
+
{
|
|
669
|
+
"name": "Pyrosim",
|
|
670
|
+
"languages": ["English", "Spanish"]
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
"name": "Pathfinder",
|
|
674
|
+
"languages": ["English", "Spanish"]
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
"name": "Ventus",
|
|
678
|
+
"languages": ["English"]
|
|
679
|
+
}
|
|
680
|
+
]
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
"name": "Thunderhead Engineering Consultants, Inc.",
|
|
684
|
+
"regions": ["USA", "All Other Regions"],
|
|
685
|
+
"address": ["403 Poyntz Ave. Suite B", "Manhattan, KS 66502", "USA"],
|
|
686
|
+
"emails": [
|
|
687
|
+
{
|
|
688
|
+
"address": "sales@thunderheadeng.com"
|
|
689
|
+
}
|
|
690
|
+
],
|
|
691
|
+
"telephones": [
|
|
692
|
+
{
|
|
693
|
+
"name": "Telephone",
|
|
694
|
+
"number": "(785) 770-8511"
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
"name": "Fax",
|
|
698
|
+
"number": "(785) 770-8511"
|
|
699
|
+
}
|
|
700
|
+
],
|
|
701
|
+
"websites": [
|
|
702
|
+
{
|
|
703
|
+
"name": "https://www.thunderheadeng.com",
|
|
704
|
+
"address": "https://www.thunderheadeng.com"
|
|
705
|
+
}
|
|
706
|
+
],
|
|
707
|
+
"products": [
|
|
708
|
+
{
|
|
709
|
+
"name": "Pyrosim",
|
|
710
|
+
"languages": ["English"]
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"name": "Pathfinder",
|
|
714
|
+
"languages": ["English"]
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
"name": "Ventus",
|
|
718
|
+
"languages": ["English"]
|
|
719
|
+
}
|
|
720
|
+
]
|
|
721
|
+
}
|
|
722
|
+
]
|
|
723
|
+
}
|