Merge lp:~lmic/maas/maas19+fix-power-query-sm15k into lp:~maas-committers/maas/trunk
- maas19+fix-power-query-sm15k
- Merge into trunk
Proposed by
Larry Michel
Status: | Superseded | ||||
---|---|---|---|---|---|
Proposed branch: | lp:~lmic/maas/maas19+fix-power-query-sm15k | ||||
Merge into: | lp:~maas-committers/maas/trunk | ||||
Diff against target: |
3635 lines (+2087/-270) (has conflicts) 42 files modified
Makefile (+2/-2) contrib/maas-http.conf (+1/-1) docs/changelog.rst (+334/-58) src/maasserver/api/interfaces.py (+74/-0) src/maasserver/api/tests/test_devices.py (+135/-0) src/maasserver/api/tests/test_interfaces.py (+191/-0) src/maasserver/api/tests/test_vlans.py (+7/-0) src/maasserver/api/tests/test_volume_groups.py (+7/-0) src/maasserver/forms_subnet.py (+7/-0) src/maasserver/models/__init__.py (+23/-0) src/maasserver/models/interface.py (+54/-22) src/maasserver/models/staticipaddress.py (+5/-0) src/maasserver/models/tests/test_filesystemgroup.py (+34/-0) src/maasserver/models/tests/test_interface.py (+384/-115) src/maasserver/models/tests/test_node.py (+69/-33) src/maasserver/models/tests/test_partition.py (+4/-0) src/maasserver/models/tests/test_partitiontable.py (+21/-0) src/maasserver/models/tests/test_staticipaddress.py (+23/-0) src/maasserver/models/tests/test_virtualblockdevice.py (+34/-0) src/maasserver/static/css/maas-styles.css (+4/-0) src/maasserver/testing/factory.py (+8/-0) src/maasserver/tests/test_auth.py (+31/-0) src/maasserver/tests/test_node_constraint_filter_forms.py (+61/-0) src/maasserver/tests/test_storage_layouts.py (+80/-0) src/maasserver/utils/converters.py (+5/-0) src/maasserver/utils/orm.py (+25/-0) src/maasserver/utils/tests/test_converters.py (+43/-20) src/maasserver/websockets/handlers/tests/test_node.py (+60/-17) src/metadataserver/models/commissioningscript.py (+4/-0) src/provisioningserver/config.py (+85/-0) src/provisioningserver/drivers/power/amt.py (+11/-0) src/provisioningserver/drivers/power/dli.py (+11/-0) src/provisioningserver/drivers/power/ipmi.py (+32/-1) src/provisioningserver/drivers/power/seamicro.py (+6/-1) src/provisioningserver/drivers/power/tests/test_amt.py (+17/-0) src/provisioningserver/drivers/power/tests/test_ipmi.py (+9/-0) src/provisioningserver/rpc/dhcp.py (+4/-0) src/provisioningserver/rpc/tests/test_dhcp.py (+7/-0) src/provisioningserver/testing/config.py (+5/-0) src/provisioningserver/tests/test_cluster_config_command.py (+10/-0) src/provisioningserver/tests/test_config.py (+87/-0) utilities/remote-reinstall (+73/-0) Text conflict in docs/changelog.rst Text conflict in src/maasserver/api/interfaces.py Text conflict in src/maasserver/api/tests/test_devices.py Text conflict in src/maasserver/api/tests/test_interfaces.py Text conflict in src/maasserver/api/tests/test_vlans.py Text conflict in src/maasserver/api/tests/test_volume_groups.py Text conflict in src/maasserver/forms_subnet.py Text conflict in src/maasserver/models/__init__.py Text conflict in src/maasserver/models/interface.py Text conflict in src/maasserver/models/staticipaddress.py Text conflict in src/maasserver/models/tests/test_filesystemgroup.py Text conflict in src/maasserver/models/tests/test_interface.py Text conflict in src/maasserver/models/tests/test_node.py Text conflict in src/maasserver/models/tests/test_partition.py Text conflict in src/maasserver/models/tests/test_partitiontable.py Text conflict in src/maasserver/models/tests/test_virtualblockdevice.py Text conflict in src/maasserver/static/css/maas-styles.css Text conflict in src/maasserver/testing/factory.py Text conflict in src/maasserver/tests/test_auth.py Text conflict in src/maasserver/tests/test_node_constraint_filter_forms.py Text conflict in src/maasserver/tests/test_storage_layouts.py Text conflict in src/maasserver/utils/converters.py Text conflict in src/maasserver/utils/orm.py Text conflict in src/maasserver/utils/tests/test_converters.py Text conflict in src/maasserver/websockets/handlers/tests/test_node.py Text conflict in src/provisioningserver/config.py Text conflict in src/provisioningserver/drivers/power/amt.py Text conflict in src/provisioningserver/drivers/power/dli.py Text conflict in src/provisioningserver/drivers/power/ipmi.py Text conflict in src/provisioningserver/drivers/power/seamicro.py Text conflict in src/provisioningserver/drivers/power/tests/test_amt.py Text conflict in src/provisioningserver/drivers/power/tests/test_ipmi.py Text conflict in src/provisioningserver/rpc/dhcp.py Text conflict in src/provisioningserver/rpc/tests/test_dhcp.py Text conflict in src/provisioningserver/testing/config.py Text conflict in src/provisioningserver/tests/test_cluster_config_command.py Text conflict in src/provisioningserver/tests/test_config.py Text conflict in utilities/remote-reinstall |
||||
To merge this branch: | bzr merge lp:~lmic/maas/maas19+fix-power-query-sm15k | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
MAAS Maintainers | Pending | ||
Review via email: mp+282110@code.launchpad.net |
This proposal has been superseded by a proposal from 2016-01-10.
Commit message
Description of the change
Pass id from context (which is system id from power parameters) into seamicroclient call when querying power.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'Makefile' | |||
2 | --- Makefile 2016-01-06 14:43:50 +0000 | |||
3 | +++ Makefile 2016-01-10 08:29:39 +0000 | |||
4 | @@ -496,8 +496,8 @@ | |||
5 | 496 | # this. | 496 | # this. |
6 | 497 | 497 | ||
7 | 498 | # Old names. | 498 | # Old names. |
10 | 499 | PACKAGING := $(abspath ../packaging.trunk) | 499 | PACKAGING := $(abspath ../packaging-1.9) |
11 | 500 | PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging | 500 | PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging-1.9 |
12 | 501 | 501 | ||
13 | 502 | packaging-tree = $(PACKAGING) | 502 | packaging-tree = $(PACKAGING) |
14 | 503 | packaging-branch = $(PACKAGING_BRANCH) | 503 | packaging-branch = $(PACKAGING_BRANCH) |
15 | 504 | 504 | ||
16 | === modified file 'contrib/maas-http.conf' | |||
17 | --- contrib/maas-http.conf 2015-06-26 13:07:33 +0000 | |||
18 | +++ contrib/maas-http.conf 2016-01-10 08:29:39 +0000 | |||
19 | @@ -26,7 +26,7 @@ | |||
20 | 26 | 26 | ||
21 | 27 | <IfModule proxy_module> | 27 | <IfModule proxy_module> |
22 | 28 | ProxyPreserveHost on | 28 | ProxyPreserveHost on |
24 | 29 | ProxyPass /MAAS/ws "ws://localhost:5240/MAAS/ws" | 29 | ProxyPass /MAAS/ws "ws://localhost:5240/MAAS/ws" disablereuse=on |
25 | 30 | ProxyPass /MAAS/static/ ! | 30 | ProxyPass /MAAS/static/ ! |
26 | 31 | ProxyPass /MAAS/ http://localhost:5240/MAAS/ | 31 | ProxyPass /MAAS/ http://localhost:5240/MAAS/ |
27 | 32 | ProxyPass /MAAS http://localhost:5240/MAAS/ | 32 | ProxyPass /MAAS http://localhost:5240/MAAS/ |
28 | 33 | 33 | ||
29 | === modified file 'docs/changelog.rst' | |||
30 | --- docs/changelog.rst 2015-12-07 16:37:36 +0000 | |||
31 | +++ docs/changelog.rst 2016-01-10 08:29:39 +0000 | |||
32 | @@ -3,64 +3,340 @@ | |||
33 | 3 | ========= | 3 | ========= |
34 | 4 | 4 | ||
35 | 5 | 5 | ||
94 | 6 | 1.9.0 (RC3) | 6 | <<<<<<< TREE |
95 | 7 | ============= | 7 | 1.9.0 (RC3) |
96 | 8 | 8 | ============= | |
97 | 9 | Major bugs fixed in this release | 9 | |
98 | 10 | -------------------------------- | 10 | Major bugs fixed in this release |
99 | 11 | 11 | -------------------------------- | |
100 | 12 | LP: #1522898 "node-interface" API should just be "interface" - to allow devices to use it | 12 | |
101 | 13 | 13 | LP: #1522898 "node-interface" API should just be "interface" - to allow devices to use it | |
102 | 14 | LP: #1519527 Juju 1.25.1 proposed: lxc units all have the same IP address after upgrade from 1.7/1.8. | 14 | |
103 | 15 | 15 | LP: #1519527 Juju 1.25.1 proposed: lxc units all have the same IP address after upgrade from 1.7/1.8. | |
104 | 16 | LP: #1522294 MAAS fails to parse some DHCP leases. | 16 | |
105 | 17 | 17 | LP: #1522294 MAAS fails to parse some DHCP leases. | |
106 | 18 | LP: #1519090 DHCP interface automatically obtains an IP even when the subnet is unmanaged. | 18 | |
107 | 19 | 19 | LP: #1519090 DHCP interface automatically obtains an IP even when the subnet is unmanaged. | |
108 | 20 | LP: #1519077 MAAS assigns IP addresses on unmanaged subnets without consideration for some addresses known to be in use. | 20 | |
109 | 21 | 21 | LP: #1519077 MAAS assigns IP addresses on unmanaged subnets without consideration for some addresses known to be in use. | |
110 | 22 | LP: #1519396 MTU field is not exposed over the API for VLAN. | 22 | |
111 | 23 | 23 | LP: #1519396 MTU field is not exposed over the API for VLAN. | |
112 | 24 | LP: #1521833 Updating subnet name removes dns_server. | 24 | |
113 | 25 | 25 | LP: #1521833 Updating subnet name removes dns_server. | |
114 | 26 | LP: #1519919 CC looks for NICs with kernel module loaded and fall back doesn't check persistent device names. | 26 | |
115 | 27 | 27 | LP: #1519919 CC looks for NICs with kernel module loaded and fall back doesn't check persistent device names. | |
116 | 28 | LP: #1522225 Migration 0181 can fail on upgrade if disks across nodes have duplicate serial numbers. | 28 | |
117 | 29 | 29 | LP: #1522225 Migration 0181 can fail on upgrade if disks across nodes have duplicate serial numbers. | |
118 | 30 | LP: #1519247 Migration 0146 can fail on upgrade when migrating unmanaged subnets. | 30 | |
119 | 31 | 31 | LP: #1519247 Migration 0146 can fail on upgrade when migrating unmanaged subnets. | |
120 | 32 | LP: #1519397 [UI] Once a cache_set is created the UI fails with ERROR. | 32 | |
121 | 33 | 33 | LP: #1519397 [UI] Once a cache_set is created the UI fails with ERROR. | |
122 | 34 | LP: #1519918 [UI] "failed to detect a valid IP address" when trying to view node details. | 34 | |
123 | 35 | 35 | LP: #1519918 [UI] "failed to detect a valid IP address" when trying to view node details. | |
124 | 36 | 36 | ||
125 | 37 | 1.9.0 (RC2) | 37 | |
126 | 38 | ============= | 38 | 1.9.0 (RC2) |
127 | 39 | 39 | ============= | |
128 | 40 | Major bugs fixed in this release | 40 | |
129 | 41 | -------------------------------- | 41 | Major bugs fixed in this release |
130 | 42 | 42 | -------------------------------- | |
131 | 43 | LP: #1513085 Partitioning should align for performance. | 43 | |
132 | 44 | 44 | LP: #1513085 Partitioning should align for performance. | |
133 | 45 | LP: #1516815 MAAS creates DNS record against Alias (eth0:1) if alias belongs to the PXE Interface. | 45 | |
134 | 46 | 46 | LP: #1516815 MAAS creates DNS record against Alias (eth0:1) if alias belongs to the PXE Interface. | |
135 | 47 | LP: #1515769 Failed to power on SM15k. | 47 | |
136 | 48 | 48 | LP: #1515769 Failed to power on SM15k. | |
137 | 49 | LP: #1516722 Fix migration that might affect upgrade from 1.7. | 49 | |
138 | 50 | 50 | LP: #1516722 Fix migration that might affect upgrade from 1.7. | |
139 | 51 | LP: #1516065 Failed to power control IPMI BMC that does not support setting the boot order. | 51 | |
140 | 52 | 52 | LP: #1516065 Failed to power control IPMI BMC that does not support setting the boot order. | |
141 | 53 | LP: #1517097 Constraints for acquiring interfaces argument should 'AND' key-value pairs for the same label. | 53 | |
142 | 54 | 54 | LP: #1517097 Constraints for acquiring interfaces argument should 'AND' key-value pairs for the same label. | |
143 | 55 | LP: #1517687 [UI] Cannot create a partition using the whole disk. | 55 | |
144 | 56 | 56 | LP: #1517687 [UI] Cannot create a partition using the whole disk. | |
145 | 57 | LP: #1513258 [UI] CSS Broken for Bond Network Device. | 57 | |
146 | 58 | 58 | LP: #1513258 [UI] CSS Broken for Bond Network Device. | |
147 | 59 | LP: #1516173 [UI] Prevent being able to unmount/remove filesystems while node is on. | 59 | |
148 | 60 | 60 | LP: #1516173 [UI] Prevent being able to unmount/remove filesystems while node is on. | |
149 | 61 | LP: #1510457 [UI] No error message if there is no boot and/or root disk configured for a node. | 61 | |
150 | 62 | 62 | LP: #1510457 [UI] No error message if there is no boot and/or root disk configured for a node. | |
151 | 63 | 63 | ||
152 | 64 | |||
153 | 65 | ======= | ||
154 | 66 | 1.9.0 | ||
155 | 67 | ===== | ||
156 | 68 | |||
157 | 69 | Important announcements | ||
158 | 70 | ----------------------- | ||
159 | 71 | |||
160 | 72 | **New Networking Concepts and API's: Fabrics, Spaces and Subnets** | ||
161 | 73 | With the introduction of new MAAS networking concepts, new API's are also | ||
162 | 74 | been introduced. These are: | ||
163 | 75 | |||
164 | 76 | * fabrics | ||
165 | 77 | * spaces | ||
166 | 78 | * subnets | ||
167 | 79 | * vlans | ||
168 | 80 | * fan-networks | ||
169 | 81 | |||
170 | 82 | MAAS 1.9.0 will continue to provide backwards compatibility with the old | ||
171 | 83 | network API for reading purposes, but moving forward, users are required to | ||
172 | 84 | use the new API to manipulate fabrics, spaces and subnets. | ||
173 | 85 | |||
174 | 86 | **Advanced Network and Storage Configuration only available for Ubuntu deployments** | ||
175 | 87 | Users can now perform advanced network and storage configurations for nodes | ||
176 | 88 | before deployment. The advanced configuration is only available for Ubuntu | ||
177 | 89 | deployments. All other deployments using third party OS', including CentOS, | ||
178 | 90 | RHEL, Windows and Custom Images, won't result in such configuration. | ||
179 | 91 | |||
180 | 92 | **Re-commissioning required for upgraded MAAS** | ||
181 | 93 | Now that storage partitioning and advanced configuration is supported natively, | ||
182 | 94 | VM nodes in MAAS need to be re-commissioned. | ||
183 | 95 | |||
184 | 96 | * If upgrading from MAAS 1.8, only VM nodes with VirtIO storage devices need | ||
185 | 97 | to be re-commissioned. | ||
186 | 98 | |||
187 | 99 | * If upgrading from MAAS 1.7, all nodes will need to be re-commissioned in | ||
188 | 100 | order for MAAS to correctly capture the storage and networking devices. | ||
189 | 101 | |||
190 | 102 | This does not affect nodes that are currently deployed. | ||
191 | 103 | |||
192 | 104 | **Default Storage Partitioning Layout - Flat** | ||
193 | 105 | With the introduction of custom storage, MAAS has also introduced the concept | ||
194 | 106 | of partitioning layouts. Partitioning layouts allow the user to quickly | ||
195 | 107 | auto-configure the disk partitioning scheme after first commissioning or | ||
196 | 108 | re-commissioning (if selected to do so). The partitioning layouts are set | ||
197 | 109 | globally on the `Settings` page. | ||
198 | 110 | |||
199 | 111 | The current default Partitioning layout is 'Flat', maintaining backwards | ||
200 | 112 | compatibility with previous MAAS releases. This means MAAS will take the | ||
201 | 113 | first disk it finds in the system and use it as the root and boot disk. | ||
202 | 114 | |||
203 | 115 | **Deployment with configured /etc/network/interfaces** | ||
204 | 116 | Starting with MAAS 1.9, all node deployments will result in writing | ||
205 | 117 | `/etc/network/interfaces` statically, by default. This increases MAAS' | ||
206 | 118 | robustness and reliability as users no longer have to depend on DHCP for | ||
207 | 119 | IP address allocation solely. | ||
208 | 120 | |||
209 | 121 | MAAS will continue to provide IP addresses via DHCP, even though interfaces | ||
210 | 122 | in `/etc/network/interfaces` may have been configured statically. | ||
211 | 123 | |||
212 | 124 | Major new features | ||
213 | 125 | ------------------ | ||
214 | 126 | |||
215 | 127 | **Storage Partitioning and Advanced Configuration** | ||
216 | 128 | MAAS now supports Storage Partitioning and Advanced Configuration natively. | ||
217 | 129 | This allows MAAS to deploy machines with different Storage Layouts, as | ||
218 | 130 | well as different complex partitioning configurations. Storage support | ||
219 | 131 | includes: | ||
220 | 132 | |||
221 | 133 | * LVM | ||
222 | 134 | * Bcache | ||
223 | 135 | * Software RAID levels 0, 1, 5, 6, 10. | ||
224 | 136 | * Advanced partitioning | ||
225 | 137 | |||
226 | 138 | Storace configuration is available both via the WebUI and API. For more | ||
227 | 139 | information refer to :ref:`storage`. | ||
228 | 140 | |||
229 | 141 | **Advanced Networking (Fabrics, Spaces, Subnetworks) and Node Network Configuration** | ||
230 | 142 | MAAS now supports Advanced Network configuration, allowing users to not | ||
231 | 143 | only perform advanced node network configuration, but also allowing users | ||
232 | 144 | to declare and map their infrastructure in the form of Fabrics, VLANs, | ||
233 | 145 | Spaces and Subnets. | ||
234 | 146 | |||
235 | 147 | **Fabrics, Spaces, Subnets and Fan networks** | ||
236 | 148 | MAAS now supports the concept of Fabrics, Spaces, Subnets and FANS, | ||
237 | 149 | which introduce a whole new way of declaring and mapping your network | ||
238 | 150 | and infrastructure in MAAS. | ||
239 | 151 | |||
240 | 152 | The MAAS WebUI allows users to view all the declared Fabrics, Spaces, | ||
241 | 153 | VLANs inside fabrics and Subnets inside Spaces. The WebUI does not yet | ||
242 | 154 | support the ability to create new of these, but the API does. | ||
243 | 155 | |||
244 | 156 | These new concepts replace the old `Network` concepts from MAAS' | ||
245 | 157 | earlier versions. For more information, see :ref:`networking`. | ||
246 | 158 | |||
247 | 159 | For more information about the API, see :ref:`api`. | ||
248 | 160 | |||
249 | 161 | **Advanced Node Networking Configuration** | ||
250 | 162 | MAAS can now perform the Node's networking configuration. Doing so, | ||
251 | 163 | results in `/etc/network/interfaces` being written. Advanced | ||
252 | 164 | configuration includes: | ||
253 | 165 | |||
254 | 166 | * Assign subnets, fabrics, and IP to interfaces. | ||
255 | 167 | * Create VLAN interfaces. | ||
256 | 168 | * Create bond interfaces. | ||
257 | 169 | * Change interface names. | ||
258 | 170 | |||
259 | 171 | MAAS also allows configuration of node interfaces in different modes: | ||
260 | 172 | |||
261 | 173 | * Auto Assign - Node interface will be configured statically | ||
262 | 174 | and MAAS will auto assign an IP address. | ||
263 | 175 | * DHCP - The node interface will be configured to DHCP. | ||
264 | 176 | * Static - The user will be able to specify what IP address the | ||
265 | 177 | interface will obtain, while MAAS will configure it statically. | ||
266 | 178 | * Unconfigured - MAAS will leave the interface with LINK UP. | ||
267 | 179 | |||
268 | 180 | **Curtin & cloud-init status updates** | ||
269 | 181 | Starting from MAAS 1.9.0, curtin and cloud-init will now send messages | ||
270 | 182 | to MAAS providing information regarding various of the actions being | ||
271 | 183 | taken. This information will be displayed in MAAS in the `Node Event Log`. | ||
272 | 184 | |||
273 | 185 | Note that this information is only available when using MAAS 1.9.0 and | ||
274 | 186 | the latest version fo curtin. For cloud-init messages this information | ||
275 | 187 | is only available when deploying Wily+. | ||
276 | 188 | |||
277 | 189 | **Fabric and subnet creation** | ||
278 | 190 | MAAS now auto-creates multiple fabrics per physical interface connected | ||
279 | 191 | to the Cluster Controller, and will correctly create subnetworks under | ||
280 | 192 | each fabric, as well as VLAN's, if any of the Cluster Controller | ||
281 | 193 | interface is a VLAN interface. | ||
282 | 194 | |||
283 | 195 | **HWE Kernels** | ||
284 | 196 | MAAS now has a different approach to deploying Hardware Enablement | ||
285 | 197 | Kernels. Start from MAAS 1.9, the HWE kernels are no longer coupled | ||
286 | 198 | to subarchitectures of a machine. For each Ubuntu release, users | ||
287 | 199 | will be able to select any of the available HWE kernels for such | ||
288 | 200 | release, as well as set the minimum kernel the machine will be | ||
289 | 201 | deployed with by default. | ||
290 | 202 | |||
291 | 203 | For more information, see :ref:`hardware-enablement-kernels`. | ||
292 | 204 | |||
293 | 205 | **CentOS images can be imported automatically** | ||
294 | 206 | CentOS Image (CentOS 6 and 7) can now be imported automatically from the | ||
295 | 207 | MAAS Images page. These images are currently part of the daily streams. | ||
296 | 208 | |||
297 | 209 | In order to test this images, you need to use the daily image stream. | ||
298 | 210 | This can be changed in the `Settings` page under `Boot Images` to | ||
299 | 211 | `http://maas.ubuntu.com/images/ephemeral-v2/daily/`. Once changed, images | ||
300 | 212 | can be imported from the MAAS Images page. The CentOS image will be | ||
301 | 213 | published in the Releases stream shortly. | ||
302 | 214 | |||
303 | 215 | |||
304 | 216 | Minor notable changes | ||
305 | 217 | --------------------- | ||
306 | 218 | |||
307 | 219 | **Minimal Config Files for Daemons** | ||
308 | 220 | Starting from MAAS 1.9, minimal configuration files have been introduced | ||
309 | 221 | for both, the MAAS Region Controller and the MAAS Cluster Controller daemons. | ||
310 | 222 | |||
311 | 223 | * The Region Controller (`maas-regiond`) has now dropped the usage of | ||
312 | 224 | `/etc/maas/maas_local_settings.py` in favor of `/etc/maas/regiond.conf`. | ||
313 | 225 | Available configuration options are now `database_host`, `database_name`, | ||
314 | 226 | `database_user`, `database_pass`, `maas_url`. MAAS will attempt to migrate | ||
315 | 227 | any configuration on upgrade, otherwise it will use sane defaults. | ||
316 | 228 | |||
317 | 229 | * The Cluster Controller (`maas-clusterd`) has now dropped the usage of | ||
318 | 230 | `/etc/maas/pserv.yaml` and `/etc/maas/maas_cluster.conf` in favor of | ||
319 | 231 | `/etc/maas/clusterd.conf`. Available configuration options are now `maas_url` | ||
320 | 232 | and `cluster_uuid` only. MAAS will attempt to migrate any configuration | ||
321 | 233 | on upgrade, otherwise it will use sane defaults. | ||
322 | 234 | |||
323 | 235 | **Commissioning Actions** | ||
324 | 236 | MAAS now supports commissioning actions. These allow the user to specify | ||
325 | 237 | how commissioning should behave in certain escenarios. The commissioning | ||
326 | 238 | actions available are: | ||
327 | 239 | |||
328 | 240 | * Enable SSH during commissioning & Keep machine ON after commissioning | ||
329 | 241 | * Keep network configuration after commissioning | ||
330 | 242 | * Keep storage configuration after commissioning | ||
331 | 243 | |||
332 | 244 | **Warn users about missing power control tools** | ||
333 | 245 | MAAS now warns users about the missing power control tools. Each MAAS | ||
334 | 246 | power driver use a set of power tools that may or may not be installed | ||
335 | 247 | by default. If these power tools are missing from the system, MAAS will | ||
336 | 248 | warn users. | ||
337 | 249 | |||
338 | 250 | **Python Power Drivers** | ||
339 | 251 | Starting from MAAS 1.9, MAAS is moving away from using shell scripts | ||
340 | 252 | templates for Power Drivers. These are being migrated to MAAS' | ||
341 | 253 | internal control as power drivers. Currently supported are APC, MSCM, | ||
342 | 254 | MSFT OCS, SM15k, UCSM, Virsh, VMWare and IPMI. | ||
343 | 255 | |||
344 | 256 | Remaining Power Drivers include AMT, Fence CDU's, Moonshot. | ||
345 | 257 | |||
346 | 258 | Major bugs fixed in this release | ||
347 | 259 | -------------------------------- | ||
348 | 260 | |||
349 | 261 | See https://launchpad.net/maas/+milestone/1.9.0 for details. | ||
350 | 262 | |||
351 | 263 | |||
352 | 264 | 1.9.0 (RC4) | ||
353 | 265 | ============ | ||
354 | 266 | |||
355 | 267 | Major bugs fixed in this release | ||
356 | 268 | -------------------------------- | ||
357 | 269 | |||
358 | 270 | LP: #1523674 Virsh is reporting ppc64le, not ppc64el. | ||
359 | 271 | |||
360 | 272 | LP: #1524091 Don't require DHCP to be on if it should be off. | ||
361 | 273 | |||
362 | 274 | LP: #1523988 No required packages for HMC as it uses pure python paramiko ssh client. | ||
363 | 275 | |||
364 | 276 | LP: #1524007 Don't hold the cluster configuration lock while reloading boot images. | ||
365 | 277 | |||
366 | 278 | LP: #1524924 Fix commissioning to correctly identify secondary subnets, VLAN's and fabrics. | ||
367 | 279 | |||
368 | 280 | |||
369 | 281 | 1.9.0 (RC3) | ||
370 | 282 | ============= | ||
371 | 283 | |||
372 | 284 | Major bugs fixed in this release | ||
373 | 285 | -------------------------------- | ||
374 | 286 | |||
375 | 287 | LP: #1522898 "node-interface" API should just be "interface" - to allow devices to use it | ||
376 | 288 | |||
377 | 289 | LP: #1519527 Juju 1.25.1 proposed: lxc units all have the same IP address after upgrade from 1.7/1.8. | ||
378 | 290 | |||
379 | 291 | LP: #1522294 MAAS fails to parse some DHCP leases. | ||
380 | 292 | |||
381 | 293 | LP: #1519090 DHCP interface automatically obtains an IP even when the subnet is unmanaged. | ||
382 | 294 | |||
383 | 295 | LP: #1519077 MAAS assigns IP addresses on unmanaged subnets without consideration for some addresses known to be in use. | ||
384 | 296 | |||
385 | 297 | LP: #1519396 MTU field is not exposed over the API for VLAN. | ||
386 | 298 | |||
387 | 299 | LP: #1521833 Updating subnet name removes dns_server. | ||
388 | 300 | |||
389 | 301 | LP: #1519919 CC looks for NICs with kernel module loaded and fall back doesn't check persistent device names. | ||
390 | 302 | |||
391 | 303 | LP: #1522225 Migration 0181 can fail on upgrade if disks across nodes have duplicate serial numbers. | ||
392 | 304 | |||
393 | 305 | LP: #1519247 Migration 0146 can fail on upgrade when migrating unmanaged subnets. | ||
394 | 306 | |||
395 | 307 | LP: #1519397 [UI] Once a cache_set is created the UI fails with ERROR. | ||
396 | 308 | |||
397 | 309 | LP: #1519918 [UI] "failed to detect a valid IP address" when trying to view node details. | ||
398 | 310 | |||
399 | 311 | |||
400 | 312 | 1.9.0 (RC2) | ||
401 | 313 | ============= | ||
402 | 314 | |||
403 | 315 | Major bugs fixed in this release | ||
404 | 316 | -------------------------------- | ||
405 | 317 | |||
406 | 318 | LP: #1513085 Partitioning should align for performance. | ||
407 | 319 | |||
408 | 320 | LP: #1516815 MAAS creates DNS record against Alias (eth0:1) if alias belongs to the PXE Interface. | ||
409 | 321 | |||
410 | 322 | LP: #1515769 Failed to power on SM15k. | ||
411 | 323 | |||
412 | 324 | LP: #1516722 Fix migration that might affect upgrade from 1.7. | ||
413 | 325 | |||
414 | 326 | LP: #1516065 Failed to power control IPMI BMC that does not support setting the boot order. | ||
415 | 327 | |||
416 | 328 | LP: #1517097 Constraints for acquiring interfaces argument should 'AND' key-value pairs for the same label. | ||
417 | 329 | |||
418 | 330 | LP: #1517687 [UI] Cannot create a partition using the whole disk. | ||
419 | 331 | |||
420 | 332 | LP: #1513258 [UI] CSS Broken for Bond Network Device. | ||
421 | 333 | |||
422 | 334 | LP: #1516173 [UI] Prevent being able to unmount/remove filesystems while node is on. | ||
423 | 335 | |||
424 | 336 | LP: #1510457 [UI] No error message if there is no boot and/or root disk configured for a node. | ||
425 | 337 | |||
426 | 338 | |||
427 | 339 | >>>>>>> MERGE-SOURCE | ||
428 | 64 | 1.9.0 (RC1) | 340 | 1.9.0 (RC1) |
429 | 65 | ============= | 341 | ============= |
430 | 66 | 342 | ||
431 | 67 | 343 | ||
432 | === modified file 'src/maasserver/api/devices.py' | |||
433 | === modified file 'src/maasserver/api/interfaces.py' | |||
434 | --- src/maasserver/api/interfaces.py 2015-12-16 00:01:56 +0000 | |||
435 | +++ src/maasserver/api/interfaces.py 2016-01-10 08:29:39 +0000 | |||
436 | @@ -83,8 +83,12 @@ | |||
437 | 83 | return ('interfaces_handler', ["system_id"]) | 83 | return ('interfaces_handler', ["system_id"]) |
438 | 84 | 84 | ||
439 | 85 | def read(self, request, system_id): | 85 | def read(self, request, system_id): |
440 | 86 | <<<<<<< TREE | ||
441 | 86 | """List all interfaces belonging to a machine, device, or | 87 | """List all interfaces belonging to a machine, device, or |
442 | 87 | rack controller. | 88 | rack controller. |
443 | 89 | ======= | ||
444 | 90 | """List all interfaces belonging to a node or device. | ||
445 | 91 | >>>>>>> MERGE-SOURCE | ||
446 | 88 | 92 | ||
447 | 89 | Returns 404 if the node is not found. | 93 | Returns 404 if the node is not found. |
448 | 90 | """ | 94 | """ |
449 | @@ -94,8 +98,12 @@ | |||
450 | 94 | 98 | ||
451 | 95 | @operation(idempotent=False) | 99 | @operation(idempotent=False) |
452 | 96 | def create_physical(self, request, system_id): | 100 | def create_physical(self, request, system_id): |
453 | 101 | <<<<<<< TREE | ||
454 | 97 | """Create a physical interface on a machine, device, or | 102 | """Create a physical interface on a machine, device, or |
455 | 98 | rack controller. | 103 | rack controller. |
456 | 104 | ======= | ||
457 | 105 | """Create a physical interface on a node or device. | ||
458 | 106 | >>>>>>> MERGE-SOURCE | ||
459 | 99 | 107 | ||
460 | 100 | :param name: Name of the interface. | 108 | :param name: Name of the interface. |
461 | 101 | :param mac_address: MAC address of the interface. | 109 | :param mac_address: MAC address of the interface. |
462 | @@ -110,12 +118,21 @@ | |||
463 | 110 | 118 | ||
464 | 111 | Returns 404 if the node is not found. | 119 | Returns 404 if the node is not found. |
465 | 112 | """ | 120 | """ |
466 | 121 | <<<<<<< TREE | ||
467 | 113 | node = Node.objects.get_node_or_404( | 122 | node = Node.objects.get_node_or_404( |
468 | 114 | system_id, request.user, NODE_PERMISSION.EDIT) | 123 | system_id, request.user, NODE_PERMISSION.EDIT) |
469 | 115 | # Machine type nodes require the node needs to be in the correct state. | 124 | # Machine type nodes require the node needs to be in the correct state. |
470 | 116 | if node.node_type == NODE_TYPE.MACHINE: | 125 | if node.node_type == NODE_TYPE.MACHINE: |
471 | 117 | raise_error_for_invalid_state_on_allocated_operations( | 126 | raise_error_for_invalid_state_on_allocated_operations( |
472 | 118 | node, request.user, "create") | 127 | node, request.user, "create") |
473 | 128 | ======= | ||
474 | 129 | node = Node.objects.get_node_or_404( | ||
475 | 130 | system_id, request.user, NODE_PERMISSION.EDIT) | ||
476 | 131 | # Installable nodes require the node needs to be in the correct state. | ||
477 | 132 | if node.installable: | ||
478 | 133 | raise_error_for_invalid_state_on_allocated_operations( | ||
479 | 134 | node, request.user, "create") | ||
480 | 135 | >>>>>>> MERGE-SOURCE | ||
481 | 119 | form = PhysicalInterfaceForm(node=node, data=request.data) | 136 | form = PhysicalInterfaceForm(node=node, data=request.data) |
482 | 120 | if form.is_valid(): | 137 | if form.is_valid(): |
483 | 121 | return form.save() | 138 | return form.save() |
484 | @@ -376,12 +393,21 @@ | |||
485 | 376 | Returns 404 if the node or interface is not found. | 393 | Returns 404 if the node or interface is not found. |
486 | 377 | """ | 394 | """ |
487 | 378 | interface = Interface.objects.get_interface_or_404( | 395 | interface = Interface.objects.get_interface_or_404( |
488 | 396 | <<<<<<< TREE | ||
489 | 379 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | 397 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) |
490 | 380 | if interface.get_node().node_type == NODE_TYPE.MACHINE: | 398 | if interface.get_node().node_type == NODE_TYPE.MACHINE: |
491 | 381 | # This node needs to be in the correct state to modify | 399 | # This node needs to be in the correct state to modify |
492 | 382 | # the interface. | 400 | # the interface. |
493 | 383 | raise_error_for_invalid_state_on_allocated_operations( | 401 | raise_error_for_invalid_state_on_allocated_operations( |
494 | 384 | interface.node, request.user, "update interface") | 402 | interface.node, request.user, "update interface") |
495 | 403 | ======= | ||
496 | 404 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | ||
497 | 405 | if interface.get_node().installable: | ||
498 | 406 | # This node needs to be in the correct state to modify | ||
499 | 407 | # the interface. | ||
500 | 408 | raise_error_for_invalid_state_on_allocated_operations( | ||
501 | 409 | interface.node, request.user, "update interface") | ||
502 | 410 | >>>>>>> MERGE-SOURCE | ||
503 | 385 | interface_form = InterfaceForm.get_interface_form(interface.type) | 411 | interface_form = InterfaceForm.get_interface_form(interface.type) |
504 | 386 | # For VLAN interface we cast parents to parent. As a VLAN can only | 412 | # For VLAN interface we cast parents to parent. As a VLAN can only |
505 | 387 | # have one parent. | 413 | # have one parent. |
506 | @@ -406,12 +432,21 @@ | |||
507 | 406 | Returns 404 if the node or interface is not found. | 432 | Returns 404 if the node or interface is not found. |
508 | 407 | """ | 433 | """ |
509 | 408 | interface = Interface.objects.get_interface_or_404( | 434 | interface = Interface.objects.get_interface_or_404( |
510 | 435 | <<<<<<< TREE | ||
511 | 409 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | 436 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) |
512 | 410 | if interface.get_node().node_type == NODE_TYPE.MACHINE: | 437 | if interface.get_node().node_type == NODE_TYPE.MACHINE: |
513 | 411 | # This node needs to be in the correct state to modify | 438 | # This node needs to be in the correct state to modify |
514 | 412 | # the interface. | 439 | # the interface. |
515 | 413 | raise_error_for_invalid_state_on_allocated_operations( | 440 | raise_error_for_invalid_state_on_allocated_operations( |
516 | 414 | interface.node, request.user, "delete interface") | 441 | interface.node, request.user, "delete interface") |
517 | 442 | ======= | ||
518 | 443 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | ||
519 | 444 | if interface.get_node().installable: | ||
520 | 445 | # This node needs to be in the correct state to modify | ||
521 | 446 | # the interface. | ||
522 | 447 | raise_error_for_invalid_state_on_allocated_operations( | ||
523 | 448 | interface.node, request.user, "delete interface") | ||
524 | 449 | >>>>>>> MERGE-SOURCE | ||
525 | 415 | interface.delete() | 450 | interface.delete() |
526 | 416 | return rc.DELETED | 451 | return rc.DELETED |
527 | 417 | 452 | ||
528 | @@ -447,6 +482,7 @@ | |||
529 | 447 | Returns 404 if the node or interface is not found. | 482 | Returns 404 if the node or interface is not found. |
530 | 448 | """ | 483 | """ |
531 | 449 | interface = Interface.objects.get_interface_or_404( | 484 | interface = Interface.objects.get_interface_or_404( |
532 | 485 | <<<<<<< TREE | ||
533 | 450 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | 486 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) |
534 | 451 | node = interface.get_node() | 487 | node = interface.get_node() |
535 | 452 | if node.node_type == NODE_TYPE.MACHINE: | 488 | if node.node_type == NODE_TYPE.MACHINE: |
536 | @@ -465,6 +501,26 @@ | |||
537 | 465 | allowed_modes = [INTERFACE_LINK_TYPE.STATIC] | 501 | allowed_modes = [INTERFACE_LINK_TYPE.STATIC] |
538 | 466 | form = InterfaceLinkForm( | 502 | form = InterfaceLinkForm( |
539 | 467 | instance=interface, data=request.data, allowed_modes=allowed_modes) | 503 | instance=interface, data=request.data, allowed_modes=allowed_modes) |
540 | 504 | ======= | ||
541 | 505 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | ||
542 | 506 | node = interface.get_node() | ||
543 | 507 | if node.installable: | ||
544 | 508 | # This node needs to be in the correct state to modify | ||
545 | 509 | # the interface. | ||
546 | 510 | raise_error_for_invalid_state_on_allocated_operations( | ||
547 | 511 | interface.node, request.user, "link subnet") | ||
548 | 512 | allowed_modes = [ | ||
549 | 513 | INTERFACE_LINK_TYPE.AUTO, | ||
550 | 514 | INTERFACE_LINK_TYPE.DHCP, | ||
551 | 515 | INTERFACE_LINK_TYPE.STATIC, | ||
552 | 516 | INTERFACE_LINK_TYPE.LINK_UP, | ||
553 | 517 | ] | ||
554 | 518 | else: | ||
555 | 519 | # Devices can only be set in static IP mode. | ||
556 | 520 | allowed_modes = [INTERFACE_LINK_TYPE.STATIC] | ||
557 | 521 | form = InterfaceLinkForm( | ||
558 | 522 | instance=interface, data=request.data, allowed_modes=allowed_modes) | ||
559 | 523 | >>>>>>> MERGE-SOURCE | ||
560 | 468 | if form.is_valid(): | 524 | if form.is_valid(): |
561 | 469 | return form.save() | 525 | return form.save() |
562 | 470 | else: | 526 | else: |
563 | @@ -479,12 +535,21 @@ | |||
564 | 479 | Returns 404 if the node or interface is not found. | 535 | Returns 404 if the node or interface is not found. |
565 | 480 | """ | 536 | """ |
566 | 481 | interface = Interface.objects.get_interface_or_404( | 537 | interface = Interface.objects.get_interface_or_404( |
567 | 538 | <<<<<<< TREE | ||
568 | 482 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | 539 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) |
569 | 483 | if interface.get_node().node_type == NODE_TYPE.MACHINE: | 540 | if interface.get_node().node_type == NODE_TYPE.MACHINE: |
570 | 484 | # This node needs to be in the correct state to modify | 541 | # This node needs to be in the correct state to modify |
571 | 485 | # the interface. | 542 | # the interface. |
572 | 486 | raise_error_for_invalid_state_on_allocated_operations( | 543 | raise_error_for_invalid_state_on_allocated_operations( |
573 | 487 | interface.node, request.user, "unlink subnet") | 544 | interface.node, request.user, "unlink subnet") |
574 | 545 | ======= | ||
575 | 546 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | ||
576 | 547 | if interface.get_node().installable: | ||
577 | 548 | # This node needs to be in the correct state to modify | ||
578 | 549 | # the interface. | ||
579 | 550 | raise_error_for_invalid_state_on_allocated_operations( | ||
580 | 551 | interface.node, request.user, "unlink subnet") | ||
581 | 552 | >>>>>>> MERGE-SOURCE | ||
582 | 488 | form = InterfaceUnlinkForm(instance=interface, data=request.data) | 553 | form = InterfaceUnlinkForm(instance=interface, data=request.data) |
583 | 489 | if form.is_valid(): | 554 | if form.is_valid(): |
584 | 490 | return form.save() | 555 | return form.save() |
585 | @@ -506,12 +571,21 @@ | |||
586 | 506 | Returns 404 if the node or interface is not found. | 571 | Returns 404 if the node or interface is not found. |
587 | 507 | """ | 572 | """ |
588 | 508 | interface = Interface.objects.get_interface_or_404( | 573 | interface = Interface.objects.get_interface_or_404( |
589 | 574 | <<<<<<< TREE | ||
590 | 509 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | 575 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) |
591 | 510 | if interface.get_node().node_type == NODE_TYPE.MACHINE: | 576 | if interface.get_node().node_type == NODE_TYPE.MACHINE: |
592 | 511 | # This node needs to be in the correct state to modify | 577 | # This node needs to be in the correct state to modify |
593 | 512 | # the interface. | 578 | # the interface. |
594 | 513 | raise_error_for_invalid_state_on_allocated_operations( | 579 | raise_error_for_invalid_state_on_allocated_operations( |
595 | 514 | interface.node, request.user, "set default gateway") | 580 | interface.node, request.user, "set default gateway") |
596 | 581 | ======= | ||
597 | 582 | system_id, interface_id, request.user, NODE_PERMISSION.EDIT) | ||
598 | 583 | if interface.get_node().installable: | ||
599 | 584 | # This node needs to be in the correct state to modify | ||
600 | 585 | # the interface. | ||
601 | 586 | raise_error_for_invalid_state_on_allocated_operations( | ||
602 | 587 | interface.node, request.user, "set default gateway") | ||
603 | 588 | >>>>>>> MERGE-SOURCE | ||
604 | 515 | form = InterfaceSetDefaultGatwayForm( | 589 | form = InterfaceSetDefaultGatwayForm( |
605 | 516 | instance=interface, data=request.data) | 590 | instance=interface, data=request.data) |
606 | 517 | if form.is_valid(): | 591 | if form.is_valid(): |
607 | 518 | 592 | ||
608 | === modified file 'src/maasserver/api/tests/test_devices.py' | |||
609 | --- src/maasserver/api/tests/test_devices.py 2015-12-21 21:19:44 +0000 | |||
610 | +++ src/maasserver/api/tests/test_devices.py 2016-01-10 08:29:39 +0000 | |||
611 | @@ -14,9 +14,14 @@ | |||
612 | 14 | INTERFACE_TYPE, | 14 | INTERFACE_TYPE, |
613 | 15 | IPADDRESS_TYPE, | 15 | IPADDRESS_TYPE, |
614 | 16 | NODE_STATUS, | 16 | NODE_STATUS, |
615 | 17 | <<<<<<< TREE | ||
616 | 17 | NODE_TYPE, | 18 | NODE_TYPE, |
617 | 18 | NODEGROUP_STATUS, | 19 | NODEGROUP_STATUS, |
618 | 19 | NODEGROUPINTERFACE_MANAGEMENT, | 20 | NODEGROUPINTERFACE_MANAGEMENT, |
619 | 21 | ======= | ||
620 | 22 | NODEGROUP_STATUS, | ||
621 | 23 | NODEGROUPINTERFACE_MANAGEMENT, | ||
622 | 24 | >>>>>>> MERGE-SOURCE | ||
623 | 20 | ) | 25 | ) |
624 | 21 | from maasserver.models import ( | 26 | from maasserver.models import ( |
625 | 22 | Device, | 27 | Device, |
626 | @@ -31,7 +36,11 @@ | |||
627 | 31 | ) | 36 | ) |
628 | 32 | from maasserver.testing.factory import factory | 37 | from maasserver.testing.factory import factory |
629 | 33 | from maasserver.testing.orm import reload_object | 38 | from maasserver.testing.orm import reload_object |
630 | 39 | <<<<<<< TREE | ||
631 | 34 | from maasserver.utils.converters import json_load_bytes | 40 | from maasserver.utils.converters import json_load_bytes |
632 | 41 | ======= | ||
633 | 42 | from mock import patch | ||
634 | 43 | >>>>>>> MERGE-SOURCE | ||
635 | 35 | from testtools.matchers import ( | 44 | from testtools.matchers import ( |
636 | 36 | HasLength, | 45 | HasLength, |
637 | 37 | Not, | 46 | Not, |
638 | @@ -286,6 +295,7 @@ | |||
639 | 286 | class TestClaimStickyIpAddressAPI(APITestCase): | 295 | class TestClaimStickyIpAddressAPI(APITestCase): |
640 | 287 | """Tests for /api/1.0/devices/?op=claim_sticky_ip_address.""" | 296 | """Tests for /api/1.0/devices/?op=claim_sticky_ip_address.""" |
641 | 288 | 297 | ||
642 | 298 | <<<<<<< TREE | ||
643 | 289 | def test__claims_ip_address_from_cluster_interface_static_range(self): | 299 | def test__claims_ip_address_from_cluster_interface_static_range(self): |
644 | 290 | ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | 300 | ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) |
645 | 291 | ngi = factory.make_NodeGroupInterface( | 301 | ngi = factory.make_NodeGroupInterface( |
646 | @@ -393,6 +403,95 @@ | |||
647 | 393 | self.assertEqual( | 403 | self.assertEqual( |
648 | 394 | http.client.OK, response.status_code, response.content) | 404 | http.client.OK, response.status_code, response.content) |
649 | 395 | parsed_device = json_load_bytes(response.content) | 405 | parsed_device = json_load_bytes(response.content) |
650 | 406 | ======= | ||
651 | 407 | def test__claims_ip_address_from_cluster_interface_static_range(self): | ||
652 | 408 | ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
653 | 409 | ngi = factory.make_NodeGroupInterface( | ||
654 | 410 | ng, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS) | ||
655 | 411 | parent = factory.make_Node_with_Interface_on_Subnet( | ||
656 | 412 | nodegroup=ng, subnet=ngi.subnet) | ||
657 | 413 | device = factory.make_Node( | ||
658 | 414 | installable=False, parent=parent, interface=True, | ||
659 | 415 | disable_ipv4=False, owner=self.logged_in_user) | ||
660 | 416 | # Silence 'update_host_maps'. | ||
661 | 417 | self.patch_autospec(interface_module, "update_host_maps") | ||
662 | 418 | response = self.client.post( | ||
663 | 419 | get_device_uri(device), {'op': 'claim_sticky_ip_address'}) | ||
664 | 420 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
665 | 421 | parsed_device = json.loads(response.content) | ||
666 | 422 | [returned_ip] = parsed_device["ip_addresses"] | ||
667 | 423 | static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first() | ||
668 | 424 | self.assertIsNotNone(static_ip) | ||
669 | 425 | self.assertEquals(IPADDRESS_TYPE.STICKY, static_ip.alloc_type) | ||
670 | 426 | |||
671 | 427 | def test__claims_ip_address_from_unmanaged_cluster_interface(self): | ||
672 | 428 | ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
673 | 429 | ngi = factory.make_NodeGroupInterface( | ||
674 | 430 | ng, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED) | ||
675 | 431 | parent = factory.make_Node_with_Interface_on_Subnet( | ||
676 | 432 | nodegroup=ng, subnet=ngi.subnet) | ||
677 | 433 | device = factory.make_Node( | ||
678 | 434 | installable=False, parent=parent, interface=True, | ||
679 | 435 | disable_ipv4=False, owner=self.logged_in_user) | ||
680 | 436 | # Silence 'update_host_maps'. | ||
681 | 437 | self.patch_autospec(interface_module, "update_host_maps") | ||
682 | 438 | response = self.client.post( | ||
683 | 439 | get_device_uri(device), {'op': 'claim_sticky_ip_address'}) | ||
684 | 440 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
685 | 441 | parsed_device = json.loads(response.content) | ||
686 | 442 | [returned_ip] = parsed_device["ip_addresses"] | ||
687 | 443 | static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first() | ||
688 | 444 | self.assertIsNotNone(static_ip) | ||
689 | 445 | self.assertEquals(IPADDRESS_TYPE.STICKY, static_ip.alloc_type) | ||
690 | 446 | |||
691 | 447 | def test__claims_ip_address_from_detached_cluster_interface(self): | ||
692 | 448 | ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
693 | 449 | ngi = factory.make_NodeGroupInterface( | ||
694 | 450 | ng, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED) | ||
695 | 451 | subnet = ngi.subnet | ||
696 | 452 | ngi.subnet = None | ||
697 | 453 | ngi.save() | ||
698 | 454 | parent = factory.make_Node_with_Interface_on_Subnet( | ||
699 | 455 | nodegroup=ng, subnet=subnet, unmanaged=True) | ||
700 | 456 | device = factory.make_Node( | ||
701 | 457 | installable=False, parent=parent, interface=True, | ||
702 | 458 | disable_ipv4=False, owner=self.logged_in_user) | ||
703 | 459 | # Silence 'update_host_maps'. | ||
704 | 460 | self.patch_autospec(interface_module, "update_host_maps") | ||
705 | 461 | response = self.client.post( | ||
706 | 462 | get_device_uri(device), {'op': 'claim_sticky_ip_address'}) | ||
707 | 463 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
708 | 464 | parsed_device = json.loads(response.content) | ||
709 | 465 | [returned_ip] = parsed_device["ip_addresses"] | ||
710 | 466 | static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first() | ||
711 | 467 | self.assertIsNotNone(static_ip) | ||
712 | 468 | self.assertEquals(IPADDRESS_TYPE.STICKY, static_ip.alloc_type) | ||
713 | 469 | |||
714 | 470 | def test__claims_ip_address_after_devices_new(self): | ||
715 | 471 | ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
716 | 472 | ngi = factory.make_NodeGroupInterface( | ||
717 | 473 | ng, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS) | ||
718 | 474 | parent = factory.make_Node_with_Interface_on_Subnet( | ||
719 | 475 | nodegroup=ng, subnet=ngi.subnet) | ||
720 | 476 | # Run 'devices new', as a sanity check to ensure the object is created | ||
721 | 477 | # the same way as it is when juju does it. | ||
722 | 478 | self.client.post( | ||
723 | 479 | reverse('devices_handler'), | ||
724 | 480 | { | ||
725 | 481 | 'op': 'new', | ||
726 | 482 | 'hostname': "lxc-1", | ||
727 | 483 | 'mac_addresses': "01:02:03:04:05:06", | ||
728 | 484 | 'parent': parent.system_id, | ||
729 | 485 | }) | ||
730 | 486 | # Silence 'update_host_maps'. | ||
731 | 487 | device = Device.objects.first() | ||
732 | 488 | self.patch_autospec(interface_module, "update_host_maps") | ||
733 | 489 | response = self.client.post( | ||
734 | 490 | get_device_uri(device), {'op': 'claim_sticky_ip_address'}) | ||
735 | 491 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
736 | 492 | parsed_device = json.loads(response.content) | ||
737 | 493 | # import pdb; pdb.set_trace() | ||
738 | 494 | >>>>>>> MERGE-SOURCE | ||
739 | 396 | [returned_ip] = parsed_device["ip_addresses"] | 495 | [returned_ip] = parsed_device["ip_addresses"] |
740 | 397 | static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first() | 496 | static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first() |
741 | 398 | self.assertIsNotNone(static_ip) | 497 | self.assertIsNotNone(static_ip) |
742 | @@ -431,6 +530,7 @@ | |||
743 | 431 | (returned_ip, returned_ip, given_ip.alloc_type) | 530 | (returned_ip, returned_ip, given_ip.alloc_type) |
744 | 432 | ) | 531 | ) |
745 | 433 | 532 | ||
746 | 533 | <<<<<<< TREE | ||
747 | 434 | def test_503_if_no_subnet_found(self): | 534 | def test_503_if_no_subnet_found(self): |
748 | 435 | device = factory.make_Device( | 535 | device = factory.make_Device( |
749 | 436 | interface=True, disable_ipv4=False, owner=self.logged_in_user) | 536 | interface=True, disable_ipv4=False, owner=self.logged_in_user) |
750 | @@ -463,6 +563,41 @@ | |||
751 | 463 | http.client.SERVICE_UNAVAILABLE, response.status_code, | 563 | http.client.SERVICE_UNAVAILABLE, response.status_code, |
752 | 464 | response.content) | 564 | response.content) |
753 | 465 | 565 | ||
754 | 566 | ======= | ||
755 | 567 | def test_503_if_no_subnet_found(self): | ||
756 | 568 | device = factory.make_Node( | ||
757 | 569 | installable=False, interface=True, disable_ipv4=False, | ||
758 | 570 | owner=self.logged_in_user) | ||
759 | 571 | # Silence 'update_host_maps'. | ||
760 | 572 | self.patch_autospec(interface_module, "update_host_maps") | ||
761 | 573 | response = self.client.post( | ||
762 | 574 | get_device_uri(device), | ||
763 | 575 | { | ||
764 | 576 | 'op': 'claim_sticky_ip_address', | ||
765 | 577 | }) | ||
766 | 578 | self.assertEqual( | ||
767 | 579 | httplib.SERVICE_UNAVAILABLE, response.status_code, | ||
768 | 580 | response.content) | ||
769 | 581 | |||
770 | 582 | @patch.object(Interface, 'claim_static_ips') | ||
771 | 583 | def test_503_if_no_ip_found(self, claim_static_ips): | ||
772 | 584 | claim_static_ips.side_effect = [list()] | ||
773 | 585 | |||
774 | 586 | device = factory.make_Node( | ||
775 | 587 | installable=False, interface=True, disable_ipv4=False, | ||
776 | 588 | owner=self.logged_in_user) | ||
777 | 589 | # Silence 'update_host_maps'. | ||
778 | 590 | self.patch_autospec(interface_module, "update_host_maps") | ||
779 | 591 | response = self.client.post( | ||
780 | 592 | get_device_uri(device), | ||
781 | 593 | { | ||
782 | 594 | 'op': 'claim_sticky_ip_address', | ||
783 | 595 | }) | ||
784 | 596 | self.assertEqual( | ||
785 | 597 | httplib.SERVICE_UNAVAILABLE, response.status_code, | ||
786 | 598 | response.content) | ||
787 | 599 | |||
788 | 600 | >>>>>>> MERGE-SOURCE | ||
789 | 466 | def test_creates_ip_for_specific_mac(self): | 601 | def test_creates_ip_for_specific_mac(self): |
790 | 467 | requested_address = factory.make_ip_address() | 602 | requested_address = factory.make_ip_address() |
791 | 468 | device = factory.make_Node( | 603 | device = factory.make_Node( |
792 | 469 | 604 | ||
793 | === modified file 'src/maasserver/api/tests/test_interfaces.py' | |||
794 | --- src/maasserver/api/tests/test_interfaces.py 2015-12-10 01:04:27 +0000 | |||
795 | +++ src/maasserver/api/tests/test_interfaces.py 2016-01-10 08:29:39 +0000 | |||
796 | @@ -92,6 +92,7 @@ | |||
797 | 92 | ] | 92 | ] |
798 | 93 | self.assertItemsEqual(expected_ids, result_ids) | 93 | self.assertItemsEqual(expected_ids, result_ids) |
799 | 94 | 94 | ||
800 | 95 | <<<<<<< TREE | ||
801 | 95 | def test_read_on_device(self): | 96 | def test_read_on_device(self): |
802 | 96 | parent = factory.make_Node() | 97 | parent = factory.make_Node() |
803 | 97 | device = factory.make_Device( | 98 | device = factory.make_Device( |
804 | @@ -106,6 +107,20 @@ | |||
805 | 106 | self.assertEqual( | 107 | self.assertEqual( |
806 | 107 | interface.id, json_load_bytes(response.content)[0]['id']) | 108 | interface.id, json_load_bytes(response.content)[0]['id']) |
807 | 108 | 109 | ||
808 | 110 | ======= | ||
809 | 111 | def test_read_on_device(self): | ||
810 | 112 | parent = factory.make_Node() | ||
811 | 113 | device = factory.make_Node( | ||
812 | 114 | owner=self.logged_in_user, installable=False, parent=parent) | ||
813 | 115 | interface = factory.make_Interface( | ||
814 | 116 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
815 | 117 | uri = get_interfaces_uri(device) | ||
816 | 118 | response = self.client.get(uri) | ||
817 | 119 | |||
818 | 120 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
819 | 121 | self.assertEqual(interface.id, json.loads(response.content)[0]['id']) | ||
820 | 122 | |||
821 | 123 | >>>>>>> MERGE-SOURCE | ||
822 | 109 | def test_create_physical(self): | 124 | def test_create_physical(self): |
823 | 110 | self.become_admin() | 125 | self.become_admin() |
824 | 111 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): | 126 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): |
825 | @@ -139,6 +154,7 @@ | |||
826 | 139 | "enabled": Equals(True), | 154 | "enabled": Equals(True), |
827 | 140 | })) | 155 | })) |
828 | 141 | 156 | ||
829 | 157 | <<<<<<< TREE | ||
830 | 142 | def test_create_physical_on_device(self): | 158 | def test_create_physical_on_device(self): |
831 | 143 | parent = factory.make_Node() | 159 | parent = factory.make_Node() |
832 | 144 | device = factory.make_Device( | 160 | device = factory.make_Device( |
833 | @@ -172,6 +188,41 @@ | |||
834 | 172 | "enabled": Equals(True), | 188 | "enabled": Equals(True), |
835 | 173 | })) | 189 | })) |
836 | 174 | 190 | ||
837 | 191 | ======= | ||
838 | 192 | def test_create_physical_on_device(self): | ||
839 | 193 | parent = factory.make_Node() | ||
840 | 194 | device = factory.make_Node( | ||
841 | 195 | owner=self.logged_in_user, installable=False, parent=parent) | ||
842 | 196 | mac = factory.make_mac_address() | ||
843 | 197 | name = factory.make_name("eth") | ||
844 | 198 | vlan = factory.make_VLAN() | ||
845 | 199 | tags = [ | ||
846 | 200 | factory.make_name("tag") | ||
847 | 201 | for _ in range(3) | ||
848 | 202 | ] | ||
849 | 203 | uri = get_interfaces_uri(device) | ||
850 | 204 | response = self.client.post(uri, { | ||
851 | 205 | "op": "create_physical", | ||
852 | 206 | "mac_address": mac, | ||
853 | 207 | "name": name, | ||
854 | 208 | "vlan": vlan.id, | ||
855 | 209 | "tags": ",".join(tags), | ||
856 | 210 | }) | ||
857 | 211 | |||
858 | 212 | self.assertEqual( | ||
859 | 213 | httplib.OK, response.status_code, response.content) | ||
860 | 214 | self.assertThat(json.loads(response.content), ContainsDict({ | ||
861 | 215 | "mac_address": Equals(mac), | ||
862 | 216 | "name": Equals(name), | ||
863 | 217 | "vlan": ContainsDict({ | ||
864 | 218 | "id": Equals(vlan.id), | ||
865 | 219 | }), | ||
866 | 220 | "type": Equals("physical"), | ||
867 | 221 | "tags": Equals(tags), | ||
868 | 222 | "enabled": Equals(True), | ||
869 | 223 | })) | ||
870 | 224 | |||
871 | 225 | >>>>>>> MERGE-SOURCE | ||
872 | 175 | def test_create_physical_disabled(self): | 226 | def test_create_physical_disabled(self): |
873 | 176 | self.become_admin() | 227 | self.become_admin() |
874 | 177 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): | 228 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): |
875 | @@ -331,6 +382,7 @@ | |||
876 | 331 | parent_2_iface.name, | 382 | parent_2_iface.name, |
877 | 332 | ], parsed_interface['parents']) | 383 | ], parsed_interface['parents']) |
878 | 333 | 384 | ||
879 | 385 | <<<<<<< TREE | ||
880 | 334 | def test_create_bond_404_on_device(self): | 386 | def test_create_bond_404_on_device(self): |
881 | 335 | parent = factory.make_Node() | 387 | parent = factory.make_Node() |
882 | 336 | device = factory.make_Node( | 388 | device = factory.make_Node( |
883 | @@ -343,6 +395,19 @@ | |||
884 | 343 | self.assertEqual( | 395 | self.assertEqual( |
885 | 344 | http.client.NOT_FOUND, response.status_code, response.content) | 396 | http.client.NOT_FOUND, response.status_code, response.content) |
886 | 345 | 397 | ||
887 | 398 | ======= | ||
888 | 399 | def test_create_bond_404_on_device(self): | ||
889 | 400 | parent = factory.make_Node() | ||
890 | 401 | device = factory.make_Node( | ||
891 | 402 | owner=self.logged_in_user, installable=False, parent=parent) | ||
892 | 403 | uri = get_interfaces_uri(device) | ||
893 | 404 | response = self.client.post(uri, { | ||
894 | 405 | "op": "create_bond", | ||
895 | 406 | }) | ||
896 | 407 | self.assertEqual( | ||
897 | 408 | httplib.NOT_FOUND, response.status_code, response.content) | ||
898 | 409 | |||
899 | 410 | >>>>>>> MERGE-SOURCE | ||
900 | 346 | def test_create_bond_requires_admin(self): | 411 | def test_create_bond_requires_admin(self): |
901 | 347 | node = factory.make_Node() | 412 | node = factory.make_Node() |
902 | 348 | vlan = factory.make_VLAN() | 413 | vlan = factory.make_VLAN() |
903 | @@ -447,6 +512,7 @@ | |||
904 | 447 | "tags": Equals(tags), | 512 | "tags": Equals(tags), |
905 | 448 | })) | 513 | })) |
906 | 449 | 514 | ||
907 | 515 | <<<<<<< TREE | ||
908 | 450 | def test_create_vlan_404_on_device(self): | 516 | def test_create_vlan_404_on_device(self): |
909 | 451 | parent = factory.make_Node() | 517 | parent = factory.make_Node() |
910 | 452 | device = factory.make_Node( | 518 | device = factory.make_Node( |
911 | @@ -459,6 +525,19 @@ | |||
912 | 459 | self.assertEqual( | 525 | self.assertEqual( |
913 | 460 | http.client.NOT_FOUND, response.status_code, response.content) | 526 | http.client.NOT_FOUND, response.status_code, response.content) |
914 | 461 | 527 | ||
915 | 528 | ======= | ||
916 | 529 | def test_create_vlan_404_on_device(self): | ||
917 | 530 | parent = factory.make_Node() | ||
918 | 531 | device = factory.make_Node( | ||
919 | 532 | owner=self.logged_in_user, installable=False, parent=parent) | ||
920 | 533 | uri = get_interfaces_uri(device) | ||
921 | 534 | response = self.client.post(uri, { | ||
922 | 535 | "op": "create_vlan", | ||
923 | 536 | }) | ||
924 | 537 | self.assertEqual( | ||
925 | 538 | httplib.NOT_FOUND, response.status_code, response.content) | ||
926 | 539 | |||
927 | 540 | >>>>>>> MERGE-SOURCE | ||
928 | 462 | def test_create_vlan_requires_admin(self): | 541 | def test_create_vlan_requires_admin(self): |
929 | 463 | node = factory.make_Node() | 542 | node = factory.make_Node() |
930 | 464 | untagged_vlan = factory.make_VLAN() | 543 | untagged_vlan = factory.make_VLAN() |
931 | @@ -607,6 +686,7 @@ | |||
932 | 607 | parsed_interface = json_load_bytes(response.content) | 686 | parsed_interface = json_load_bytes(response.content) |
933 | 608 | self.assertEqual(bond0.id, parsed_interface['id']) | 687 | self.assertEqual(bond0.id, parsed_interface['id']) |
934 | 609 | 688 | ||
935 | 689 | <<<<<<< TREE | ||
936 | 610 | def test_read_device_interface(self): | 690 | def test_read_device_interface(self): |
937 | 611 | parent = factory.make_Node() | 691 | parent = factory.make_Node() |
938 | 612 | device = factory.make_Device(parent=parent) | 692 | device = factory.make_Device(parent=parent) |
939 | @@ -619,6 +699,19 @@ | |||
940 | 619 | parsed_interface = json_load_bytes(response.content) | 699 | parsed_interface = json_load_bytes(response.content) |
941 | 620 | self.assertEqual(interface.id, parsed_interface['id']) | 700 | self.assertEqual(interface.id, parsed_interface['id']) |
942 | 621 | 701 | ||
943 | 702 | ======= | ||
944 | 703 | def test_read_device_interface(self): | ||
945 | 704 | parent = factory.make_Node() | ||
946 | 705 | device = factory.make_Node(installable=False, parent=parent) | ||
947 | 706 | interface = factory.make_Interface( | ||
948 | 707 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
949 | 708 | uri = get_interface_uri(interface) | ||
950 | 709 | response = self.client.get(uri) | ||
951 | 710 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
952 | 711 | parsed_interface = json.loads(response.content) | ||
953 | 712 | self.assertEqual(interface.id, parsed_interface['id']) | ||
954 | 713 | |||
955 | 714 | >>>>>>> MERGE-SOURCE | ||
956 | 622 | def test_read_404_when_invalid_id(self): | 715 | def test_read_404_when_invalid_id(self): |
957 | 623 | node = factory.make_Node() | 716 | node = factory.make_Node() |
958 | 624 | uri = reverse( | 717 | uri = reverse( |
959 | @@ -666,6 +759,25 @@ | |||
960 | 666 | self.assertEquals(new_name, parsed_interface["name"]) | 759 | self.assertEquals(new_name, parsed_interface["name"]) |
961 | 667 | self.assertEquals(new_vlan.vid, parsed_interface["vlan"]["vid"]) | 760 | self.assertEquals(new_vlan.vid, parsed_interface["vlan"]["vid"]) |
962 | 668 | 761 | ||
963 | 762 | def test_update_device_physical_interface(self): | ||
964 | 763 | node = factory.make_Node() | ||
965 | 764 | device = factory.make_Node( | ||
966 | 765 | owner=self.logged_in_user, installable=False, parent=node) | ||
967 | 766 | interface = factory.make_Interface( | ||
968 | 767 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
969 | 768 | new_name = factory.make_name("name") | ||
970 | 769 | new_vlan = factory.make_VLAN() | ||
971 | 770 | uri = get_interface_uri(interface) | ||
972 | 771 | response = self.client.put(uri, { | ||
973 | 772 | "name": new_name, | ||
974 | 773 | "vlan": new_vlan.id, | ||
975 | 774 | }) | ||
976 | 775 | self.assertEqual( | ||
977 | 776 | httplib.OK, response.status_code, response.content) | ||
978 | 777 | parsed_interface = json.loads(response.content) | ||
979 | 778 | self.assertEquals(new_name, parsed_interface["name"]) | ||
980 | 779 | self.assertEquals(new_vlan.vid, parsed_interface["vlan"]["vid"]) | ||
981 | 780 | |||
982 | 669 | def test_update_bond_interface(self): | 781 | def test_update_bond_interface(self): |
983 | 670 | self.become_admin() | 782 | self.become_admin() |
984 | 671 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): | 783 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): |
985 | @@ -750,6 +862,7 @@ | |||
986 | 750 | http.client.NO_CONTENT, response.status_code, response.content) | 862 | http.client.NO_CONTENT, response.status_code, response.content) |
987 | 751 | self.assertIsNone(reload_object(interface)) | 863 | self.assertIsNone(reload_object(interface)) |
988 | 752 | 864 | ||
989 | 865 | <<<<<<< TREE | ||
990 | 753 | def test_delete_deletes_device_interface(self): | 866 | def test_delete_deletes_device_interface(self): |
991 | 754 | parent = factory.make_Node() | 867 | parent = factory.make_Node() |
992 | 755 | device = factory.make_Device( | 868 | device = factory.make_Device( |
993 | @@ -762,6 +875,20 @@ | |||
994 | 762 | http.client.NO_CONTENT, response.status_code, response.content) | 875 | http.client.NO_CONTENT, response.status_code, response.content) |
995 | 763 | self.assertIsNone(reload_object(interface)) | 876 | self.assertIsNone(reload_object(interface)) |
996 | 764 | 877 | ||
997 | 878 | ======= | ||
998 | 879 | def test_delete_deletes_device_interface(self): | ||
999 | 880 | parent = factory.make_Node() | ||
1000 | 881 | device = factory.make_Node( | ||
1001 | 882 | owner=self.logged_in_user, installable=False, parent=parent) | ||
1002 | 883 | interface = factory.make_Interface( | ||
1003 | 884 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
1004 | 885 | uri = get_interface_uri(interface) | ||
1005 | 886 | response = self.client.delete(uri) | ||
1006 | 887 | self.assertEqual( | ||
1007 | 888 | httplib.NO_CONTENT, response.status_code, response.content) | ||
1008 | 889 | self.assertIsNone(reload_object(interface)) | ||
1009 | 890 | |||
1010 | 891 | >>>>>>> MERGE-SOURCE | ||
1011 | 765 | def test_delete_403_when_not_admin(self): | 892 | def test_delete_403_when_not_admin(self): |
1012 | 766 | node = factory.make_Node(interface=True) | 893 | node = factory.make_Node(interface=True) |
1013 | 767 | interface = node.get_boot_interface() | 894 | interface = node.get_boot_interface() |
1014 | @@ -827,6 +954,7 @@ | |||
1015 | 827 | "mode": Equals(INTERFACE_LINK_TYPE.DHCP), | 954 | "mode": Equals(INTERFACE_LINK_TYPE.DHCP), |
1016 | 828 | })) | 955 | })) |
1017 | 829 | 956 | ||
1018 | 957 | <<<<<<< TREE | ||
1019 | 830 | def test_link_subnet_creates_link_on_device(self): | 958 | def test_link_subnet_creates_link_on_device(self): |
1020 | 831 | parent = factory.make_Node() | 959 | parent = factory.make_Node() |
1021 | 832 | device = factory.make_Device( | 960 | device = factory.make_Device( |
1022 | @@ -867,6 +995,47 @@ | |||
1023 | 867 | http.client.BAD_REQUEST, response.status_code, | 995 | http.client.BAD_REQUEST, response.status_code, |
1024 | 868 | response.content) | 996 | response.content) |
1025 | 869 | 997 | ||
1026 | 998 | ======= | ||
1027 | 999 | def test_link_subnet_creates_link_on_device(self): | ||
1028 | 1000 | parent = factory.make_Node() | ||
1029 | 1001 | device = factory.make_Node( | ||
1030 | 1002 | owner=self.logged_in_user, installable=False, parent=parent) | ||
1031 | 1003 | interface = factory.make_Interface( | ||
1032 | 1004 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
1033 | 1005 | subnet = factory.make_Subnet(vlan=interface.vlan) | ||
1034 | 1006 | uri = get_interface_uri(interface) | ||
1035 | 1007 | response = self.client.post(uri, { | ||
1036 | 1008 | "op": "link_subnet", | ||
1037 | 1009 | "mode": INTERFACE_LINK_TYPE.STATIC, | ||
1038 | 1010 | "subnet": subnet.id, | ||
1039 | 1011 | }) | ||
1040 | 1012 | self.assertEqual( | ||
1041 | 1013 | httplib.OK, response.status_code, response.content) | ||
1042 | 1014 | parsed_response = json.loads(response.content) | ||
1043 | 1015 | self.assertThat( | ||
1044 | 1016 | parsed_response["links"][0], ContainsDict({ | ||
1045 | 1017 | "mode": Equals(INTERFACE_LINK_TYPE.STATIC), | ||
1046 | 1018 | })) | ||
1047 | 1019 | |||
1048 | 1020 | def test_link_subnet_on_device_only_allows_static(self): | ||
1049 | 1021 | parent = factory.make_Node() | ||
1050 | 1022 | device = factory.make_Node( | ||
1051 | 1023 | owner=self.logged_in_user, installable=False, parent=parent) | ||
1052 | 1024 | interface = factory.make_Interface( | ||
1053 | 1025 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
1054 | 1026 | for link_type in [ | ||
1055 | 1027 | INTERFACE_LINK_TYPE.AUTO, | ||
1056 | 1028 | INTERFACE_LINK_TYPE.DHCP, | ||
1057 | 1029 | INTERFACE_LINK_TYPE.LINK_UP]: | ||
1058 | 1030 | uri = get_interface_uri(interface) | ||
1059 | 1031 | response = self.client.post(uri, { | ||
1060 | 1032 | "op": "link_subnet", | ||
1061 | 1033 | "mode": link_type, | ||
1062 | 1034 | }) | ||
1063 | 1035 | self.assertEqual( | ||
1064 | 1036 | httplib.BAD_REQUEST, response.status_code, response.content) | ||
1065 | 1037 | |||
1066 | 1038 | >>>>>>> MERGE-SOURCE | ||
1067 | 870 | def test_link_subnet_raises_error(self): | 1039 | def test_link_subnet_raises_error(self): |
1068 | 871 | self.become_admin() | 1040 | self.become_admin() |
1069 | 872 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): | 1041 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): |
1070 | @@ -942,6 +1111,7 @@ | |||
1071 | 942 | http.client.OK, response.status_code, response.content) | 1111 | http.client.OK, response.status_code, response.content) |
1072 | 943 | self.assertIsNone(reload_object(dhcp_ip)) | 1112 | self.assertIsNone(reload_object(dhcp_ip)) |
1073 | 944 | 1113 | ||
1074 | 1114 | <<<<<<< TREE | ||
1075 | 945 | def test_unlink_subnet_deletes_link_on_device(self): | 1115 | def test_unlink_subnet_deletes_link_on_device(self): |
1076 | 946 | parent = factory.make_Node() | 1116 | parent = factory.make_Node() |
1077 | 947 | device = factory.make_Device( | 1117 | device = factory.make_Device( |
1078 | @@ -961,6 +1131,27 @@ | |||
1079 | 961 | http.client.OK, response.status_code, response.content) | 1131 | http.client.OK, response.status_code, response.content) |
1080 | 962 | self.assertIsNone(reload_object(static_ip)) | 1132 | self.assertIsNone(reload_object(static_ip)) |
1081 | 963 | 1133 | ||
1082 | 1134 | ======= | ||
1083 | 1135 | def test_unlink_subnet_deletes_link_on_device(self): | ||
1084 | 1136 | parent = factory.make_Node() | ||
1085 | 1137 | device = factory.make_Node( | ||
1086 | 1138 | owner=self.logged_in_user, installable=False, parent=parent) | ||
1087 | 1139 | interface = factory.make_Interface( | ||
1088 | 1140 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
1089 | 1141 | subnet = factory.make_Subnet() | ||
1090 | 1142 | static_ip = factory.make_StaticIPAddress( | ||
1091 | 1143 | alloc_type=IPADDRESS_TYPE.STICKY, | ||
1092 | 1144 | subnet=subnet, interface=interface) | ||
1093 | 1145 | uri = get_interface_uri(interface) | ||
1094 | 1146 | response = self.client.post(uri, { | ||
1095 | 1147 | "op": "unlink_subnet", | ||
1096 | 1148 | "id": static_ip.id, | ||
1097 | 1149 | }) | ||
1098 | 1150 | self.assertEqual( | ||
1099 | 1151 | httplib.OK, response.status_code, response.content) | ||
1100 | 1152 | self.assertIsNone(reload_object(static_ip)) | ||
1101 | 1153 | |||
1102 | 1154 | >>>>>>> MERGE-SOURCE | ||
1103 | 964 | def test_unlink_subnet_raises_error(self): | 1155 | def test_unlink_subnet_raises_error(self): |
1104 | 965 | self.become_admin() | 1156 | self.become_admin() |
1105 | 966 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): | 1157 | for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN): |
1106 | 967 | 1158 | ||
1107 | === modified file 'src/maasserver/api/tests/test_raid.py' | |||
1108 | === modified file 'src/maasserver/api/tests/test_vlans.py' | |||
1109 | --- src/maasserver/api/tests/test_vlans.py 2015-12-03 16:37:58 +0000 | |||
1110 | +++ src/maasserver/api/tests/test_vlans.py 2016-01-10 08:29:39 +0000 | |||
1111 | @@ -76,6 +76,7 @@ | |||
1112 | 76 | "vid": vid, | 76 | "vid": vid, |
1113 | 77 | "mtu": mtu, | 77 | "mtu": mtu, |
1114 | 78 | }) | 78 | }) |
1115 | 79 | <<<<<<< TREE | ||
1116 | 79 | self.assertEqual( | 80 | self.assertEqual( |
1117 | 80 | http.client.OK, response.status_code, response.content) | 81 | http.client.OK, response.status_code, response.content) |
1118 | 81 | response_data = json.loads( | 82 | response_data = json.loads( |
1119 | @@ -83,6 +84,12 @@ | |||
1120 | 83 | self.assertEqual(vlan_name, response_data['name']) | 84 | self.assertEqual(vlan_name, response_data['name']) |
1121 | 84 | self.assertEqual(vid, response_data['vid']) | 85 | self.assertEqual(vid, response_data['vid']) |
1122 | 85 | self.assertEqual(mtu, response_data['mtu']) | 86 | self.assertEqual(mtu, response_data['mtu']) |
1123 | 87 | ======= | ||
1124 | 88 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
1125 | 89 | self.assertEqual(vlan_name, json.loads(response.content)['name']) | ||
1126 | 90 | self.assertEqual(vid, json.loads(response.content)['vid']) | ||
1127 | 91 | self.assertEqual(mtu, json.loads(response.content)['mtu']) | ||
1128 | 92 | >>>>>>> MERGE-SOURCE | ||
1129 | 86 | 93 | ||
1130 | 87 | def test_create_admin_only(self): | 94 | def test_create_admin_only(self): |
1131 | 88 | fabric = factory.make_Fabric() | 95 | fabric = factory.make_Fabric() |
1132 | 89 | 96 | ||
1133 | === modified file 'src/maasserver/api/tests/test_volume_groups.py' | |||
1134 | --- src/maasserver/api/tests/test_volume_groups.py 2015-12-03 16:37:58 +0000 | |||
1135 | +++ src/maasserver/api/tests/test_volume_groups.py 2016-01-10 08:29:39 +0000 | |||
1136 | @@ -416,12 +416,19 @@ | |||
1137 | 416 | "uuid": vguuid, | 416 | "uuid": vguuid, |
1138 | 417 | "size": size, | 417 | "size": size, |
1139 | 418 | }) | 418 | }) |
1140 | 419 | <<<<<<< TREE | ||
1141 | 419 | self.assertEqual( | 420 | self.assertEqual( |
1142 | 420 | http.client.OK, response.status_code, response.content) | 421 | http.client.OK, response.status_code, response.content) |
1143 | 421 | logical_volume = json.loads( | 422 | logical_volume = json.loads( |
1144 | 422 | response.content.decode(settings.DEFAULT_CHARSET)) | 423 | response.content.decode(settings.DEFAULT_CHARSET)) |
1145 | 423 | expected_size = round_size_to_nearest_block( | 424 | expected_size = round_size_to_nearest_block( |
1146 | 424 | size, PARTITION_ALIGNMENT_SIZE, False) | 425 | size, PARTITION_ALIGNMENT_SIZE, False) |
1147 | 426 | ======= | ||
1148 | 427 | self.assertEqual(httplib.OK, response.status_code, response.content) | ||
1149 | 428 | logical_volume = json.loads(response.content) | ||
1150 | 429 | expected_size = round_size_to_nearest_block( | ||
1151 | 430 | size, PARTITION_ALIGNMENT_SIZE, False) | ||
1152 | 431 | >>>>>>> MERGE-SOURCE | ||
1153 | 425 | self.assertThat(logical_volume, ContainsDict({ | 432 | self.assertThat(logical_volume, ContainsDict({ |
1154 | 426 | "name": Equals("%s-%s" % (volume_group.name, name)), | 433 | "name": Equals("%s-%s" % (volume_group.name, name)), |
1155 | 427 | "uuid": Equals(vguuid), | 434 | "uuid": Equals(vguuid), |
1156 | 428 | 435 | ||
1157 | === modified file 'src/maasserver/api/vlans.py' | |||
1158 | === modified file 'src/maasserver/dns/tests/test_config.py' | |||
1159 | === modified file 'src/maasserver/forms.py' | |||
1160 | === modified file 'src/maasserver/forms_interface_link.py' | |||
1161 | === modified file 'src/maasserver/forms_subnet.py' | |||
1162 | --- src/maasserver/forms_subnet.py 2015-12-23 17:21:20 +0000 | |||
1163 | +++ src/maasserver/forms_subnet.py 2016-01-10 08:29:39 +0000 | |||
1164 | @@ -50,9 +50,16 @@ | |||
1165 | 50 | 50 | ||
1166 | 51 | def clean(self): | 51 | def clean(self): |
1167 | 52 | cleaned_data = super(SubnetForm, self).clean() | 52 | cleaned_data = super(SubnetForm, self).clean() |
1168 | 53 | <<<<<<< TREE | ||
1169 | 53 | # The ArrayField form has a bug which leaves out the first entry. | 54 | # The ArrayField form has a bug which leaves out the first entry. |
1170 | 54 | if 'dns_servers' in self.data and self.data['dns_servers'] != '': | 55 | if 'dns_servers' in self.data and self.data['dns_servers'] != '': |
1171 | 55 | cleaned_data['dns_servers'] = self.data.getlist('dns_servers') | 56 | cleaned_data['dns_servers'] = self.data.getlist('dns_servers') |
1172 | 57 | ======= | ||
1173 | 58 | # The djorm_pgarray.fields.ArrayField form has a bug which leaves out | ||
1174 | 59 | # the first entry. | ||
1175 | 60 | if 'dns_servers' in self.data and self.data['dns_servers'] != '': | ||
1176 | 61 | cleaned_data['dns_servers'] = self.data.getlist('dns_servers') | ||
1177 | 62 | >>>>>>> MERGE-SOURCE | ||
1178 | 56 | cleaned_data = self._clean_name(cleaned_data) | 63 | cleaned_data = self._clean_name(cleaned_data) |
1179 | 57 | cleaned_data = self._clean_dns_servers(cleaned_data) | 64 | cleaned_data = self._clean_dns_servers(cleaned_data) |
1180 | 58 | if self.instance.id is None: | 65 | if self.instance.id is None: |
1181 | 59 | 66 | ||
1182 | === modified file 'src/maasserver/management/commands/_config.py' | |||
1183 | === modified file 'src/maasserver/management/commands/tests/test_config.py' | |||
1184 | === modified file 'src/maasserver/migrations/south/migrations/0181_initial_storage_layouts.py' | |||
1185 | === modified file 'src/maasserver/migrations/south/migrations/0182_initial_networking_layout.py' | |||
1186 | === modified file 'src/maasserver/models/__init__.py' | |||
1187 | --- src/maasserver/models/__init__.py 2016-01-06 22:39:26 +0000 | |||
1188 | +++ src/maasserver/models/__init__.py 2016-01-10 08:29:39 +0000 | |||
1189 | @@ -275,6 +275,7 @@ | |||
1190 | 275 | raise NotImplementedError( | 275 | raise NotImplementedError( |
1191 | 276 | 'Invalid permission check (invalid permission name: %s).' % | 276 | 'Invalid permission check (invalid permission name: %s).' % |
1192 | 277 | perm) | 277 | perm) |
1193 | 278 | <<<<<<< TREE | ||
1194 | 278 | elif isinstance(obj, Interface): | 279 | elif isinstance(obj, Interface): |
1195 | 279 | if perm == NODE_PERMISSION.VIEW: | 280 | if perm == NODE_PERMISSION.VIEW: |
1196 | 280 | # Any registered user can view a interface regardless | 281 | # Any registered user can view a interface regardless |
1197 | @@ -306,6 +307,28 @@ | |||
1198 | 306 | 'Invalid permission check (invalid permission name: %s).' % | 307 | 'Invalid permission check (invalid permission name: %s).' % |
1199 | 307 | perm) | 308 | perm) |
1200 | 308 | elif isinstance(obj, (Fabric, FanNetwork, Subnet, Space)): | 309 | elif isinstance(obj, (Fabric, FanNetwork, Subnet, Space)): |
1201 | 310 | ======= | ||
1202 | 311 | elif isinstance(obj, Interface): | ||
1203 | 312 | if perm == NODE_PERMISSION.VIEW: | ||
1204 | 313 | # Any registered user can view a interface regardless | ||
1205 | 314 | # of its state. | ||
1206 | 315 | return True | ||
1207 | 316 | elif perm in NODE_PERMISSION.EDIT: | ||
1208 | 317 | # A device can be editted by its owner a node must be admin. | ||
1209 | 318 | node = obj.get_node() | ||
1210 | 319 | if node is None or node.installable: | ||
1211 | 320 | return user.is_superuser | ||
1212 | 321 | else: | ||
1213 | 322 | return node.owner == user | ||
1214 | 323 | elif perm in NODE_PERMISSION.ADMIN: | ||
1215 | 324 | # Admin permission is solely granted to superusers. | ||
1216 | 325 | return user.is_superuser | ||
1217 | 326 | else: | ||
1218 | 327 | raise NotImplementedError( | ||
1219 | 328 | 'Invalid permission check (invalid permission name: %s).' % | ||
1220 | 329 | perm) | ||
1221 | 330 | elif isinstance(obj, (Fabric, FanNetwork, Subnet, Space)): | ||
1222 | 331 | >>>>>>> MERGE-SOURCE | ||
1223 | 309 | if perm == NODE_PERMISSION.VIEW: | 332 | if perm == NODE_PERMISSION.VIEW: |
1224 | 310 | # Any registered user can view a fabric or interface regardless | 333 | # Any registered user can view a fabric or interface regardless |
1225 | 311 | # of its state. | 334 | # of its state. |
1226 | 312 | 335 | ||
1227 | === modified file 'src/maasserver/models/blockdevice.py' | |||
1228 | === modified file 'src/maasserver/models/config.py' | |||
1229 | === modified file 'src/maasserver/models/filesystemgroup.py' | |||
1230 | === modified file 'src/maasserver/models/interface.py' | |||
1231 | --- src/maasserver/models/interface.py 2016-01-04 20:14:42 +0000 | |||
1232 | +++ src/maasserver/models/interface.py 2016-01-10 08:29:39 +0000 | |||
1233 | @@ -1126,10 +1126,17 @@ | |||
1234 | 1126 | auto_ip, exclude_addresses) | 1126 | auto_ip, exclude_addresses) |
1235 | 1127 | if ngi is not None: | 1127 | if ngi is not None: |
1236 | 1128 | affected_nodegroups.add(ngi.nodegroup) | 1128 | affected_nodegroups.add(ngi.nodegroup) |
1237 | 1129 | <<<<<<< TREE | ||
1238 | 1129 | if assigned_ip is not None: | 1130 | if assigned_ip is not None: |
1239 | 1130 | assigned_addresses.append(assigned_ip) | 1131 | assigned_addresses.append(assigned_ip) |
1240 | 1131 | exclude_addresses.add(str(assigned_ip.ip)) | 1132 | exclude_addresses.add(str(assigned_ip.ip)) |
1241 | 1132 | self._update_dns_zones() | 1133 | self._update_dns_zones() |
1242 | 1134 | ======= | ||
1243 | 1135 | if assigned_ip is not None: | ||
1244 | 1136 | assigned_addresses.append(assigned_ip) | ||
1245 | 1137 | exclude_addresses.add(unicode(assigned_ip.ip)) | ||
1246 | 1138 | self._update_dns_zones(affected_nodegroups) | ||
1247 | 1139 | >>>>>>> MERGE-SOURCE | ||
1248 | 1133 | return assigned_addresses | 1140 | return assigned_addresses |
1249 | 1134 | 1141 | ||
1250 | 1135 | def _claim_auto_ip(self, auto_ip, exclude_addresses=[]): | 1142 | def _claim_auto_ip(self, auto_ip, exclude_addresses=[]): |
1251 | @@ -1323,28 +1330,53 @@ | |||
1252 | 1323 | if ngi is not None and ngi.subnet is not None: | 1330 | if ngi is not None and ngi.subnet is not None: |
1253 | 1324 | discovered_subnets.append(ngi.subnet) | 1331 | discovered_subnets.append(ngi.subnet) |
1254 | 1325 | 1332 | ||
1277 | 1326 | if len(discovered_subnets) == 0: | 1333 | <<<<<<< TREE |
1278 | 1327 | node = self.node | 1334 | if len(discovered_subnets) == 0: |
1279 | 1328 | if parent is not None: | 1335 | node = self.node |
1280 | 1329 | node = parent | 1336 | if parent is not None: |
1281 | 1330 | if node is None: | 1337 | node = parent |
1282 | 1331 | hostname = "<unknown>" | 1338 | if node is None: |
1283 | 1332 | else: | 1339 | hostname = "<unknown>" |
1284 | 1333 | hostname = "'%s'" % node.hostname | 1340 | else: |
1285 | 1334 | log_string = ( | 1341 | hostname = "'%s'" % node.hostname |
1286 | 1335 | "%s: Attempted to claim a static IP address, but no " | 1342 | log_string = ( |
1287 | 1336 | "associated subnet could be found. (Recommission node %s " | 1343 | "%s: Attempted to claim a static IP address, but no " |
1288 | 1337 | "in order for MAAS to discover the subnet.)" % | 1344 | "associated subnet could be found. (Recommission node %s " |
1289 | 1338 | (self.get_log_string(), hostname) | 1345 | "in order for MAAS to discover the subnet.)" % |
1290 | 1339 | ) | 1346 | (self.get_log_string(), hostname) |
1291 | 1340 | maaslog.warning(log_string) | 1347 | ) |
1292 | 1341 | raise StaticIPAddressExhaustion(log_string) | 1348 | maaslog.warning(log_string) |
1293 | 1342 | 1349 | raise StaticIPAddressExhaustion(log_string) | |
1294 | 1343 | # This must be a set because it is highly possible that the parent | 1350 | |
1295 | 1344 | # has multiple subnets on the same interface or same subnet on multiple | 1351 | # This must be a set because it is highly possible that the parent |
1296 | 1345 | # interfaces. We only want to allocate one ip address per subnet. | 1352 | # has multiple subnets on the same interface or same subnet on multiple |
1297 | 1346 | discovered_subnets = set(discovered_subnets) | 1353 | # interfaces. We only want to allocate one ip address per subnet. |
1298 | 1347 | 1354 | discovered_subnets = set(discovered_subnets) | |
1299 | 1355 | |||
1300 | 1356 | ======= | ||
1301 | 1357 | # This must be a set because it is highly possible that the parent | ||
1302 | 1358 | # has multiple subnets on the same interface or same subnet on multiple | ||
1303 | 1359 | # interfaces. We only want to allocate one ip address per subnet. | ||
1304 | 1360 | discovered_subnets = set(discovered_subnets) | ||
1305 | 1361 | |||
1306 | 1362 | if len(discovered_subnets) == 0: | ||
1307 | 1363 | node = self.node | ||
1308 | 1364 | if parent is not None: | ||
1309 | 1365 | node = parent | ||
1310 | 1366 | if node is None: | ||
1311 | 1367 | hostname = "<unknown>" | ||
1312 | 1368 | else: | ||
1313 | 1369 | hostname = "'%s'" % node.hostname | ||
1314 | 1370 | log_string = ( | ||
1315 | 1371 | "%s: Attempted to claim a static IP address, but no " | ||
1316 | 1372 | "associated subnet could be found. (Recommission node %s " | ||
1317 | 1373 | "in order for MAAS to discover the subnet.)" % | ||
1318 | 1374 | (self.get_log_string(), hostname) | ||
1319 | 1375 | ) | ||
1320 | 1376 | maaslog.warning(log_string) | ||
1321 | 1377 | raise StaticIPAddressExhaustion(log_string) | ||
1322 | 1378 | |||
1323 | 1379 | >>>>>>> MERGE-SOURCE | ||
1324 | 1348 | if requested_address is None: | 1380 | if requested_address is None: |
1325 | 1349 | # No requested address so claim a STATIC IP on all DISCOVERED | 1381 | # No requested address so claim a STATIC IP on all DISCOVERED |
1326 | 1350 | # subnets for this interface. | 1382 | # subnets for this interface. |
1327 | 1351 | 1383 | ||
1328 | === modified file 'src/maasserver/models/migrations/populate_subnets_helper.py' | |||
1329 | === modified file 'src/maasserver/models/node.py' | |||
1330 | === modified file 'src/maasserver/models/nodegroupinterface.py' | |||
1331 | === modified file 'src/maasserver/models/partition.py' | |||
1332 | === modified file 'src/maasserver/models/partitiontable.py' | |||
1333 | === modified file 'src/maasserver/models/staticipaddress.py' | |||
1334 | --- src/maasserver/models/staticipaddress.py 2016-01-07 01:45:15 +0000 | |||
1335 | +++ src/maasserver/models/staticipaddress.py 2016-01-10 08:29:39 +0000 | |||
1336 | @@ -153,8 +153,13 @@ | |||
1337 | 153 | self, network, static_range_low, static_range_high, | 153 | self, network, static_range_low, static_range_high, |
1338 | 154 | dynamic_range_low, dynamic_range_high, | 154 | dynamic_range_low, dynamic_range_high, |
1339 | 155 | alloc_type=IPADDRESS_TYPE.AUTO, user=None, | 155 | alloc_type=IPADDRESS_TYPE.AUTO, user=None, |
1340 | 156 | <<<<<<< TREE | ||
1341 | 156 | requested_address=None, subnet=None, | 157 | requested_address=None, subnet=None, |
1342 | 157 | exclude_addresses=[], in_use_ipset=set()): | 158 | exclude_addresses=[], in_use_ipset=set()): |
1343 | 159 | ======= | ||
1344 | 160 | requested_address=None, hostname=None, subnet=None, | ||
1345 | 161 | exclude_addresses=[], in_use_ipset=set()): | ||
1346 | 162 | >>>>>>> MERGE-SOURCE | ||
1347 | 158 | """Return a new StaticIPAddress. | 163 | """Return a new StaticIPAddress. |
1348 | 159 | 164 | ||
1349 | 160 | :param network: The network the address should be allocated in. | 165 | :param network: The network the address should be allocated in. |
1350 | 161 | 166 | ||
1351 | === modified file 'src/maasserver/models/subnet.py' | |||
1352 | === modified file 'src/maasserver/models/tests/test_blockdevice.py' | |||
1353 | === modified file 'src/maasserver/models/tests/test_filesystem.py' | |||
1354 | === modified file 'src/maasserver/models/tests/test_filesystemgroup.py' | |||
1355 | --- src/maasserver/models/tests/test_filesystemgroup.py 2015-12-04 20:46:31 +0000 | |||
1356 | +++ src/maasserver/models/tests/test_filesystemgroup.py 2016-01-10 08:29:39 +0000 | |||
1357 | @@ -330,9 +330,17 @@ | |||
1358 | 330 | partition_table = factory.make_PartitionTable( | 330 | partition_table = factory.make_PartitionTable( |
1359 | 331 | block_device=block_device) | 331 | block_device=block_device) |
1360 | 332 | partition_one = factory.make_Partition( | 332 | partition_one = factory.make_Partition( |
1361 | 333 | <<<<<<< TREE | ||
1362 | 333 | partition_table=partition_table, size=device_size // 2) | 334 | partition_table=partition_table, size=device_size // 2) |
1363 | 335 | ======= | ||
1364 | 336 | partition_table=partition_table, size=device_size / 2) | ||
1365 | 337 | >>>>>>> MERGE-SOURCE | ||
1366 | 334 | partition_two = factory.make_Partition( | 338 | partition_two = factory.make_Partition( |
1367 | 339 | <<<<<<< TREE | ||
1368 | 335 | partition_table=partition_table, size=device_size // 2) | 340 | partition_table=partition_table, size=device_size // 2) |
1369 | 341 | ======= | ||
1370 | 342 | partition_table=partition_table, size=device_size / 2) | ||
1371 | 343 | >>>>>>> MERGE-SOURCE | ||
1372 | 336 | cache_set = factory.make_CacheSet(partition=partition_one) | 344 | cache_set = factory.make_CacheSet(partition=partition_one) |
1373 | 337 | filesystem_backing = factory.make_Filesystem( | 345 | filesystem_backing = factory.make_Filesystem( |
1374 | 338 | fstype=FILESYSTEM_TYPE.BCACHE_BACKING, partition=partition_two) | 346 | fstype=FILESYSTEM_TYPE.BCACHE_BACKING, partition=partition_two) |
1375 | @@ -662,9 +670,15 @@ | |||
1376 | 662 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device)) | 670 | fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device)) |
1377 | 663 | fsgroup = factory.make_FilesystemGroup( | 671 | fsgroup = factory.make_FilesystemGroup( |
1378 | 664 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, filesystems=filesystems) | 672 | group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, filesystems=filesystems) |
1379 | 673 | <<<<<<< TREE | ||
1380 | 665 | # Reserve one extent per filesystem for LVM headers. | 674 | # Reserve one extent per filesystem for LVM headers. |
1381 | 666 | extents = (total_size // LVM_PE_SIZE) - 3 | 675 | extents = (total_size // LVM_PE_SIZE) - 3 |
1382 | 667 | self.assertEqual(extents * LVM_PE_SIZE, fsgroup.get_size()) | 676 | self.assertEqual(extents * LVM_PE_SIZE, fsgroup.get_size()) |
1383 | 677 | ======= | ||
1384 | 678 | # Reserve one extent per filesystem for LVM headers. | ||
1385 | 679 | extents = int(total_size / LVM_PE_SIZE) - 3 | ||
1386 | 680 | self.assertEquals(extents * LVM_PE_SIZE, fsgroup.get_size()) | ||
1387 | 681 | >>>>>>> MERGE-SOURCE | ||
1388 | 668 | 682 | ||
1389 | 669 | def test_get_size_returns_0_if_raid_without_filesystems(self): | 683 | def test_get_size_returns_0_if_raid_without_filesystems(self): |
1390 | 670 | fsgroup = FilesystemGroup(group_type=FILESYSTEM_GROUP_TYPE.RAID_0) | 684 | fsgroup = FilesystemGroup(group_type=FILESYSTEM_GROUP_TYPE.RAID_0) |
1391 | @@ -1315,7 +1329,11 @@ | |||
1392 | 1315 | block_device=block_device) | 1329 | block_device=block_device) |
1393 | 1316 | # Size should be 50 GB minus one extent per filesystem for LVM headers. | 1330 | # Size should be 50 GB minus one extent per filesystem for LVM headers. |
1394 | 1317 | pv_total_size = 50 * 1000 ** 3 | 1331 | pv_total_size = 50 * 1000 ** 3 |
1395 | 1332 | <<<<<<< TREE | ||
1396 | 1318 | extents = (pv_total_size // LVM_PE_SIZE) - 5 | 1333 | extents = (pv_total_size // LVM_PE_SIZE) - 5 |
1397 | 1334 | ======= | ||
1398 | 1335 | extents = int(pv_total_size / LVM_PE_SIZE) - 5 | ||
1399 | 1336 | >>>>>>> MERGE-SOURCE | ||
1400 | 1319 | usable_size = extents * LVM_PE_SIZE | 1337 | usable_size = extents * LVM_PE_SIZE |
1401 | 1320 | self.assertEqual(usable_size, fsgroup.get_size()) | 1338 | self.assertEqual(usable_size, fsgroup.get_size()) |
1402 | 1321 | 1339 | ||
1403 | @@ -2050,7 +2068,11 @@ | |||
1404 | 2050 | node=node, size=device_size)).add_partition() | 2068 | node=node, size=device_size)).add_partition() |
1405 | 2051 | for _ in range(4) | 2069 | for _ in range(4) |
1406 | 2052 | ] | 2070 | ] |
1407 | 2071 | <<<<<<< TREE | ||
1408 | 2053 | uuid = str(uuid4()) | 2072 | uuid = str(uuid4()) |
1409 | 2073 | ======= | ||
1410 | 2074 | uuid = unicode(uuid4()) | ||
1411 | 2075 | >>>>>>> MERGE-SOURCE | ||
1412 | 2054 | raid = RAID.objects.create_raid( | 2076 | raid = RAID.objects.create_raid( |
1413 | 2055 | name='md0', | 2077 | name='md0', |
1414 | 2056 | level=FILESYSTEM_GROUP_TYPE.RAID_6, | 2078 | level=FILESYSTEM_GROUP_TYPE.RAID_6, |
1415 | @@ -2096,7 +2118,11 @@ | |||
1416 | 2096 | node=node, size=device_size)).add_partition() | 2118 | node=node, size=device_size)).add_partition() |
1417 | 2097 | for _ in range(10) | 2119 | for _ in range(10) |
1418 | 2098 | ] | 2120 | ] |
1419 | 2121 | <<<<<<< TREE | ||
1420 | 2099 | uuid = str(uuid4()) | 2122 | uuid = str(uuid4()) |
1421 | 2123 | ======= | ||
1422 | 2124 | uuid = unicode(uuid4()) | ||
1423 | 2125 | >>>>>>> MERGE-SOURCE | ||
1424 | 2100 | raid = RAID.objects.create_raid( | 2126 | raid = RAID.objects.create_raid( |
1425 | 2101 | name='md0', | 2127 | name='md0', |
1426 | 2102 | level=FILESYSTEM_GROUP_TYPE.RAID_5, | 2128 | level=FILESYSTEM_GROUP_TYPE.RAID_5, |
1427 | @@ -2117,7 +2143,11 @@ | |||
1428 | 2117 | node=node, size=device_size)).add_partition() | 2143 | node=node, size=device_size)).add_partition() |
1429 | 2118 | for _ in range(10) | 2144 | for _ in range(10) |
1430 | 2119 | ] | 2145 | ] |
1431 | 2146 | <<<<<<< TREE | ||
1432 | 2120 | uuid = str(uuid4()) | 2147 | uuid = str(uuid4()) |
1433 | 2148 | ======= | ||
1434 | 2149 | uuid = unicode(uuid4()) | ||
1435 | 2150 | >>>>>>> MERGE-SOURCE | ||
1436 | 2121 | raid = RAID.objects.create_raid( | 2151 | raid = RAID.objects.create_raid( |
1437 | 2122 | name='md0', | 2152 | name='md0', |
1438 | 2123 | level=FILESYSTEM_GROUP_TYPE.RAID_5, | 2153 | level=FILESYSTEM_GROUP_TYPE.RAID_5, |
1439 | @@ -2241,7 +2271,11 @@ | |||
1440 | 2241 | backing_partition = factory.make_PartitionTable( | 2271 | backing_partition = factory.make_PartitionTable( |
1441 | 2242 | block_device=factory.make_PhysicalBlockDevice( | 2272 | block_device=factory.make_PhysicalBlockDevice( |
1442 | 2243 | node=node, size=backing_size)).add_partition() | 2273 | node=node, size=backing_size)).add_partition() |
1443 | 2274 | <<<<<<< TREE | ||
1444 | 2244 | uuid = str(uuid4()) | 2275 | uuid = str(uuid4()) |
1445 | 2276 | ======= | ||
1446 | 2277 | uuid = unicode(uuid4()) | ||
1447 | 2278 | >>>>>>> MERGE-SOURCE | ||
1448 | 2245 | bcache = Bcache.objects.create_bcache( | 2279 | bcache = Bcache.objects.create_bcache( |
1449 | 2246 | name='bcache0', | 2280 | name='bcache0', |
1450 | 2247 | uuid=uuid, | 2281 | uuid=uuid, |
1451 | 2248 | 2282 | ||
1452 | === modified file 'src/maasserver/models/tests/test_interface.py' | |||
1453 | --- src/maasserver/models/tests/test_interface.py 2015-12-29 21:52:07 +0000 | |||
1454 | +++ src/maasserver/models/tests/test_interface.py 2016-01-10 08:29:39 +0000 | |||
1455 | @@ -1070,6 +1070,38 @@ | |||
1456 | 1070 | ngi3.subnet.cidr))), | 1070 | ngi3.subnet.cidr))), |
1457 | 1071 | )) | 1071 | )) |
1458 | 1072 | 1072 | ||
1459 | 1073 | def test__links_interface_to_vlan_on_existing_subnet_with_logging(self): | ||
1460 | 1074 | ng = factory.make_NodeGroup() | ||
1461 | 1075 | fabric2 = factory.make_Fabric() | ||
1462 | 1076 | fabric3 = factory.make_Fabric() | ||
1463 | 1077 | ngi1 = factory.make_NodeGroupInterface(ng) | ||
1464 | 1078 | ngi2 = factory.make_NodeGroupInterface(ng, fabric=fabric2) | ||
1465 | 1079 | ngi3 = factory.make_NodeGroupInterface(ng, fabric=fabric3) | ||
1466 | 1080 | interface1 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
1467 | 1081 | interface2 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
1468 | 1082 | interface3 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
1469 | 1083 | vlan1 = ngi1.subnet.vlan | ||
1470 | 1084 | vlan2 = ngi2.subnet.vlan | ||
1471 | 1085 | vlan3 = ngi3.subnet.vlan | ||
1472 | 1086 | maaslog = self.patch_autospec(interface_module, "maaslog") | ||
1473 | 1087 | interface1.update_ip_addresses([ngi1.subnet.cidr]) | ||
1474 | 1088 | interface2.update_ip_addresses([ngi2.subnet.cidr]) | ||
1475 | 1089 | interface3.update_ip_addresses([ngi3.subnet.cidr]) | ||
1476 | 1090 | self.assertThat(interface1.vlan, Equals(vlan1)) | ||
1477 | 1091 | self.assertThat(interface2.vlan, Equals(vlan2)) | ||
1478 | 1092 | self.assertThat(interface3.vlan, Equals(vlan3)) | ||
1479 | 1093 | self.assertThat(maaslog.info, MockCallsMatch( | ||
1480 | 1094 | call(("%s: Observed connected to %s via %s." % ( | ||
1481 | 1095 | interface1.get_log_string(), interface1.vlan.fabric.get_name(), | ||
1482 | 1096 | ngi1.subnet.cidr))), | ||
1483 | 1097 | call(("%s: Observed connected to %s via %s." % ( | ||
1484 | 1098 | interface2.get_log_string(), interface2.vlan.fabric.get_name(), | ||
1485 | 1099 | ngi2.subnet.cidr))), | ||
1486 | 1100 | call(("%s: Observed connected to %s via %s." % ( | ||
1487 | 1101 | interface3.get_log_string(), interface3.vlan.fabric.get_name(), | ||
1488 | 1102 | ngi3.subnet.cidr))), | ||
1489 | 1103 | )) | ||
1490 | 1104 | |||
1491 | 1073 | def test__deletes_old_discovered_ip_addresses_on_interface(self): | 1105 | def test__deletes_old_discovered_ip_addresses_on_interface(self): |
1492 | 1074 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 1106 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
1493 | 1075 | # Create existing DISCOVERED IP address on the interface. These should | 1107 | # Create existing DISCOVERED IP address on the interface. These should |
1494 | @@ -2288,60 +2320,150 @@ | |||
1495 | 2288 | self.assertEquals(subnet, observed[0].subnet) | 2320 | self.assertEquals(subnet, observed[0].subnet) |
1496 | 2289 | self.assertTrue( | 2321 | self.assertTrue( |
1497 | 2290 | IPAddress(observed[0].ip) in ( | 2322 | IPAddress(observed[0].ip) in ( |
1552 | 2291 | IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)), | 2323 | <<<<<<< TREE |
1553 | 2292 | "Assigned IP address %s should be inside the static range " | 2324 | IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)), |
1554 | 2293 | "on the cluster (%s - %s)." % ( | 2325 | "Assigned IP address %s should be inside the static range " |
1555 | 2294 | observed[0].ip, ngi.static_ip_range_low, | 2326 | "on the cluster (%s - %s)." % ( |
1556 | 2295 | ngi.static_ip_range_high)) | 2327 | observed[0].ip, ngi.static_ip_range_low, |
1557 | 2296 | self.assertThat( | 2328 | ngi.static_ip_range_high)) |
1558 | 2297 | IPAddress(observed[0].ip), Not(Equals(IPAddress( | 2329 | self.assertThat( |
1559 | 2298 | ngi.subnet.gateway_ip)))) | 2330 | IPAddress(observed[0].ip), Not(Equals(IPAddress( |
1560 | 2299 | 2331 | ngi.subnet.gateway_ip)))) | |
1561 | 2300 | def test__claim_fails_if_subnet_missing(self): | 2332 | |
1562 | 2301 | from maasserver.dns import config | 2333 | def test__claim_fails_if_subnet_missing(self): |
1563 | 2302 | self.patch_autospec(interface_module, "update_host_maps") | 2334 | from maasserver.dns import config |
1564 | 2303 | self.patch_autospec(config, "dns_update_by_node") | 2335 | self.patch_autospec(interface_module, "update_host_maps") |
1565 | 2304 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 2336 | self.patch_autospec(config, "dns_update_by_node") |
1566 | 2305 | subnet = factory.make_Subnet(vlan=interface.vlan) | 2337 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
1567 | 2306 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | 2338 | subnet = factory.make_Subnet(vlan=interface.vlan) |
1568 | 2307 | factory.make_NodeGroupInterface( | 2339 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) |
1569 | 2308 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS, | 2340 | factory.make_NodeGroupInterface( |
1570 | 2309 | subnet=subnet) | 2341 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS, |
1571 | 2310 | ip = factory.make_StaticIPAddress( | 2342 | subnet=subnet) |
1572 | 2311 | alloc_type=IPADDRESS_TYPE.AUTO, ip="", | 2343 | ip = factory.make_StaticIPAddress( |
1573 | 2312 | subnet=subnet, interface=interface) | 2344 | alloc_type=IPADDRESS_TYPE.AUTO, ip="", |
1574 | 2313 | ip.subnet = None | 2345 | subnet=subnet, interface=interface) |
1575 | 2314 | ip.save() | 2346 | ip.subnet = None |
1576 | 2315 | maaslog = self.patch_autospec(interface_module, "maaslog") | 2347 | ip.save() |
1577 | 2316 | with ExpectedException(StaticIPAddressUnavailable): | 2348 | maaslog = self.patch_autospec(interface_module, "maaslog") |
1578 | 2317 | interface.claim_auto_ips() | 2349 | with ExpectedException(StaticIPAddressUnavailable): |
1579 | 2318 | self.expectThat(maaslog.error, MockCalledOnceWith( | 2350 | interface.claim_auto_ips() |
1580 | 2319 | "Could not find subnet for interface %s." % | 2351 | self.expectThat(maaslog.error, MockCalledOnceWith( |
1581 | 2320 | interface.get_log_string())) | 2352 | "Could not find subnet for interface %s." % |
1582 | 2321 | 2353 | interface.get_log_string())) | |
1583 | 2322 | def test__claim_fails_if_no_static_range(self): | 2354 | |
1584 | 2323 | from maasserver.dns import config | 2355 | def test__claim_fails_if_no_static_range(self): |
1585 | 2324 | self.patch_autospec(interface_module, "update_host_maps") | 2356 | from maasserver.dns import config |
1586 | 2325 | self.patch_autospec(config, "dns_update_by_node") | 2357 | self.patch_autospec(interface_module, "update_host_maps") |
1587 | 2326 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 2358 | self.patch_autospec(config, "dns_update_by_node") |
1588 | 2327 | subnet = factory.make_Subnet(vlan=interface.vlan) | 2359 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
1589 | 2328 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | 2360 | subnet = factory.make_Subnet(vlan=interface.vlan) |
1590 | 2329 | ngi = factory.make_NodeGroupInterface( | 2361 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) |
1591 | 2330 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS, | 2362 | ngi = factory.make_NodeGroupInterface( |
1592 | 2331 | subnet=subnet) | 2363 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS, |
1593 | 2332 | ngi.static_ip_range_low = "" | 2364 | subnet=subnet) |
1594 | 2333 | ngi.static_ip_range_high = "" | 2365 | ngi.static_ip_range_low = "" |
1595 | 2334 | ngi.save() | 2366 | ngi.static_ip_range_high = "" |
1596 | 2335 | factory.make_StaticIPAddress( | 2367 | ngi.save() |
1597 | 2336 | alloc_type=IPADDRESS_TYPE.AUTO, ip="", | 2368 | factory.make_StaticIPAddress( |
1598 | 2337 | subnet=subnet, interface=interface) | 2369 | alloc_type=IPADDRESS_TYPE.AUTO, ip="", |
1599 | 2338 | maaslog = self.patch_autospec(interface_module, "maaslog") | 2370 | subnet=subnet, interface=interface) |
1600 | 2339 | with ExpectedException(StaticIPAddressUnavailable): | 2371 | maaslog = self.patch_autospec(interface_module, "maaslog") |
1601 | 2340 | interface.claim_auto_ips() | 2372 | with ExpectedException(StaticIPAddressUnavailable): |
1602 | 2341 | self.expectThat(maaslog.error, MockCalledOnceWith( | 2373 | interface.claim_auto_ips() |
1603 | 2342 | "Found matching NodeGroupInterface, but no static range has " | 2374 | self.expectThat(maaslog.error, MockCalledOnceWith( |
1604 | 2343 | "been defined for %s. (did you mean to configure DHCP?) " % | 2375 | "Found matching NodeGroupInterface, but no static range has " |
1605 | 2344 | interface.get_log_string())) | 2376 | "been defined for %s. (did you mean to configure DHCP?) " % |
1606 | 2377 | interface.get_log_string())) | ||
1607 | 2378 | ======= | ||
1608 | 2379 | IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)), | ||
1609 | 2380 | "Assigned IP address %s should be inside the static range " | ||
1610 | 2381 | "on the cluster (%s - %s)." % ( | ||
1611 | 2382 | observed[0].ip, ngi.static_ip_range_low, | ||
1612 | 2383 | ngi.static_ip_range_high)) | ||
1613 | 2384 | |||
1614 | 2385 | def test__claims_ip_address_in_static_ip_range_skips_gateway_ip(self): | ||
1615 | 2386 | from maasserver.dns import config | ||
1616 | 2387 | self.patch_autospec(interface_module, "update_host_maps") | ||
1617 | 2388 | self.patch_autospec(config, "dns_update_zones") | ||
1618 | 2389 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
1619 | 2390 | subnet = factory.make_Subnet(vlan=interface.vlan) | ||
1620 | 2391 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
1621 | 2392 | ngi = factory.make_NodeGroupInterface( | ||
1622 | 2393 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS, | ||
1623 | 2394 | subnet=subnet) | ||
1624 | 2395 | # Make it a really small range, just to be safe. | ||
1625 | 2396 | ngi.static_ip_range_high = unicode( | ||
1626 | 2397 | IPAddress(ngi.static_ip_range_low) + 1) | ||
1627 | 2398 | ngi.save() | ||
1628 | 2399 | ngi.subnet.gateway_ip = ngi.static_ip_range_low | ||
1629 | 2400 | ngi.subnet.dns_servers = [] | ||
1630 | 2401 | ngi.subnet.save() | ||
1631 | 2402 | factory.make_StaticIPAddress( | ||
1632 | 2403 | alloc_type=IPADDRESS_TYPE.AUTO, ip="", | ||
1633 | 2404 | subnet=subnet, interface=interface) | ||
1634 | 2405 | observed = interface.claim_auto_ips() | ||
1635 | 2406 | self.assertEquals( | ||
1636 | 2407 | 1, len(observed), | ||
1637 | 2408 | "Should have 1 AUTO IP addresses with an IP address assigned.") | ||
1638 | 2409 | self.assertEquals(subnet, observed[0].subnet) | ||
1639 | 2410 | self.assertTrue( | ||
1640 | 2411 | IPAddress(observed[0].ip) in ( | ||
1641 | 2412 | IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)), | ||
1642 | 2413 | "Assigned IP address %s should be inside the static range " | ||
1643 | 2414 | "on the cluster (%s - %s)." % ( | ||
1644 | 2415 | observed[0].ip, ngi.static_ip_range_low, | ||
1645 | 2416 | ngi.static_ip_range_high)) | ||
1646 | 2417 | self.assertThat( | ||
1647 | 2418 | IPAddress(observed[0].ip), Not(Equals(IPAddress( | ||
1648 | 2419 | ngi.subnet.gateway_ip)))) | ||
1649 | 2420 | |||
1650 | 2421 | def test__claim_fails_if_subnet_missing(self): | ||
1651 | 2422 | from maasserver.dns import config | ||
1652 | 2423 | self.patch_autospec(interface_module, "update_host_maps") | ||
1653 | 2424 | self.patch_autospec(config, "dns_update_zones") | ||
1654 | 2425 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
1655 | 2426 | subnet = factory.make_Subnet(vlan=interface.vlan) | ||
1656 | 2427 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
1657 | 2428 | factory.make_NodeGroupInterface( | ||
1658 | 2429 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS, | ||
1659 | 2430 | subnet=subnet) | ||
1660 | 2431 | ip = factory.make_StaticIPAddress( | ||
1661 | 2432 | alloc_type=IPADDRESS_TYPE.AUTO, ip="", | ||
1662 | 2433 | subnet=subnet, interface=interface) | ||
1663 | 2434 | ip.subnet = None | ||
1664 | 2435 | ip.save() | ||
1665 | 2436 | maaslog = self.patch_autospec(interface_module, "maaslog") | ||
1666 | 2437 | with ExpectedException(StaticIPAddressUnavailable): | ||
1667 | 2438 | interface.claim_auto_ips() | ||
1668 | 2439 | self.expectThat(maaslog.error, MockCalledOnceWith( | ||
1669 | 2440 | "Could not find subnet for interface %s." % | ||
1670 | 2441 | interface.get_log_string())) | ||
1671 | 2442 | |||
1672 | 2443 | def test__claim_fails_if_no_static_range(self): | ||
1673 | 2444 | from maasserver.dns import config | ||
1674 | 2445 | self.patch_autospec(interface_module, "update_host_maps") | ||
1675 | 2446 | self.patch_autospec(config, "dns_update_zones") | ||
1676 | 2447 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
1677 | 2448 | subnet = factory.make_Subnet(vlan=interface.vlan) | ||
1678 | 2449 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
1679 | 2450 | ngi = factory.make_NodeGroupInterface( | ||
1680 | 2451 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS, | ||
1681 | 2452 | subnet=subnet) | ||
1682 | 2453 | ngi.static_ip_range_low = "" | ||
1683 | 2454 | ngi.static_ip_range_high = "" | ||
1684 | 2455 | ngi.save() | ||
1685 | 2456 | factory.make_StaticIPAddress( | ||
1686 | 2457 | alloc_type=IPADDRESS_TYPE.AUTO, ip="", | ||
1687 | 2458 | subnet=subnet, interface=interface) | ||
1688 | 2459 | maaslog = self.patch_autospec(interface_module, "maaslog") | ||
1689 | 2460 | with ExpectedException(StaticIPAddressUnavailable): | ||
1690 | 2461 | interface.claim_auto_ips() | ||
1691 | 2462 | self.expectThat(maaslog.error, MockCalledOnceWith( | ||
1692 | 2463 | "Found matching NodeGroupInterface, but no static range has " | ||
1693 | 2464 | "been defined for %s. (did you mean to configure DHCP?) " % | ||
1694 | 2465 | interface.get_log_string())) | ||
1695 | 2466 | >>>>>>> MERGE-SOURCE | ||
1696 | 2345 | 2467 | ||
1697 | 2346 | def test__calls_update_host_maps(self): | 2468 | def test__calls_update_host_maps(self): |
1698 | 2347 | from maasserver.dns import config | 2469 | from maasserver.dns import config |
1699 | @@ -2589,67 +2711,131 @@ | |||
1700 | 2589 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | 2711 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) |
1701 | 2590 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 2712 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
1702 | 2591 | network_v4 = factory.make_ipv4_network() | 2713 | network_v4 = factory.make_ipv4_network() |
1764 | 2592 | subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr)) | 2714 | <<<<<<< TREE |
1765 | 2593 | factory.make_NodeGroupInterface( | 2715 | subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr)) |
1766 | 2594 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | 2716 | factory.make_NodeGroupInterface( |
1767 | 2595 | subnet=subnet_v4) | 2717 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, |
1768 | 2596 | factory.make_StaticIPAddress( | 2718 | subnet=subnet_v4) |
1769 | 2597 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | 2719 | factory.make_StaticIPAddress( |
1770 | 2598 | subnet=subnet_v4, interface=interface) | 2720 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", |
1771 | 2599 | network_v6 = factory.make_ipv6_network() | 2721 | subnet=subnet_v4, interface=interface) |
1772 | 2600 | subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr)) | 2722 | network_v6 = factory.make_ipv6_network() |
1773 | 2601 | factory.make_NodeGroupInterface( | 2723 | subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr)) |
1774 | 2602 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | 2724 | factory.make_NodeGroupInterface( |
1775 | 2603 | subnet=subnet_v6) | 2725 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, |
1776 | 2604 | factory.make_StaticIPAddress( | 2726 | subnet=subnet_v6) |
1777 | 2605 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | 2727 | factory.make_StaticIPAddress( |
1778 | 2606 | subnet=subnet_v6, interface=interface) | 2728 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", |
1779 | 2607 | 2729 | subnet=subnet_v6, interface=interface) | |
1780 | 2608 | mock_link_subnet = self.patch_autospec(interface, "link_subnet") | 2730 | |
1781 | 2609 | interface.claim_static_ips() | 2731 | mock_link_subnet = self.patch_autospec(interface, "link_subnet") |
1782 | 2610 | self.assertThat( | 2732 | interface.claim_static_ips() |
1783 | 2611 | mock_link_subnet, | 2733 | self.assertThat( |
1784 | 2612 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) | 2734 | mock_link_subnet, |
1785 | 2613 | self.assertThat( | 2735 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) |
1786 | 2614 | mock_link_subnet, | 2736 | self.assertThat( |
1787 | 2615 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | 2737 | mock_link_subnet, |
1788 | 2616 | 2738 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | |
1789 | 2617 | def test__without_address_calls_link_subnet_once_per_subnet(self): | 2739 | |
1790 | 2618 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | 2740 | def test__without_address_calls_link_subnet_once_per_subnet(self): |
1791 | 2619 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 2741 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) |
1792 | 2620 | network_v4 = factory.make_ipv4_network() | 2742 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
1793 | 2621 | subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr)) | 2743 | network_v4 = factory.make_ipv4_network() |
1794 | 2622 | factory.make_NodeGroupInterface( | 2744 | subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr)) |
1795 | 2623 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | 2745 | factory.make_NodeGroupInterface( |
1796 | 2624 | subnet=subnet_v4) | 2746 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, |
1797 | 2625 | factory.make_StaticIPAddress( | 2747 | subnet=subnet_v4) |
1798 | 2626 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | 2748 | factory.make_StaticIPAddress( |
1799 | 2627 | subnet=subnet_v4, interface=interface) | 2749 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", |
1800 | 2628 | # Make it have the same subnet twice. | 2750 | subnet=subnet_v4, interface=interface) |
1801 | 2629 | factory.make_StaticIPAddress( | 2751 | # Make it have the same subnet twice. |
1802 | 2630 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | 2752 | factory.make_StaticIPAddress( |
1803 | 2631 | subnet=subnet_v4, interface=interface) | 2753 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", |
1804 | 2632 | network_v6 = factory.make_ipv6_network() | 2754 | subnet=subnet_v4, interface=interface) |
1805 | 2633 | subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr)) | 2755 | network_v6 = factory.make_ipv6_network() |
1806 | 2634 | factory.make_NodeGroupInterface( | 2756 | subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr)) |
1807 | 2635 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | 2757 | factory.make_NodeGroupInterface( |
1808 | 2636 | subnet=subnet_v6) | 2758 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, |
1809 | 2637 | factory.make_StaticIPAddress( | 2759 | subnet=subnet_v6) |
1810 | 2638 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | 2760 | factory.make_StaticIPAddress( |
1811 | 2639 | subnet=subnet_v6, interface=interface) | 2761 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", |
1812 | 2640 | # Make it have the same subnet twice. | 2762 | subnet=subnet_v6, interface=interface) |
1813 | 2641 | factory.make_StaticIPAddress( | 2763 | # Make it have the same subnet twice. |
1814 | 2642 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | 2764 | factory.make_StaticIPAddress( |
1815 | 2643 | subnet=subnet_v6, interface=interface) | 2765 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", |
1816 | 2644 | 2766 | subnet=subnet_v6, interface=interface) | |
1817 | 2645 | mock_link_subnet = self.patch_autospec(interface, "link_subnet") | 2767 | |
1818 | 2646 | interface.claim_static_ips() | 2768 | mock_link_subnet = self.patch_autospec(interface, "link_subnet") |
1819 | 2647 | self.assertThat( | 2769 | interface.claim_static_ips() |
1820 | 2648 | mock_link_subnet, | 2770 | self.assertThat( |
1821 | 2649 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) | 2771 | mock_link_subnet, |
1822 | 2650 | self.assertThat( | 2772 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) |
1823 | 2651 | mock_link_subnet, | 2773 | self.assertThat( |
1824 | 2652 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | 2774 | mock_link_subnet, |
1825 | 2775 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | ||
1826 | 2776 | ======= | ||
1827 | 2777 | subnet_v4 = factory.make_Subnet(cidr=unicode(network_v4.cidr)) | ||
1828 | 2778 | factory.make_NodeGroupInterface( | ||
1829 | 2779 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | ||
1830 | 2780 | subnet=subnet_v4) | ||
1831 | 2781 | factory.make_StaticIPAddress( | ||
1832 | 2782 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1833 | 2783 | subnet=subnet_v4, interface=interface) | ||
1834 | 2784 | network_v6 = factory.make_ipv6_network() | ||
1835 | 2785 | subnet_v6 = factory.make_Subnet(cidr=unicode(network_v6.cidr)) | ||
1836 | 2786 | factory.make_NodeGroupInterface( | ||
1837 | 2787 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | ||
1838 | 2788 | subnet=subnet_v6) | ||
1839 | 2789 | factory.make_StaticIPAddress( | ||
1840 | 2790 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1841 | 2791 | subnet=subnet_v6, interface=interface) | ||
1842 | 2792 | |||
1843 | 2793 | mock_link_subnet = self.patch_autospec(interface, "link_subnet") | ||
1844 | 2794 | interface.claim_static_ips() | ||
1845 | 2795 | self.assertThat( | ||
1846 | 2796 | mock_link_subnet, | ||
1847 | 2797 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) | ||
1848 | 2798 | self.assertThat( | ||
1849 | 2799 | mock_link_subnet, | ||
1850 | 2800 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | ||
1851 | 2801 | |||
1852 | 2802 | def test__without_address_calls_link_subnet_once_per_subnet(self): | ||
1853 | 2803 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
1854 | 2804 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | ||
1855 | 2805 | network_v4 = factory.make_ipv4_network() | ||
1856 | 2806 | subnet_v4 = factory.make_Subnet(cidr=unicode(network_v4.cidr)) | ||
1857 | 2807 | factory.make_NodeGroupInterface( | ||
1858 | 2808 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | ||
1859 | 2809 | subnet=subnet_v4) | ||
1860 | 2810 | factory.make_StaticIPAddress( | ||
1861 | 2811 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1862 | 2812 | subnet=subnet_v4, interface=interface) | ||
1863 | 2813 | # Make it have the same subnet twice. | ||
1864 | 2814 | factory.make_StaticIPAddress( | ||
1865 | 2815 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1866 | 2816 | subnet=subnet_v4, interface=interface) | ||
1867 | 2817 | network_v6 = factory.make_ipv6_network() | ||
1868 | 2818 | subnet_v6 = factory.make_Subnet(cidr=unicode(network_v6.cidr)) | ||
1869 | 2819 | factory.make_NodeGroupInterface( | ||
1870 | 2820 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | ||
1871 | 2821 | subnet=subnet_v6) | ||
1872 | 2822 | factory.make_StaticIPAddress( | ||
1873 | 2823 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1874 | 2824 | subnet=subnet_v6, interface=interface) | ||
1875 | 2825 | # Make it have the same subnet twice. | ||
1876 | 2826 | factory.make_StaticIPAddress( | ||
1877 | 2827 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1878 | 2828 | subnet=subnet_v6, interface=interface) | ||
1879 | 2829 | |||
1880 | 2830 | mock_link_subnet = self.patch_autospec(interface, "link_subnet") | ||
1881 | 2831 | interface.claim_static_ips() | ||
1882 | 2832 | self.assertThat( | ||
1883 | 2833 | mock_link_subnet, | ||
1884 | 2834 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) | ||
1885 | 2835 | self.assertThat( | ||
1886 | 2836 | mock_link_subnet, | ||
1887 | 2837 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | ||
1888 | 2838 | >>>>>>> MERGE-SOURCE | ||
1889 | 2653 | 2839 | ||
1890 | 2654 | def test__without_address_does_nothing_if_none_managed(self): | 2840 | def test__without_address_does_nothing_if_none_managed(self): |
1891 | 2655 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 2841 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
1892 | @@ -2680,8 +2866,13 @@ | |||
1893 | 2680 | StaticIPAddressOutOfRange, interface.claim_static_ips, ip_v6) | 2866 | StaticIPAddressOutOfRange, interface.claim_static_ips, ip_v6) |
1894 | 2681 | self.assertEqual( | 2867 | self.assertEqual( |
1895 | 2682 | "requested_address '%s' is not in a managed subnet for " | 2868 | "requested_address '%s' is not in a managed subnet for " |
1896 | 2869 | <<<<<<< TREE | ||
1897 | 2683 | "interface '%s'." % (ip_v6, interface.name), | 2870 | "interface '%s'." % (ip_v6, interface.name), |
1898 | 2684 | str(error)) | 2871 | str(error)) |
1899 | 2872 | ======= | ||
1900 | 2873 | "interface '%s'." % (ip_v6, interface.name), | ||
1901 | 2874 | error.message) | ||
1902 | 2875 | >>>>>>> MERGE-SOURCE | ||
1903 | 2685 | 2876 | ||
1904 | 2686 | def test__with_address_calls_link_subnet_with_ip_address(self): | 2877 | def test__with_address_calls_link_subnet_with_ip_address(self): |
1905 | 2687 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) | 2878 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
1906 | @@ -2731,6 +2922,7 @@ | |||
1907 | 2731 | device_interface.claim_static_ips() | 2922 | device_interface.claim_static_ips() |
1908 | 2732 | self.assertThat( | 2923 | self.assertThat( |
1909 | 2733 | mock_link_subnet, | 2924 | mock_link_subnet, |
1910 | 2925 | <<<<<<< TREE | ||
1911 | 2734 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) | 2926 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) |
1912 | 2735 | self.assertThat( | 2927 | self.assertThat( |
1913 | 2736 | mock_link_subnet, | 2928 | mock_link_subnet, |
1914 | @@ -2779,6 +2971,56 @@ | |||
1915 | 2779 | self.assertThat( | 2971 | self.assertThat( |
1916 | 2780 | mock_link_subnet, | 2972 | mock_link_subnet, |
1917 | 2781 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | 2973 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) |
1918 | 2974 | ======= | ||
1919 | 2975 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) | ||
1920 | 2976 | self.assertThat( | ||
1921 | 2977 | mock_link_subnet, | ||
1922 | 2978 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | ||
1923 | 2979 | |||
1924 | 2980 | def test__device_no_address_calls_link_subnet_once_per_subnet(self): | ||
1925 | 2981 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
1926 | 2982 | parent = factory.make_Node() | ||
1927 | 2983 | parent_nic0 = factory.make_Interface( | ||
1928 | 2984 | INTERFACE_TYPE.PHYSICAL, node=parent) | ||
1929 | 2985 | parent_nic1 = factory.make_Interface( | ||
1930 | 2986 | INTERFACE_TYPE.PHYSICAL, node=parent) | ||
1931 | 2987 | network_v4 = factory.make_ipv4_network() | ||
1932 | 2988 | subnet_v4 = factory.make_Subnet(cidr=unicode(network_v4.cidr)) | ||
1933 | 2989 | factory.make_NodeGroupInterface( | ||
1934 | 2990 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | ||
1935 | 2991 | subnet=subnet_v4) | ||
1936 | 2992 | factory.make_StaticIPAddress( | ||
1937 | 2993 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1938 | 2994 | subnet=subnet_v4, interface=parent_nic0) | ||
1939 | 2995 | # Make second interface on the parent have the same subnet. | ||
1940 | 2996 | factory.make_StaticIPAddress( | ||
1941 | 2997 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1942 | 2998 | subnet=subnet_v4, interface=parent_nic1) | ||
1943 | 2999 | network_v6 = factory.make_ipv6_network() | ||
1944 | 3000 | subnet_v6 = factory.make_Subnet(cidr=unicode(network_v6.cidr)) | ||
1945 | 3001 | factory.make_NodeGroupInterface( | ||
1946 | 3002 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP, | ||
1947 | 3003 | subnet=subnet_v6) | ||
1948 | 3004 | factory.make_StaticIPAddress( | ||
1949 | 3005 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1950 | 3006 | subnet=subnet_v6, interface=parent_nic0) | ||
1951 | 3007 | # Make second interface on the parent have the same subnet. | ||
1952 | 3008 | factory.make_StaticIPAddress( | ||
1953 | 3009 | alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="", | ||
1954 | 3010 | subnet=subnet_v6, interface=parent_nic1) | ||
1955 | 3011 | device = factory.make_Device(parent=parent) | ||
1956 | 3012 | device_interface = factory.make_Interface( | ||
1957 | 3013 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
1958 | 3014 | |||
1959 | 3015 | mock_link_subnet = self.patch_autospec(device_interface, "link_subnet") | ||
1960 | 3016 | device_interface.claim_static_ips() | ||
1961 | 3017 | self.assertThat( | ||
1962 | 3018 | mock_link_subnet, | ||
1963 | 3019 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4)) | ||
1964 | 3020 | self.assertThat( | ||
1965 | 3021 | mock_link_subnet, | ||
1966 | 3022 | MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6)) | ||
1967 | 3023 | >>>>>>> MERGE-SOURCE | ||
1968 | 2782 | 3024 | ||
1969 | 2783 | def test__device_with_address_calls_link_subnet_with_ip_address(self): | 3025 | def test__device_with_address_calls_link_subnet_with_ip_address(self): |
1970 | 2784 | parent = factory.make_Node() | 3026 | parent = factory.make_Node() |
1971 | @@ -2817,6 +3059,7 @@ | |||
1972 | 2817 | self.patch_autospec(iface, "link_subnet") | 3059 | self.patch_autospec(iface, "link_subnet") |
1973 | 2818 | claimed_ips = iface.claim_static_ips() | 3060 | claimed_ips = iface.claim_static_ips() |
1974 | 2819 | self.assertThat(claimed_ips, HasLength(1)) | 3061 | self.assertThat(claimed_ips, HasLength(1)) |
1975 | 3062 | <<<<<<< TREE | ||
1976 | 2820 | 3063 | ||
1977 | 2821 | def test__claim_static_fails_if_parent_subnet_cannot_be_found(self): | 3064 | def test__claim_static_fails_if_parent_subnet_cannot_be_found(self): |
1978 | 2822 | from maasserver.dns import config | 3065 | from maasserver.dns import config |
1979 | @@ -2842,3 +3085,29 @@ | |||
1980 | 2842 | "subnet could be found. (Recommission node '%s' in order for " | 3085 | "subnet could be found. (Recommission node '%s' in order for " |
1981 | 2843 | "MAAS to discover the subnet.)" % | 3086 | "MAAS to discover the subnet.)" % |
1982 | 2844 | (interface.get_log_string(), node.hostname))) | 3087 | (interface.get_log_string(), node.hostname))) |
1983 | 3088 | ======= | ||
1984 | 3089 | |||
1985 | 3090 | def test__claim_static_fails_if_parent_subnet_cannot_be_found(self): | ||
1986 | 3091 | from maasserver.dns import config | ||
1987 | 3092 | self.patch_autospec(interface_module, "update_host_maps") | ||
1988 | 3093 | self.patch_autospec(config, "dns_update_zones") | ||
1989 | 3094 | subnet = factory.make_Subnet() | ||
1990 | 3095 | nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED) | ||
1991 | 3096 | factory.make_NodeGroupInterface( | ||
1992 | 3097 | nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED, | ||
1993 | 3098 | subnet=subnet) | ||
1994 | 3099 | node = factory.make_Node_with_Interface_on_Subnet( | ||
1995 | 3100 | subnet=subnet, unmanaged=True, status=NODE_STATUS.READY) | ||
1996 | 3101 | # Simulate an unmanaged network without association to a subnet. | ||
1997 | 3102 | # (this could happen after a migration) | ||
1998 | 3103 | StaticIPAddress.objects.all().delete() | ||
1999 | 3104 | interface = node.get_boot_interface() | ||
2000 | 3105 | maaslog = self.patch_autospec(interface_module, "maaslog") | ||
2001 | 3106 | with ExpectedException(StaticIPAddressExhaustion): | ||
2002 | 3107 | interface.claim_static_ips() | ||
2003 | 3108 | self.expectThat(maaslog.warning, MockCalledOnceWith( | ||
2004 | 3109 | "%s: Attempted to claim a static IP address, but no associated " | ||
2005 | 3110 | "subnet could be found. (Recommission node '%s' in order for " | ||
2006 | 3111 | "MAAS to discover the subnet.)" % | ||
2007 | 3112 | (interface.get_log_string(), node.hostname))) | ||
2008 | 3113 | >>>>>>> MERGE-SOURCE | ||
2009 | 2845 | 3114 | ||
2010 | === modified file 'src/maasserver/models/tests/test_node.py' | |||
2011 | --- src/maasserver/models/tests/test_node.py 2016-01-08 05:09:21 +0000 | |||
2012 | +++ src/maasserver/models/tests/test_node.py 2016-01-10 08:29:39 +0000 | |||
2013 | @@ -3879,39 +3879,75 @@ | |||
2014 | 3879 | node = factory.make_Node(status=NODE_STATUS.ALLOCATED) | 3879 | node = factory.make_Node(status=NODE_STATUS.ALLOCATED) |
2015 | 3880 | self.assertFalse(node.on_network()) | 3880 | self.assertFalse(node.on_network()) |
2016 | 3881 | 3881 | ||
2050 | 3882 | def test_storage_layout_issues_is_valid_when_flat(self): | 3882 | <<<<<<< TREE |
2051 | 3883 | node = factory.make_Node() | 3883 | def test_storage_layout_issues_is_valid_when_flat(self): |
2052 | 3884 | self.assertEqual([], node.storage_layout_issues()) | 3884 | node = factory.make_Node() |
2053 | 3885 | 3885 | self.assertEqual([], node.storage_layout_issues()) | |
2054 | 3886 | def test_storage_layout_issues_returns_valid_with_boot_and_bcache(self): | 3886 | |
2055 | 3887 | node = factory.make_Node(with_boot_disk=False) | 3887 | def test_storage_layout_issues_returns_valid_with_boot_and_bcache(self): |
2056 | 3888 | boot_partition = factory.make_Partition(node=node) | 3888 | node = factory.make_Node(with_boot_disk=False) |
2057 | 3889 | factory.make_Filesystem(partition=boot_partition, mount_point='/boot') | 3889 | boot_partition = factory.make_Partition(node=node) |
2058 | 3890 | fs_group = factory.make_FilesystemGroup( | 3890 | factory.make_Filesystem(partition=boot_partition, mount_point='/boot') |
2059 | 3891 | node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE) | 3891 | fs_group = factory.make_FilesystemGroup( |
2060 | 3892 | bcache = fs_group.virtual_device | 3892 | node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE) |
2061 | 3893 | factory.make_Filesystem(block_device=bcache, mount_point="/") | 3893 | bcache = fs_group.virtual_device |
2062 | 3894 | self.assertEqual([], node.storage_layout_issues()) | 3894 | factory.make_Filesystem(block_device=bcache, mount_point="/") |
2063 | 3895 | 3895 | self.assertEqual([], node.storage_layout_issues()) | |
2064 | 3896 | def test_storage_layout_issues_returns_invalid_when_no_disk(self): | 3896 | |
2065 | 3897 | node = factory.make_Node(with_boot_disk=False) | 3897 | def test_storage_layout_issues_returns_invalid_when_no_disk(self): |
2066 | 3898 | self.assertEqual( | 3898 | node = factory.make_Node(with_boot_disk=False) |
2067 | 3899 | ["Specify a storage device to be able to deploy this node.", | 3899 | self.assertEqual( |
2068 | 3900 | "Mount the root '/' filesystem to be able to deploy this node."], | 3900 | ["Specify a storage device to be able to deploy this node.", |
2069 | 3901 | node.storage_layout_issues()) | 3901 | "Mount the root '/' filesystem to be able to deploy this node."], |
2070 | 3902 | 3902 | node.storage_layout_issues()) | |
2071 | 3903 | def test_storage_layout_issues_returns_invalid_when_root_on_bcache(self): | 3903 | |
2072 | 3904 | node = factory.make_Node(with_boot_disk=False) | 3904 | def test_storage_layout_issues_returns_invalid_when_root_on_bcache(self): |
2073 | 3905 | factory.make_Partition(node=node) | 3905 | node = factory.make_Node(with_boot_disk=False) |
2074 | 3906 | fs_group = factory.make_FilesystemGroup( | 3906 | factory.make_Partition(node=node) |
2075 | 3907 | node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE) | 3907 | fs_group = factory.make_FilesystemGroup( |
2076 | 3908 | bcache = fs_group.virtual_device | 3908 | node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE) |
2077 | 3909 | factory.make_Filesystem(block_device=bcache, mount_point="/") | 3909 | bcache = fs_group.virtual_device |
2078 | 3910 | self.assertEqual( | 3910 | factory.make_Filesystem(block_device=bcache, mount_point="/") |
2079 | 3911 | ["This node cannot be deployed because it cannot boot from a " | 3911 | self.assertEqual( |
2080 | 3912 | "bcache volume. Mount /boot on a non-bcache device to be able to " | 3912 | ["This node cannot be deployed because it cannot boot from a " |
2081 | 3913 | "deploy this node."], node.storage_layout_issues()) | 3913 | "bcache volume. Mount /boot on a non-bcache device to be able to " |
2082 | 3914 | 3914 | "deploy this node."], node.storage_layout_issues()) | |
2083 | 3915 | |||
2084 | 3916 | ======= | ||
2085 | 3917 | def test_storage_layout_issues_is_valid_when_flat(self): | ||
2086 | 3918 | node = factory.make_Node() | ||
2087 | 3919 | self.assertEquals([], node.storage_layout_issues()) | ||
2088 | 3920 | |||
2089 | 3921 | def test_storage_layout_issues_returns_valid_with_boot_and_bcache(self): | ||
2090 | 3922 | node = factory.make_Node(with_boot_disk=False) | ||
2091 | 3923 | boot_partition = factory.make_Partition(node=node) | ||
2092 | 3924 | factory.make_Filesystem(partition=boot_partition, mount_point='/boot') | ||
2093 | 3925 | fs_group = factory.make_FilesystemGroup( | ||
2094 | 3926 | node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE) | ||
2095 | 3927 | bcache = fs_group.virtual_device | ||
2096 | 3928 | factory.make_Filesystem(block_device=bcache, mount_point="/") | ||
2097 | 3929 | self.assertEquals([], node.storage_layout_issues()) | ||
2098 | 3930 | |||
2099 | 3931 | def test_storage_layout_issues_returns_invalid_when_no_disk(self): | ||
2100 | 3932 | node = factory.make_Node(with_boot_disk=False) | ||
2101 | 3933 | self.assertEquals( | ||
2102 | 3934 | ["Specify a storage device to be able to deploy this node.", | ||
2103 | 3935 | "Mount the root '/' filesystem to be able to deploy this node."], | ||
2104 | 3936 | node.storage_layout_issues()) | ||
2105 | 3937 | |||
2106 | 3938 | def test_storage_layout_issues_returns_invalid_when_root_on_bcache(self): | ||
2107 | 3939 | node = factory.make_Node(with_boot_disk=False) | ||
2108 | 3940 | factory.make_Partition(node=node) | ||
2109 | 3941 | fs_group = factory.make_FilesystemGroup( | ||
2110 | 3942 | node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE) | ||
2111 | 3943 | bcache = fs_group.virtual_device | ||
2112 | 3944 | factory.make_Filesystem(block_device=bcache, mount_point="/") | ||
2113 | 3945 | self.assertEquals( | ||
2114 | 3946 | ["This node cannot be deployed because it cannot boot from a " | ||
2115 | 3947 | "bcache volume. Mount /boot on a non-bcache device to be able to " | ||
2116 | 3948 | "deploy this node."], node.storage_layout_issues()) | ||
2117 | 3949 | |||
2118 | 3950 | >>>>>>> MERGE-SOURCE | ||
2119 | 3915 | 3951 | ||
2120 | 3916 | class TestNode_Stop(MAASServerTestCase): | 3952 | class TestNode_Stop(MAASServerTestCase): |
2121 | 3917 | """Tests for Node.stop().""" | 3953 | """Tests for Node.stop().""" |
2122 | 3918 | 3954 | ||
2123 | === modified file 'src/maasserver/models/tests/test_nodegroupinterface.py' | |||
2124 | === modified file 'src/maasserver/models/tests/test_partition.py' | |||
2125 | --- src/maasserver/models/tests/test_partition.py 2015-12-01 18:12:59 +0000 | |||
2126 | +++ src/maasserver/models/tests/test_partition.py 2016-01-10 08:29:39 +0000 | |||
2127 | @@ -210,7 +210,11 @@ | |||
2128 | 210 | partition.size = PARTITION_ALIGNMENT_SIZE * 4 | 210 | partition.size = PARTITION_ALIGNMENT_SIZE * 4 |
2129 | 211 | partition.size += 1 | 211 | partition.size += 1 |
2130 | 212 | partition.save() | 212 | partition.save() |
2131 | 213 | <<<<<<< TREE | ||
2132 | 213 | self.assertEqual(PARTITION_ALIGNMENT_SIZE * 4, partition.size) | 214 | self.assertEqual(PARTITION_ALIGNMENT_SIZE * 4, partition.size) |
2133 | 215 | ======= | ||
2134 | 216 | self.assertEquals(PARTITION_ALIGNMENT_SIZE * 4, partition.size) | ||
2135 | 217 | >>>>>>> MERGE-SOURCE | ||
2136 | 214 | 218 | ||
2137 | 215 | def test_validate_enough_space_for_new_partition(self): | 219 | def test_validate_enough_space_for_new_partition(self): |
2138 | 216 | partition_table = factory.make_PartitionTable() | 220 | partition_table = factory.make_PartitionTable() |
2139 | 217 | 221 | ||
2140 | === modified file 'src/maasserver/models/tests/test_partitiontable.py' | |||
2141 | --- src/maasserver/models/tests/test_partitiontable.py 2015-12-01 18:12:59 +0000 | |||
2142 | +++ src/maasserver/models/tests/test_partitiontable.py 2016-01-10 08:29:39 +0000 | |||
2143 | @@ -35,12 +35,21 @@ | |||
2144 | 35 | 35 | ||
2145 | 36 | def test_get_size_returns_block_device_size_minus_initial_offset(self): | 36 | def test_get_size_returns_block_device_size_minus_initial_offset(self): |
2146 | 37 | partition_table = factory.make_PartitionTable() | 37 | partition_table = factory.make_PartitionTable() |
2147 | 38 | <<<<<<< TREE | ||
2148 | 38 | self.assertEqual( | 39 | self.assertEqual( |
2149 | 39 | round_size_to_nearest_block( | 40 | round_size_to_nearest_block( |
2150 | 40 | partition_table.block_device.size - | 41 | partition_table.block_device.size - |
2151 | 41 | PARTITION_TABLE_EXTRA_SPACE, | 42 | PARTITION_TABLE_EXTRA_SPACE, |
2152 | 42 | PARTITION_ALIGNMENT_SIZE, | 43 | PARTITION_ALIGNMENT_SIZE, |
2153 | 43 | False), | 44 | False), |
2154 | 45 | ======= | ||
2155 | 46 | self.assertEquals( | ||
2156 | 47 | round_size_to_nearest_block( | ||
2157 | 48 | partition_table.block_device.size - | ||
2158 | 49 | PARTITION_TABLE_EXTRA_SPACE, | ||
2159 | 50 | PARTITION_ALIGNMENT_SIZE, | ||
2160 | 51 | False), | ||
2161 | 52 | >>>>>>> MERGE-SOURCE | ||
2162 | 44 | partition_table.get_size()) | 53 | partition_table.get_size()) |
2163 | 45 | 54 | ||
2164 | 46 | def test_get_block_size_returns_block_device_block_size(self): | 55 | def test_get_block_size_returns_block_device_block_size(self): |
2165 | @@ -120,9 +129,15 @@ | |||
2166 | 120 | size=MIN_PARTITION_SIZE * 3 + PARTITION_TABLE_EXTRA_SPACE, | 129 | size=MIN_PARTITION_SIZE * 3 + PARTITION_TABLE_EXTRA_SPACE, |
2167 | 121 | block_size=block_size) | 130 | block_size=block_size) |
2168 | 122 | partition_table = factory.make_PartitionTable(block_device=device) | 131 | partition_table = factory.make_PartitionTable(block_device=device) |
2169 | 132 | <<<<<<< TREE | ||
2170 | 123 | partition_table.add_partition(size=MIN_PARTITION_SIZE) | 133 | partition_table.add_partition(size=MIN_PARTITION_SIZE) |
2171 | 124 | self.assertEqual( | 134 | self.assertEqual( |
2172 | 125 | MIN_PARTITION_SIZE * 2, partition_table.get_available_size()) | 135 | MIN_PARTITION_SIZE * 2, partition_table.get_available_size()) |
2173 | 136 | ======= | ||
2174 | 137 | partition_table.add_partition(size=MIN_PARTITION_SIZE) | ||
2175 | 138 | self.assertEquals( | ||
2176 | 139 | MIN_PARTITION_SIZE * 2, partition_table.get_available_size()) | ||
2177 | 140 | >>>>>>> MERGE-SOURCE | ||
2178 | 126 | 141 | ||
2179 | 127 | def test_get_available_size_skips_partitions(self): | 142 | def test_get_available_size_skips_partitions(self): |
2180 | 128 | block_size = 4096 | 143 | block_size = 4096 |
2181 | @@ -134,9 +149,15 @@ | |||
2182 | 134 | partition_table.add_partition(size=MIN_PARTITION_SIZE) | 149 | partition_table.add_partition(size=MIN_PARTITION_SIZE) |
2183 | 135 | for _ in range(2) | 150 | for _ in range(2) |
2184 | 136 | ] | 151 | ] |
2185 | 152 | <<<<<<< TREE | ||
2186 | 137 | partition_table.add_partition(size=MIN_PARTITION_SIZE) | 153 | partition_table.add_partition(size=MIN_PARTITION_SIZE) |
2187 | 138 | self.assertEqual( | 154 | self.assertEqual( |
2188 | 139 | MIN_PARTITION_SIZE * 2, | 155 | MIN_PARTITION_SIZE * 2, |
2189 | 156 | ======= | ||
2190 | 157 | partition_table.add_partition(size=MIN_PARTITION_SIZE) | ||
2191 | 158 | self.assertEquals( | ||
2192 | 159 | MIN_PARTITION_SIZE * 2, | ||
2193 | 160 | >>>>>>> MERGE-SOURCE | ||
2194 | 140 | partition_table.get_available_size( | 161 | partition_table.get_available_size( |
2195 | 141 | ignore_partitions=ignore_partitions)) | 162 | ignore_partitions=ignore_partitions)) |
2196 | 142 | 163 | ||
2197 | 143 | 164 | ||
2198 | === modified file 'src/maasserver/models/tests/test_staticipaddress.py' | |||
2199 | --- src/maasserver/models/tests/test_staticipaddress.py 2016-01-09 00:48:25 +0000 | |||
2200 | +++ src/maasserver/models/tests/test_staticipaddress.py 2016-01-10 08:29:39 +0000 | |||
2201 | @@ -949,6 +949,29 @@ | |||
2202 | 949 | node.domain) | 949 | node.domain) |
2203 | 950 | self.assertEqual({node.fqdn: [boot_sip.ip]}, mapping) | 950 | self.assertEqual({node.fqdn: [boot_sip.ip]}, mapping) |
2204 | 951 | 951 | ||
2205 | 952 | def test_get_hostname_ip_mapping_prefers_boot_interface_to_alias(self): | ||
2206 | 953 | self.patch_autospec(interface_module, "update_host_maps") | ||
2207 | 954 | subnet = factory.make_Subnet( | ||
2208 | 955 | cidr=unicode(factory.make_ipv4_network().cidr)) | ||
2209 | 956 | node = factory.make_Node_with_Interface_on_Subnet( | ||
2210 | 957 | hostname=factory.make_name('host'), subnet=subnet, | ||
2211 | 958 | disable_ipv4=False) | ||
2212 | 959 | iface = node.get_boot_interface() | ||
2213 | 960 | factory.make_StaticIPAddress( | ||
2214 | 961 | alloc_type=IPADDRESS_TYPE.STICKY, interface=iface, | ||
2215 | 962 | subnet=subnet) | ||
2216 | 963 | new_boot_interface = factory.make_Interface( | ||
2217 | 964 | INTERFACE_TYPE.PHYSICAL, node=node) | ||
2218 | 965 | node.boot_interface = new_boot_interface | ||
2219 | 966 | node.save() | ||
2220 | 967 | # IP address should be selected over the other STICKY IP address. | ||
2221 | 968 | boot_sip = factory.make_StaticIPAddress( | ||
2222 | 969 | alloc_type=IPADDRESS_TYPE.AUTO, interface=new_boot_interface, | ||
2223 | 970 | subnet=subnet) | ||
2224 | 971 | mapping = StaticIPAddress.objects.get_hostname_ip_mapping( | ||
2225 | 972 | node.nodegroup) | ||
2226 | 973 | self.assertEqual({node.hostname: [boot_sip.ip]}, mapping) | ||
2227 | 974 | |||
2228 | 952 | def test_get_hostname_ip_mapping_prefers_physical_interfaces_to_vlan(self): | 975 | def test_get_hostname_ip_mapping_prefers_physical_interfaces_to_vlan(self): |
2229 | 953 | self.patch_autospec(interface_module, "update_host_maps") | 976 | self.patch_autospec(interface_module, "update_host_maps") |
2230 | 954 | subnet = factory.make_Subnet( | 977 | subnet = factory.make_Subnet( |
2231 | 955 | 978 | ||
2232 | === modified file 'src/maasserver/models/tests/test_virtualblockdevice.py' | |||
2233 | --- src/maasserver/models/tests/test_virtualblockdevice.py 2015-12-01 18:12:59 +0000 | |||
2234 | +++ src/maasserver/models/tests/test_virtualblockdevice.py 2016-01-10 08:29:39 +0000 | |||
2235 | @@ -150,6 +150,7 @@ | |||
2236 | 150 | def test_save_doesnt_overwrite_uuid(self): | 150 | def test_save_doesnt_overwrite_uuid(self): |
2237 | 151 | uuid = uuid4() | 151 | uuid = uuid4() |
2238 | 152 | block_device = factory.make_VirtualBlockDevice(uuid=uuid) | 152 | block_device = factory.make_VirtualBlockDevice(uuid=uuid) |
2239 | 153 | <<<<<<< TREE | ||
2240 | 153 | self.assertEqual('%s' % uuid, block_device.uuid) | 154 | self.assertEqual('%s' % uuid, block_device.uuid) |
2241 | 154 | 155 | ||
2242 | 155 | def test_get_parents_finds_devices(self): | 156 | def test_get_parents_finds_devices(self): |
2243 | @@ -181,3 +182,36 @@ | |||
2244 | 181 | self.assertItemsEqual( | 182 | self.assertItemsEqual( |
2245 | 182 | [fs.block_device_id for fs in volume_group.filesystems.all()], | 183 | [fs.block_device_id for fs in volume_group.filesystems.all()], |
2246 | 183 | [parent.id for parent in logical_volume.get_parents()]) | 184 | [parent.id for parent in logical_volume.get_parents()]) |
2247 | 185 | ======= | ||
2248 | 186 | self.assertEquals('%s' % uuid, block_device.uuid) | ||
2249 | 187 | |||
2250 | 188 | def test_get_parents_finds_devices(self): | ||
2251 | 189 | node = factory.make_Node() | ||
2252 | 190 | factory.make_FilesystemGroup( | ||
2253 | 191 | node=node, | ||
2254 | 192 | group_type=factory.pick_enum( | ||
2255 | 193 | FILESYSTEM_GROUP_TYPE, but_not=FILESYSTEM_GROUP_TYPE.LVM_VG)) | ||
2256 | 194 | fs_group_disks = [block_device.blockdevice_ptr | ||
2257 | 195 | for block_device in | ||
2258 | 196 | node.physicalblockdevice_set.all() | ||
2259 | 197 | if not block_device.is_boot_disk()] | ||
2260 | 198 | virtualblockdevice = node.virtualblockdevice_set.first() | ||
2261 | 199 | self.assertEqual( | ||
2262 | 200 | len(fs_group_disks), len(virtualblockdevice.get_parents())) | ||
2263 | 201 | |||
2264 | 202 | def test_get_parents_handles_cache_set(self): | ||
2265 | 203 | # Regression test for lp1519397 | ||
2266 | 204 | node = factory.make_Node(with_boot_disk=False) | ||
2267 | 205 | volume_group = factory.make_VolumeGroup(node=node) | ||
2268 | 206 | name = factory.make_name() | ||
2269 | 207 | vguuid = "%s" % uuid4() | ||
2270 | 208 | size = random.randint(MIN_BLOCK_DEVICE_SIZE, volume_group.get_size()) | ||
2271 | 209 | logical_volume = volume_group.create_logical_volume( | ||
2272 | 210 | name=name, uuid=vguuid, size=size) | ||
2273 | 211 | logical_volume = reload_object(logical_volume) | ||
2274 | 212 | sdb = factory.make_PhysicalBlockDevice(node=node) | ||
2275 | 213 | factory.make_CacheSet(block_device=sdb, node=node) | ||
2276 | 214 | self.assertItemsEqual( | ||
2277 | 215 | [fs.block_device_id for fs in volume_group.filesystems.all()], | ||
2278 | 216 | [parent.id for parent in logical_volume.get_parents()]) | ||
2279 | 217 | >>>>>>> MERGE-SOURCE | ||
2280 | 184 | 218 | ||
2281 | === modified file 'src/maasserver/models/virtualblockdevice.py' | |||
2282 | === modified file 'src/maasserver/node_constraint_filter_forms.py' | |||
2283 | === modified file 'src/maasserver/static/css/maas-styles.css' | |||
2284 | --- src/maasserver/static/css/maas-styles.css 2015-12-07 17:37:46 +0000 | |||
2285 | +++ src/maasserver/static/css/maas-styles.css 2016-01-10 08:29:39 +0000 | |||
2286 | @@ -1,1 +1,5 @@ | |||
2287 | 1 | <<<<<<< TREE | ||
2288 | 1 | .fake{display:none}body{font-size:14px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;clear:none;display:inline-block;float:none;margin-right:2.12766%;margin-bottom:20px;position:relative;width:100%}.twelve-col .one-col,.twelve-col .two-col,.twelve-col .three-col,.twelve-col .four-col,.twelve-col .five-col,.twelve-col .six-col,.twelve-col .seven-col,.twelve-col .eight-col,.twelve-col .nine-col,.twelve-col .ten-col,.twelve-col .eleven-col{width:100%}.last-col,.last{margin-right:0}.clearfix:after,.container:after{clear:both;content:"\0020";display:block;height:0;overflow:hidden;visibility:hidden}.clear{clear:both}.clearfix{display:block}@media only screen and (min-width: 768px){body{font-size:15px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col{width:48.8938%;margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}@media only screen and (min-width: 984px){body{font-size:16px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.three-col:nth-child(1):nth-last-child(4),.three-col:nth-child(2):nth-last-child(3),.three-col:nth-child(3):nth-last-child(2),.three-col:nth-child(4):nth-last-child(1){width:23.36%}.three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col:nth-child(1):nth-last-child(4),.twelve-col .three-col:nth-child(2):nth-last-child(3),.twelve-col .three-col:nth-child(3):nth-last-child(2),.twelve-col .three-col:nth-child(4):nth-last-child(1){width:23.3407%}.twelve-col .three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot");src:url("../fonts/ubuntu-l-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#ubuntulight") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:local("Ubuntu");src:url("../fonts/ubuntu-r-webfont.eot");src:url("../fonts/ubuntu-r-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#ubunturegular") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot");src:local("Ubuntu Medium"),local("Ubuntu-Medium"),url("../fonts/ubuntu-m-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#ubuntumedium") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot");src:local("Ubuntu Bold"),local("Ubuntu-Bold"),url("../fonts/ubuntu-b-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#ubuntubold") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot");src:local("Ubuntu Light Italic"),local("Ubuntu-LightItalic"),url("../fonts/ubuntu-li-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#ubuntulight_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:local("Ubuntu Italic"),local("Ubuntu-Italic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot");src:local("Ubuntu Medium Italic"),local("Ubuntu-MediumItalic"),url("../fonts/ubuntu-mi-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#ubuntumedium_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:local("Ubuntu Bold Italic"),local("Ubuntu-BoldItalic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}html{font-size:100%}body{color:#333;font-family:Ubuntu, Arial, "libra sans", sans-serif;font-weight:300}blockquote,q{quotes:none}blockquote{margin:28px 20px}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}legend{border:0;*margin-left:-7px}figure{margin:0}abbr,acronym{cursor:help}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a:link,a:visited{color:#dd4814;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}a.link-arrow:after{content:"\0000a0›"}nav ul li h2 a:after{content:"\0000a0›"}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:""}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img.left{margin-right:20px}img.right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}h1,h2,h3,h4,h5,h6{font-weight:300;line-height:1.3}h1{font-size:1.625em;margin-bottom:.5em}h2{font-size:1.438em;margin-bottom:.5em}h3{font-size:1.219em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.723em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}h2 span,h1 span{display:block}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:0.78261em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.39286em}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}li{margin-bottom:.4em}li:last-of-type{margin-bottom:0}ins{background:#fffbeb;text-decoration:none}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}dfn{font-style:italic}mark{background:#ff0;color:#000}code,pre{font-family:"Ubuntu Mono", "Consolas", "Monaco", "Lucida Console", "Courier New", Courier, monospace}pre{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdf6f2;padding:.6em 1em;white-space:pre-wrap;word-wrap:break-word}blockquote{margin:0}blockquote>p{font-size:0.92857em;margin-bottom:0.92308em;font-weight:100;margin:0 0 .4em 0}blockquote small{font-size:.813em;line-height:1.4}button,input,select,textarea{font-family:Ubuntu,Arial,"libra sans",sans-serif;margin:0;vertical-align:baseline;*vertical-align:middle}select{font-size:1em;font-weight:300}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-box-sizing:content-box;-webkit-appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-weight:300;outline:none;padding:0.6956522em 0.869565em}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}form fieldset{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-repeat:no-repeat;background-color:#EFEEEC;background-position:-15px -15px;border:0;margin-bottom:8px;padding:15px 20px}form fieldset h3{border-bottom:1px dotted #dfdcd9;margin-bottom:9px;padding-bottom:10px}form fieldset li:first-child{margin-top:0}form input[type="text"],form input[type="email"],form input[type="tel"],form textarea{-webkit-appearance:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;border:1px solid #999;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0.6956522em 0.869565em}form input:focus,form textarea:focus{border:1px solid #dd4814}form textarea[readonly='readonly']{color:#999}form input[type="checkbox"],form input[type="radio"]{margin:0;width:auto}form input[type="checkbox"]+label,form input[type="radio"]+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}form input[type="submit"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#dd4814;background-image:-moz-linear-gradient(#f26120, #dd4814);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#f26120), to(#dd4814));background-image:-webkit-linear-gradient(#f26120, #dd4814);background-image:-o-linear-gradient(#f26120, #dd4814);-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border:0;color:#fff;display:block;padding:10px 14px;text-shadow:none;width:auto;margin-bottom:0}form input[type="submit"]:hover{background:#dd4814}form label{cursor:pointer;display:block;margin-bottom:4px}form label span{color:#df382c}form ul{margin-left:0}form li{list-style:none outside none;margin-top:14px}form button[type="submit"]{border:0;display:inline-block;font-family:Ubuntu, Arial, "libra sans", sans-serif;text-decoration:none;font-weight:300}form input[type="reset"]{display:none}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.85714em 0;width:100%}table th,table td{padding:15px 10px;background:#f0edea;border:1px dotted #888}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333333;font-weight:normal}table tbody th{text-align:left;font-weight:normal;font-weight:300}table th[scope="col"]{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}@media only screen and (min-width: 984px){form fieldset{padding:15px 20px}img{max-width:none}}.audience-consumer{color:#333}.audience-consumer .row-box,.audience-consumer .main-content{color:#333}.audience-consumer .inner-wrapper{background:#fff}.audience-consumer .quote-right-top{padding:60px 60px 0 40px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat;height:287px;position:absolute;right:-40px;text-align:left;top:-90px;width:31.91489%}.audience-consumer .quote-right-top p{font-size:1.14286em;margin-bottom:0.75em;margin:0.769em;padding-bottom:0;color:#fff}.audience-consumer .quote-right-top p cite{font-size:0.85714em;margin-bottom:1em;color:#fff;padding:0}.audience-consumer .quote-right-top p a,.audience-consumer .quote-right p a{color:#fff}.audience-consumer .quote-right{font-size:1.28571em;margin-bottom:0.66667em;color:#fff;padding:50px 100px 0 50px;text-indent:-6px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;min-height:287px;position:absolute;right:-20px;text-align:left;top:-90px;width:21.2006% em}.audience-consumer .quote-right cite{font-style:normal;margin-left:6px}.audience-consumer .quote-right-alt{background:url(/sites/ubuntu/latest/u/img/patterns/quote-white-br-360x360.png) 0 -100px no-repeat;color:#dd4814;padding:50px 50px 0 50px}.audience-consumer .quote-right-right{background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat}.audience-enterprise h1{margin:0 0 18px 0}.audience-enterprise td{background:#fff}.audience-enterprise th,.audience-enterprise td{padding:6px 10px;background:#fff}.audience-enterprise th[scope="col"]{background:#E2D4DC;color:#772953}.audience-enterprise tbody th[rowspan]{background:#F7F2F6}.audience-enterprise tfoot th[rowspan]{background:#dfdcd9}.audience-enterprise tfoot td,.audience-enterprise tfoot th{font-weight:normal;background:#dfdcd9}.audience-enterprise .inner-wrapper{background:#2c001e;color:#fff}.audience-enterprise .row-box{background:#fff;color:#333}.row-enterprise{background:#772953;color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-enterprise .box,.row-enterprise div{background:#772953;color:#fff}.row-enterprise a{color:#fff}.enterprise-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/enterprise-dot-pattern.png")}.developer-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/developer-dot-pattern.png")}.wrapper,header.banner .nav-primary,nav div.footer-a div,.inline-lists ul,.legal{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:auto}.inner-wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;clear:both;display:block;float:left;width:100%;margin:0;padding-bottom:20px;position:relative;z-index:1}@media only screen and (min-width: 768px){.med-six-col .three-col{width:48%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}@media only screen and (min-width: 769px){.inner-wrapper{border-radius:4px;padding-bottom:20px}}@media only screen and (min-width: 984px){.wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin:0 auto;position:relative;text-align:left;width:984px}.inner-wrapper{-moz-box-shadow:0 0 3px #c9c9c9;-webkit-box-shadow:0 0 3px #c9c9c9;box-shadow:0 0 3px #c9c9c9;margin:10px 0 30px}.three-col,.med-six-col .three-col{width:23.30%}.three-col.last-col:nth-of-type(2n){margin-right:0}.med-six-col .three-col:nth-of-type(2n){margin-right:20px}.med-six-col .three-col.last-col{margin-right:0}}.left{float:left}.right{float:right}.caps{text-transform:uppercase}img{border:0 none;height:auto;max-width:100%}img.left{margin-right:0}img.touch-border{margin-bottom:-3px}.accessibility-aid,.off-left{position:absolute;left:-999em}a.external{-moz-background-size:0.7em 0.7em;-webkit-background-size:0.7em 0.7em;-o-background-size:0.7em 0.7em;background-size:0.7em 0.7em;padding-right:.9em;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.svg");background-position:right 1px;background-repeat:no-repeat}.opera-mini a.external,.no-svg a.external{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.png")}.text-center,.align-center{text-align:center}.no-margin{margin:0}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-left-20{margin-left:-20px}.pull-right-20{margin-right:-20px}.pull-left-40{margin-left:-40px}.pull-right-40{margin-right:-41px}.no-border{border:0}.link-top{font-size:1em;margin-bottom:0.85714em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-17px;padding:5px;float:right}.pull-bottom-right{position:absolute;right:0;bottom:0;left:auto}.box .pull-bottom-right{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}.pull-bottom-left{margin-left:-20px;margin-bottom:-21px}.pull-top-right{margin-left:-20px;margin-top:-21px}div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:absolute;left:-999em}.priority-0,.not-for-small{position:absolute;left:-999em}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+h3,.video-container+.video-title{margin-top:20px}@media only screen and (max-width: 768px){.pull-right-40{margin-right:-30px}.pull-bottom-right,.pull-bottom-left{position:static}img.pull-bottom-left{margin-bottom:0;margin-left:0}}@media only screen and (min-width: 768px){div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:relative;left:auto}.priority-0,.not-for-small{position:relative;left:auto}.for-mobile,.for-small{position:absolute;left:-999em}.pull-right{float:right;margin-right:-30px}img.pull-left{margin-left:-30px}img.touch-border{float:left;margin-bottom:-30px}}@media only screen and (min-width: 769px){img.left{margin-right:20px}}@media only screen and (min-width: 984px){img.touch-border{float:left;margin-bottom:-40px}img.pull-left{margin-left:-40px}.pull-right{float:right;margin-right:-40px}.for-tablet,.for-medium{display:none}.no-border{border:0}}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}p.intro{font-size:1.14286em;margin-bottom:0.75em;line-height:1.4}.row div p:last-child,.row div ul:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888;font-size:.813em}@media only screen and (min-width: 768px){p.intro{font-size:1.13333em}}@media only screen and (min-width: 984px){h1{font-size:2.8125em}h2{font-size:2em;margin-bottom:.375em}h3{font-size:1.438em;margin-bottom:.522em}h4{font-size:1em;margin-bottom:.75em}h5{font-size:1em}p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}p.intro{font-size:1.25em}}header.banner{border-top:0;min-width:100%;width:auto;background:#dd4814;display:block;position:relative;z-index:2}header.banner .nav-primary{border:0;margin:0 auto;overflow:hidden}header.banner .nav-primary ul{border-right:1px solid #ed6637;float:left;margin:0;position:relative}header.banner .nav-primary ul li{border-left:1px solid #c64012;float:left;list-style-image:none;margin:0;text-indent:0;vertical-align:bottom}header.banner .nav-primary ul li:last-child{border-right:1px solid #c64012}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited{font-size:14px;border-left:1px solid #ec5b29;color:#fff;display:block;margin-bottom:0;padding:14px 14px 13px;position:relative;text-align:center;text-decoration:none;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased}header.banner .nav-primary ul a.active{background:#B83A10;border-left:1px solid #ec5b29}header.banner .nav-primary ul li a:hover{background:#e1662f;border-top:0;-moz-box-shadow:inset 0 2px 2px -2px #777;-webkit-box-shadow:inset 0 2px 2px -2px #777;box-shadow:inset 0 2px 2px -2px #777}#main-navigation-link{display:none}header.banner .nav-toggle{position:absolute;right:0;display:block;width:48px;height:48px;text-indent:-99999px;background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg);-moz-background-size:25px auto;-webkit-background-size:25px auto;-o-background-size:25px auto;background-size:25px auto;background-repeat:no-repeat;background-position:center center;cursor:pointer}header.banner .no-script{display:none}.opera-mini header.banner .nav-toggle,.no-svg header.banner .nav-toggle{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png)}header.banner nav ul{background-color:#f0f0f0;display:none;float:left}header.banner .nav-primary.active{-moz-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);padding:0;border-bottom:1px solid #d4d7d4}header nav ul.active{display:block}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{display:block;padding:0;margin:0;border:none}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:#d0d0d0}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner .nav-primary ul li{border-bottom:1px solid #F2F2F4;font-size:16px}header.banner .nav-primary ul li:last-child{border:0}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:14px 14px 13px;text-align:left}header.banner nav.nav-primary ul.active li ul{display:none}#menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.svg);background-repeat:no-repeat;background-position:50% 26px;content:"";display:block;height:23px;margin-left:0;padding-bottom:17px;position:relative;top:-3px;width:48px;z-index:999}html.no-svg #menu.active:after,.opera-mini #menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.png)}.nav-secondary{border-bottom:1px solid #dfdcd9;margin-bottom:0}.nav-secondary ul{float:left;margin-bottom:10px;margin-left:2px}.nav-secondary ul li{float:left;margin-top:16px;font-size:14px;margin-right:15px}.nav-secondary ul li a:link,.nav-secondary ul li a:visited{color:#333;font-size:14px;float:left}.nav-secondary ul li a:hover,.nav-secondary ul li a:active{color:#dd4814;text-decoration:none}.nav-secondary ul li,.nav-secondary ul li.active a:link,.nav-secondary ul li.active a:visited{color:#dd4814;text-decoration:none}.nav-secondary ul.breadcrumb{margin-left:20px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{color:#888;margin-right:8px}.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#dd4814}header.banner h2{font-size:1.78571em;margin-bottom:0.48em;display:block;left:4px;margin-bottom:0;position:relative;text-transform:lowercase;top:14px}header.banner h2 a:link,header.banner h2 a:visited,header.banner a{color:#fff;float:left;text-decoration:none}header.banner .logo{border-left:0;float:left;height:48px;overflow:hidden}header.banner .logo-ubuntu{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/ubuntu-logo.png") no-repeat scroll 0 10px transparent;font-size:18px;margin-bottom:0;position:relative;text-transform:lowercase;float:left;margin:0;display:inline-block;height:32px;min-width:128px;margin-right:-20px;margin-left:10px;padding:7px 14px 9px 0}header.banner .logo-ubuntu img{margin-right:8px;position:absolute;left:-999em}header.banner .logo-ubuntu span{float:left;font-size:23px;font-weight:300;padding-left:122px;padding-right:20px;position:relative;top:5px}header.banner .nav-primary.nav-left .logo-ubuntu{float:right}header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.svg");background-size:107px 25px;float:left}html.no-svg header.banner .nav-primary.nav-right .logo-ubuntu,.opera-mini header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.png")}@media only screen and (max-width: 295px){header.banner .nav-primary.nav-right .logo-ubuntu,header.banner .logo-ubuntu{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.svg") 0 50% no-repeat;min-width:0;width:38px}header.banner .logo-ubuntu span{padding-left:38px}}html.no-svg header.banner .logo-ubuntu,.opera-mini header.banner .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.png")}@media only screen and (max-width: 768px){header.banner .nav-primary{-moz-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);box-shadow:0 1px 2px 1px rgba(0,0,0,0.2)}header.banner .nav-primary.active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;padding:0}header nav ul.active{float:left}header nav ul.active li:last-child a:link,header nav ul.active li:last-child a:visited{border-bottom:0}header.banner .nav-primary ul{position:relative;width:100%}header.banner .nav-primary ul li.active a:link,header.banner .nav-primary ul li.active a:visited{color:#333;font-weight:700}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;display:block;font-weight:300;margin:0;padding:0;width:100%}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{background-color:#f0f0f0;border-bottom:1px solid #d4d7d4;color:#333333;font-size:1em}header.banner .nav-primary ul li:nth-last-child(-n+2) a:link,header.banner .nav-primary ul li:nth-last-child(-n+2) a:visited{border:0}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:#f8f8f8}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:8px 10px;text-align:left}header.banner .nav-primary ul li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border-bottom:0;border-right:1px solid #d4d7d4;float:left;width:50%}.nav-secondary{background:#fff}.nav-secondary ul.second-level-nav{border-top:1px solid #d4d7d4;display:none;margin-bottom:0;margin-left:0;padding-bottom:10px;padding-top:10px;width:100%}.nav-secondary ul.second-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left}.nav-secondary ul.second-level-nav li a,.nav-secondary ul.second-level-nav li a:link,.nav-secondary ul.second-level-nav li a:visited{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;height:100%;padding:10px 10px 10px 20px;width:100%}.nav-secondary ul.second-level-nav li.active a,.nav-secondary ul.second-level-nav li.active a:link,.nav-secondary ul.second-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav{display:none;margin-bottom:0;width:100%;padding-bottom:20px}.nav-secondary ul.third-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left;padding-left:30px}.nav-secondary ul.third-level-nav li a,.nav-secondary ul.third-level-nav li a:link,.nav-secondary ul.third-level-nav li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px 10px 10px 0;display:block;width:100%;height:100%}.nav-secondary ul.third-level-nav li.active a,.nav-secondary ul.third-level-nav li.active a:link,.nav-secondary ul.third-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav li.single-link{width:100%}.nav-secondary ul.third-level-nav li:only-child{width:100%}.nav-secondary ul.breadcrumb{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:0;margin-bottom:0}.nav-secondary ul.breadcrumb li:first-of-type{border-bottom:1px solid #d4d7d4;margin-bottom:-1px}.nav-secondary ul.breadcrumb li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#fff;width:100%;display:block;height:40px;margin:0}.nav-secondary ul.breadcrumb li a,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;width:100%;color:#333333;display:block;margin-right:0;text-decoration:none;padding:8px 10px 0 10px}.nav-secondary ul.breadcrumb li.active{margin-top:12px}.nav-secondary ul.breadcrumb li.active a,.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.breadcrumb li:nth-of-type(2n){margin-top:12px}.nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.svg);background-position:center center;background-repeat:no-repeat;background-size:18px;float:right;height:18px;margin-right:-5px;margin-top:-6px;padding:10px;position:relative;right:0;top:0;width:18px}.nav-secondary ul.breadcrumb li+li{display:none}.nav-secondary ul.breadcrumb li+li a:link,.nav-secondary ul.breadcrumb li+li a:active,.nav-secondary ul.breadcrumb li+li a:visited{padding-left:20px}.nav-secondary ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li a:after,.nav-secondary.open ul.breadcrumb li a:link:after,.nav-secondary.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg)}.nav-secondary.open ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg);margin-top:-7px}.nav-secondary.open ul.second-level-nav,.nav-secondary.open ul.third-level-nav,.nav-secondary.open ul.breadcrumb li+li{display:block}.no-js .nav-secondary ul.second-level-nav{display:block}.no-js #main-navigation-link{position:absolute;right:10px;top:12px;width:20px;height:28px;z-index:999;text-indent:-999em;display:block}.no-js #main-navigation-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;display:block;width:28px;height:28px;position:absolute}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}html.no-svg header.banner .nav-toggle,.opera-mini header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png")}}@media only screen and (min-width: 768px){header.banner .nav-primary ul li{border-bottom:0}}@media only screen and (min-width: 769px){header.banner{-moz-box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF;-webkit-box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF;box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF}header.banner nav.nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border-bottom:0}header.banner .nav-toggle{display:none}header.banner nav ul{background-color:transparent;display:block}header.banner .nav-primary ul li{border-left:1px solid #C64012}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:1px solid #EC5B29}header.banner .nav-primary ul li:last-child{border-right:1px solid #C64012;border-left:1px solid #C64012}header.banner .nav-primary ul li a.active{background-color:#B83A10}header.banner .nav-primary ul li a:hover{background-color:#E1662F}.nav-secondary ul:last-child li:last-child{padding-bottom:10px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.second-level-nav li,.nav-secondary ul.third-level-nav li{margin-right:15px}.nav-secondary ul.breadcrumb{float:left}.nav-secondary ul.breadcrumb li{margin-bottom:10px}.nav-secondary ul{float:none;margin-bottom:0}.nav-secondary ul li{margin-bottom:5px}}@media only screen and (min-width: 984px){header.banner{margin-bottom:20px}header.banner nav.nav-primary ul{display:block}header.banner .nav-primary,#nav-global .nav-global-wrapper{width:984px}header.banner .nav-primary.nav-right .logo-ubuntu{margin-left:0}}header.banner .nav-primary ul{position:static}header.banner .nav-primary li ul{-moz-box-shadow:0 2px 2px -1px #777;-webkit-box-shadow:0 2px 2px -1px #777;box-shadow:0 2px 2px -1px #777;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:#f7f7f7;border:1px solid #d5d5d5;display:none;float:none;margin:0;padding:5px 0;position:absolute;top:51px;width:200px}header.banner .nav-primary li:hover ul:after{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up-smaller.png") no-repeat;content:'';display:block;height:8px;left:20px;position:relative;top:-13px;width:200px;z-index:999}.no-generatedcontent header.banner .nav-primary li ul{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;top:48px}header.banner .nav-primary li ul .arrow-up{display:none}header.banner .nav-primary li ul li{border:0;float:none}header.banner .nav-primary li ul li a:link,header.banner .nav-primary li ul li a:visited{border:0;color:#333333;padding:0 0 11px 14px;text-align:left;width:170px}header.banner .nav-primary li ul li a:hover{background:none repeat scroll 0 0 transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#DD4814}header.banner .nav-primary li ul li.first a:link,header.banner .nav-primary li ul li.first a:visited,header.banner .nav-primary li ul li:first-of-type a:link{padding:10px 14px}header.banner .nav-primary li ul li.active a:link,header.banner .nav-primary li ul li.active a:visited{background:none repeat scroll 0 0 transparent !important}header.banner .nav-primary li ul .promo{border-top:1px solid #D5D5D5;float:left;margin-top:5px;padding:15px 0 0}header.banner .nav-primary li ul .promo a:link,header.banner .nav-primary li ul .promo a:visited{background:none repeat scroll 0 0 transparent;border-left:0 none;color:#333333;height:auto;padding:0;text-align:left}header.banner .nav-primary li ul .promo p{margin:0 10px}header.banner .nav-primary li ul .promo a:hover{box-shadow:none;color:#DD4814}header.banner .nav-primary li ul .promo img{margin-top:14px;margin-bottom:-6px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;position:relative;top:1px}header.banner .nav-primary li ul .promo .category{color:#888;font-size:11px;margin:0 10px;text-transform:uppercase}header.banner .nav-primary li:hover ul{display:block}html.lt-ie8 header.banner .nav-primary li:hover ul{display:none}.header-search,#box-search{padding:7px 0 7px 14px;overflow:hidden}.header-search input[type="search"],.header-search input[type="text"],#box-search input[type="search"],#box-search input[type="text"]{-webkit-appearance:none;-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;background-color:#be3d00;border:none;color:#fff;display:block;float:left;font-size:16px;height:2.1em;margin-bottom:0;padding:0.5em 2.5em 0.5em 0.5em;width:100%}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-moz-placeholder,#box-search ::-moz-placeholder{color:white;opacity:0.4}.header-search :-ms-input-placeholder,#box-search :-ms-input-placeholder{color:white;opacity:0.4}.header-search input:-moz-placeholder,#box-search input:-moz-placeholder{color:white;opacity:0.4}.header-search ::placeholder,#box-search ::placeholder{color:white;opacity:0.4}.header-search input[type="search"]:focus,#box-search input[type="search"]:focus{background-color:#a63603}.header-search button[type=submit],#box-search button[type=submit]{padding:3px 2px;line-height:0;float:left;margin-left:-40px;display:block;background:none;overflow:visible}.header-search button[type=submit]:hover,#box-search button[type=submit]:hover{background:none}.header-search button[type=submit] img,#box-search button[type=submit] img{height:28px;width:28px}header.banner .search-toggle{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search_icon_white_64.png");background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search.svg");background-position:center center;background-repeat:no-repeat;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:58px;text-indent:-999em;top:0;width:24px}.search-toggle:link,.search-toggle:active{outline:none}#box-search,.header-search{background:#f0f0f0;border:0;display:none;float:left;margin-bottom:0;position:relative;margin:0 0 -1px 0;padding:0;width:100%;z-index:3}#box-search.active,.header-search.active,.header-search.open{display:block}#box-search div,.header-search div{-moz-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#f0f0f0;margin:10px;position:relative;z-index:1}#box-search form input[type="search"],.header-search form input[type="search"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;border:0;color:#333;font-size:16px;height:auto;margin:0;float:left;padding:9px 10px;width:100%}.yes-js .header-inner #box-search,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner #box-search form,.yes-js .header-inner .header-search form{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;margin-right:0;overflow:hidden;padding:10px;top:0;z-index:999;position:relative;width:100%}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}html.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.png")}}@media only screen and (min-width: 768px){header.banner .search-toggle{display:none}}@media only screen and (min-width: 960px){#box-search,.header-search{background:none;overflow:hidden;padding:7px 0 7px 14px;border-right:0 none;float:right;margin-bottom:0;padding-bottom:5px;padding-right:0;padding-top:7px;max-width:220px}#box-search form input[type="text"],#box-search form input[type="search"],.header-search form input[type="text"],.header-search form input[type="search"]{-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-search.png") no-repeat scroll 5px center,none repeat scroll 0 0 #BE3D00;border:6px solid #DE6532;border-width:0 0 1px;color:#fff;font-size:0.813em;height:24px;margin-bottom:0;padding:4px 4px 4px 30px;transition:all 0.5s ease 0s;width:86px}}@media only screen and (max-width: 960px){header.banner nav.nav-primary .header-search{padding:0;position:relative;top:0;width:100%}header.banner nav.nav-primary .header-search input[type="search"]{border-radius:0;background:#f7f7f7;color:#333}header.banner nav.nav-primary .header-search button[type="submit"]{width:32px;height:38px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.svg") no-repeat scroll center center transparent;background-size:28px 28px}header.banner nav.nav-primary .header-search button[type="submit"] img{max-width:none;display:none}header.banner nav.nav-primary .header-search.open{display:block}header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;right:0;display:block;height:48px;position:absolute;text-indent:-99999px;width:48px}html.no-svg header.banner .search-toggle,.opera-mini header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/img/search-white.png")}.opera-mini x:-o-prefocus,.opera-mini header.banner .search-toggle{-o-background-size:25px auto;background-size:25px auto}}@media only screen and (min-width: 984px){#box-search,.header-search{display:block;margin-right:0}#box-search form input[type="text"]:focus,.header-search form input[type="text"]:focus{width:160px}}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}}body.ubuntu-search .nav-secondary,body.search-results .nav-secondary,body.search-no-results .nav-secondary{display:none}body.ubuntu-search section>h1,body.ubuntu-search section article h1,body.search-results section>h1,body.search-results section article h1,body.search-no-results section>h1,body.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}body.ubuntu-search section>h1,body.search-results section>h1,body.search-no-results section>h1{border-bottom:1px dotted #dfdcd9}body.ubuntu-search .main-search,body.search-results .main-search,body.search-no-results .main-search{padding:20px 0;margin:0 0 20px 0;background-color:transparent}body.ubuntu-search .main-search input[type="search"],body.search-results .main-search input[type="search"],body.search-no-results .main-search input[type="search"]{float:left;width:100%;font-size:2em;border:1px solid #999;-moz-box-sizing:border-box;box-sizing:border-box;padding:0.2em 65px 0.2em 0.2em}body.ubuntu-search .main-search button[type=submit],body.search-results .main-search button[type=submit],body.search-no-results .main-search button[type=submit]{padding:4px;line-height:0;float:left;margin-left:-53px;display:block;background:none;overflow:visible;width:auto;margin-top:-4px}body.ubuntu-search .main-search button[type=submit]:hover,body.search-results .main-search button[type=submit]:hover,body.search-no-results .main-search button[type=submit]:hover{background:none}body.ubuntu-search .main-search button[type=submit] img,body.search-results .main-search button[type=submit] img,body.search-no-results .main-search button[type=submit] img{height:45px;width:45px}body.ubuntu-search .search-result h1 .title-main,body.search-results .search-result h1 .title-main,body.search-no-results .search-result h1 .title-main{margin-right:20px}body.ubuntu-search .search-result h1 .result-url,body.search-results .search-result h1 .result-url,body.search-no-results .search-result h1 .result-url{color:#999;overflow:hidden;text-overflow:ellipsis;display:block;vertical-align:bottom;padding-bottom:2px}body.ubuntu-search .search-result h1 .result-url a,body.search-results .search-result h1 .result-url a,body.search-no-results .search-result h1 .result-url a{color:#999}body.ubuntu-search .search-result p,body.search-results .search-result p,body.search-no-results .search-result p{margin-bottom:0}body.ubuntu-search .num-results,body.search-results .num-results,body.search-no-results .num-results{display:inline-block;margin-left:20px}body.ubuntu-search .bottom-results-total,body.search-results .bottom-results-total,body.search-no-results .bottom-results-total{text-align:center;width:100%;overflow:visible;padding-top:20px;margin:0}body.ubuntu-search .bottom-nav,body.search-results .bottom-nav,body.search-no-results .bottom-nav{overflow:hidden;margin-top:-26px}body.ubuntu-search .bottom-nav ul,body.search-results .bottom-nav ul,body.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;padding:0;overflow:hidden}body.ubuntu-search .bottom-nav li,body.search-results .bottom-nav li,body.search-no-results .bottom-nav li{float:left;margin-left:15px}body.ubuntu-search .bottom-nav li:first-child,body.search-results .bottom-nav li:first-child,body.search-no-results .bottom-nav li:first-child{margin-left:0}body.ubuntu-search .nav-back,body.search-results .nav-back,body.search-no-results .nav-back{float:left}body.ubuntu-search .nav-back li:before,body.search-results .nav-back li:before,body.search-no-results .nav-back li:before{content:"\2039";color:#dd4814;margin-right:5px}body.ubuntu-search .nav-back li.item-extreme:before,body.search-results .nav-back li.item-extreme:before,body.search-no-results .nav-back li.item-extreme:before{content:"\2039\2039"}body.ubuntu-search .nav-forward,body.search-results .nav-forward,body.search-no-results .nav-forward{float:right}body.ubuntu-search .nav-forward li:after,body.search-results .nav-forward li:after,body.search-no-results .nav-forward li:after{content:"\203A";color:#dd4814;margin-left:5px}body.ubuntu-search .nav-forward li.item-extreme:after,body.search-results .nav-forward li.item-extreme:after,body.search-no-results .nav-forward li.item-extreme:after{content:"\203A\203A"}body.ubuntu-search .error-notification,body.search-results .error-notification,body.search-no-results .error-notification{background-color:#fdffdc;color:#333;padding:20px;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:20px;display:block}body.ubuntu-search .result-line,body.search-results .result-line,body.search-no-results .result-line{color:#ada69e}body.ubuntu-search .results-top,body.search-results .results-top,body.search-no-results .results-top{border-bottom:1px dotted #dfdcd9;padding-bottom:0.5em}body.ubuntu-search .search-container,body.search-results .search-container,body.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 768px){.ubuntu-search .main-search button[type=submit]{margin-left:-60px;margin-top:0}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 2px 2px -1px #d3d3d3;-webkit-box-shadow:inset 0 2px 2px -1px #d3d3d3;box-shadow:inset 0 2px 2px -1px #d3d3d3;background:none;border-top:0;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{margin:0 auto;width:100%}footer.global .legal{background-image:none;position:relative;clear:both;min-height:40px}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:0.75em;line-height:1.4;margin-bottom:0;padding-bottom:0.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333;font-weight:normal}footer.global nav ul li h2 a:after{content:""}footer.global ul{margin:0}footer.global nav ul li.two-col{display:inline-block;min-height:10em;vertical-align:top}footer.global nav ul li li{font-size:0.85714em;margin-bottom:1em;font-size:0.75em;margin-bottom:0}footer.global ul li li a:link,footer.global ul li li a:visited{color:#333;margin-bottom:0}footer.global ul li li a:hover,footer.global ul li li a:active,footer.global h2 a:hover,footer.global h2 a:active{color:#dd4814}footer.global .inline li{display:inline}footer.global p,footer.global ul.inline li a{color:#333;font-size:12px;margin-bottom:0}footer.global ul.inline li a:hover{color:#dd4814}footer.global ul.inline li:after{color:#888;content:"\00b7";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:120px}footer.global ul.inline li:last-child:after{content:""}footer.global .inline li{float:none;margin-bottom:0}footer.global .top-link{-moz-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;background:none repeat scroll 0 0 transparent;border:0 none;float:left;font-size:0.75em;letter-spacing:0.05em;margin:0 0 0 -10px;padding-right:20px;text-transform:uppercase;width:100%}footer.global .top-link a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.svg");background-position:10px center;background-repeat:no-repeat;background-size:14px 14px;border-bottom:0 none;color:#888888;display:block;float:none;font-weight:400;padding:12px 0 12px 28px}html.no-svg footer.global .top-link a,.opera-mini footer.global .top-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.png")}@media only screen and (max-width: 768px){footer.no-global .legal{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;box-shadow:0 2px 2px -1px #D3D3D3 inset;padding-top:10px;margin-left:-10px;padding-left:10px;padding-right:10px}#livechat-eye-catcher{display:block}}@media only screen and (min-width: 768px){footer.global .inline li{display:inline;float:left}}@media only screen and (min-width: 769px){footer.global .top-link{display:none}footer.global .footer-b h2 a i{font-style:normal;display:inline}}@media only screen and (min-width: 984px){footer.global .legal{width:984px}footer.global{padding:30px 0 20px}footer.global .legal{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png") 100% 0 no-repeat}footer.global .footer-a{display:block}}#context-footer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1em;margin-bottom:0.85714em;border-bottom:0;clear:both;padding-bottom:1px;padding-top:0;position:relative;margin-bottom:0;margin-left:0;margin-right:0;width:100%}#context-footer hr{-moz-box-shadow:inset 0 2px 2px -2px #333;-webkit-box-shadow:inset 0 2px 2px -2px #333;box-shadow:inset 0 2px 2px -2px #333;background:#dd4814;height:14px;margin:0 0 10px;border:0;clear:both}#context-footer div.twelve-col{display:table;float:none;margin-bottom:7px}#context-footer div div{display:block;padding-left:0;margin-bottom:20px}#context-footer div div div{display:block;padding-left:0;margin-bottom:0}#context-footer div div.feature-one{padding-left:0}#context-footer div div.feature-four{margin-bottom:0;margin-right:0}#context-footer>div{padding-left:10px;padding-right:10px}#context-footer ul{margin-bottom:5px}#context-footer li.active{display:none}#context-footer h3{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}#context-footer .list a:after,#context-footer a.link-arrow:after,#context-footer nav ul li h2 a:after{content:' \203A'}@media only screen and (min-width: 768px){#context-footer{margin-bottom:12px;padding-left:30px;padding-right:30px}#context-footer div+div{width:31%}#context-footer div div.feature-four{padding-bottom:20px}#context-footer hr{margin:0 -30px 40px}#context-footer>div{padding-left:0;padding-right:0}}@media only screen and (min-width: 984px){#context-footer{padding:0 40px 10px}#context-footer div div{display:table-cell;float:none;padding-left:20px;margin-bottom:0}#context-footer hr{margin:0 -40px 40px}}a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#dd4814;color:#fff;text-decoration:none;display:inline-block;margin:0;font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased;padding:8px 14px;width:100%;text-align:center}a.cta-large,button.cta-large{font-size:1.28571em;margin-bottom:0.66667em;padding:10px 20px}a.link-cta-canonical,button.cta-canonical,form button.cta-canonical[type="submit"],form input.cta-canonical[type="submit"]{background:#772953;color:#fff}a.link-cta-inverted,button.cta-inverted{background:#fff;color:#333}.row-enterprise a.link-cta-canonical,.row-enterprise button.link-cta-canonical{background:#fff;color:#772953}a.link-cta-ubuntu:hover,a.link-cta-ubuntu:hover,button.cta-ubuntu:hover,form button[type="submit"]:hover,form input[type="submit"]:hover{background:#c03f11;text-decoration:none}a.link-cta-canonical:hover,button.cta-canonical:hover{background:#5f2143;text-decoration:none}a.link-cta-inverted:hover,.row-enterprise a.link-cta-canonical:hover,button.cta-inverted:hover,.row-enterprise button.cta-canonical:hover{background:#fff;text-decoration:underline}a.cta-deactivated,a.cta-deactivated:hover,button.cta-deactivated,button.cta-deactivated:hover{background:#efefef;color:#fff;cursor:not-allowed}@media only screen and (min-width: 768px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}@media only screen and (min-width: 984px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}form input,form select,form textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}form .fieldset-submit ul{margin-bottom:0}form fieldset .mktError,form fieldset .errMsg,form fieldset .reqMark{color:#df382c}form fieldset .mktFormMsg{clear:both;display:block}.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-bottom:1px dotted #888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0 !important}.row-grey{background:#f7f7f7}.no-border{border:0}#main-content .row-hero{margin-top:20px;padding-top:0}.row-background{color:#fff;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/image-background-wallpaper.jpg") no-repeat scroll 50% 50% #4b1827}.row-background a.alternate{color:#fff;text-decoration:underline}.row-background a.alternate:hover{color:rgba(255,255,255,0.6)}@media only screen and (min-width: 768px){.row-background{background-position:center 50%;background-size:100% auto}}.strip{width:100%;display:block}.strip-dark{background-color:#2c001e;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/background-grid.png");background-repeat:repeat;color:#fff}.strip-dark .list-ubuntu li{border:0}.strip-dark .resource{color:#333;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.strip-dark .resource:before{border-right-color:#2c001e}#main-content .strip-dark .resource:before{border-bottom-width:29px;right:-2px;top:-1px}#main-content .strip-dark .resource:hover:before{border-bottom-width:34px}#main-content .strip-dark .resource h2{padding-right:20px}.row-aux{background-color:rgba(255,255,255,0.6);text-align:center}.row-aux h2,.row-aux p{text-align:left}.row-aux a p{color:#333;margin-bottom:30px}.row-step h2{position:relative;top:5px}.row-step .step{position:relative;top:-5px;height:32px;width:32px;border-radius:50%;border:3px solid #dd4814;color:#dd4814;line-height:32px;text-align:center;background-color:#fff;font-size:23px;font-weight:400}@media only screen and (min-width: 768px){.row{padding:30px}#main-content .row-hero{margin-top:40px}}@media only screen and (min-width: 769px){.row-step .step{height:42px;width:42px;line-height:42px}.row br{display:block}}@media only screen and (min-width: 984px){.row br{display:block}.row{padding:60px 40px 40px}.no-border{border:0}}.box,.box-grey{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1.333em 20px}.box{background:#fff;border:1px solid #dfdcd9}.box-grey{background:#f7f7f7;color:#333}.box-orange{background:#dd4814;color:#fff}.box-highlight{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;border:1px solid #f7f7f7}.box-textured{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg");border:0}.box-padded{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#efefef;border:0;margin-bottom:20px;padding:6px 5px}.box-padded h3{font-size:1.39286em;margin-bottom:0.61538em;margin-left:5px;margin-top:5px}.box-padded li h3{font-size:1.39286em;margin-bottom:0.61538em;margin:0}.box-padded div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:8px 8px 2px}.box-padded-feature{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/soft-centre-bkg.gif") repeat scroll 0 0 #a09f9f;border:0;margin-bottom:20px;padding:11px 5px 6px}.box-padded-feature h3{color:#fff;margin-left:5px;font-size:1.39286em;margin-bottom:0.61538em}.box-padded-feature h4{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}.box-padded-feature>div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:20px 8px}.box-padded-feature div div{margin-bottom:0}.box-padded-feature .inline-icons{display:table;width:100%;margin:0;text-align:center}.box-padded-feature .inline-icons li{display:table-cell;text-align:left;float:none}.box-padded-feature .one-col{width:48px;float:left}.resource{cursor:pointer;padding-bottom:40px;position:relative;-moz-transition:background .2s ease-out;-webkit-transition:background .2s ease-out;transition:background .2s ease-out}.resource h2{padding-right:20px}.resource.five-col h2 a:link,.resource.five-col h2 a:visited,.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:inherit !important}.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:1.125em}.resource.twelve-col h2 a:link,.resource.twelve-col h2 a:visited{font-size:1.40625em}.resource:hover{background-color:#fafafa}.resource:after{-moz-box-shadow:0 -1px 2px 0 #ddd;-webkit-box-shadow:0 -1px 2px 0 #ddd;box-shadow:0 -1px 2px 0 #ddd;content:'';height:1px;position:absolute;right:-6px;top:14px;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-moz-transition:all .2s ease-out;-webkit-transition:all .2s ease-out;transition:all .2s ease-out;width:41px;z-index:2}.resource:hover:after{right:-9px;top:18px;width:48px}.resource:before{content:'';position:absolute;-moz-transition:border-width .2s ease-out;-webkit-transition:border-width .2s ease-out;transition:border-width .2s ease-out;top:-2px;right:-3px;width:0;height:0;border-bottom:30px solid #fdfdfd;border-right:30px solid #fff;-webkit-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);-moz-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);box-shadow:-2px 2px 2px rgba(176,176,176,0.4);z-index:2;-webkit-border-radius:0 0 0 0;-moz-border-radius:0 0 0 0;border-radius:0 0 0 0}.resource:hover:before{border-bottom-width:35px;border-right-width:35px}.resource:last-of-type{margin-bottom:30px}.resource .content-cat{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-icon-document.png") left center no-repeat;color:#aea79f;font-size:14px;letter-spacing:1px;margin:0;padding-left:20px;padding:0;position:absolute;text-transform:uppercase}.resource .content-cat-webinar{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-webinar.png") left center no-repeat}.resource.box-image-centered div+span img{margin-top:40px}html.yui3-js-enabled .resource:hover a{text-decoration:underline}.row-grey .resource:before{border-right-color:#f7f7f7}@media only screen and (max-width: 768px){.box-padded-feature .inline-icons li{float:left;display:block}.box-padded-feature .one-col{width:48px;float:left}}.arrow-up,.arrow-down,.arrow-right,.arrow-left{height:11px;position:absolute;width:18px}.arrow-up{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up.png") 0 0 no-repeat;left:20px;top:-11px}.arrow-down{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-down.png") 0 0 no-repeat;bottom:-11px;right:20px}.arrow-right{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-right.png") 0 0 no-repeat;height:18px;right:-11px;top:20px;width:11px}.arrow-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-left.png") 0 0 no-repeat;bottom:20px;height:18px;left:-11px;width:11px}div>.arrow-left{left:-10px}@media only screen and (min-width: 769px){html.yui3-js-enabled .arrow{visibility:visible}}.list,.list-ubuntu,.list-canonical{list-style:none;margin-left:0}.list li,.list-ubuntu li,.list-canonical li{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list li:last-of-type,.list li.last-item,.list-ubuntu li:last-of-type,.list-ubuntu li.last-item,.list-canonical li:last-of-type,.list-canonical li.last-item{border:0;padding-bottom:0}.list article{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list-spaced article,.list-spaced li{padding:30px 0}nav .list a{display:block}.list-ubuntu li,.list-canonical li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.svg")}.list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.svg")}.list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.svg")}.list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.svg")}.vertical-divider .list-canonical li,.vertical-divider .list-ubuntu li{padding-left:25px}html.no-svg .list-ubuntu li,.opera-mini .list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.png")}html.no-svg .list-canonical li,.opera-mini .list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.png")}html.no-svg .list-warm li,.opera-mini .list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.png")}html.no-svg .list-dark li,.opera-mini .list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.png")}.no-bullets{list-style:none;margin-left:0}.row .combined-list ul,.row .combined-list div{margin-bottom:0}.row .combined-list li.last-item{border-bottom:1px dotted #888;padding-bottom:10px}.row .combined-list div.last-col,.row .combined-list ul.last-col{margin-bottom:20px}.row .combined-list div.last-col li.last-item,.row .combined-list ul.last-col li.last-item{border-bottom:0;padding-bottom:0}.inline{margin-left:0}.inline li{display:inline;list-style:none;margin-left:0;float:left}@media only screen and (min-width: 768px){.row .combined-list ul,.row .combined-list div{margin-bottom:20px}.row .combined-list li.last-item{border-bottom:0;padding-bottom:0}}ul.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}ul.inline-logos li{clear:none;display:inline-block;float:none;margin:10px 20px;padding:0}ul.inline-logos li.clear-row{clear:left}ul.inline-logos li.last-item{border:0}ul.inline-logos img{-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;vertical-align:middle;max-width:115px;max-height:32px}.inline-icons{margin:0 0 20px}.inline-icons li{margin-right:20px;margin-bottom:20px;text-align:left;display:inline-block}.inline-icons li.last-item{margin-right:0}.inline-icons.no-margin-bottom li{margin-bottom:0}.inline-icons img{vertical-align:middle;max-width:115px;max-height:32px}@media only screen and (max-width: 768px){ul.inline-logos img{max-width:172px;max-height:48px}}@media only screen and (min-width: 769px){ul.inline-logos li{clear:none;display:inline-block;height:auto;margin:20px 0;line-height:60px;padding:0 40px}ul.inline-logos li img{float:none;vertical-align:middle;max-width:200px;max-height:45px}}@media only screen and (min-width: 984px){.inline-icons{text-align:left;margin-bottom:20px}}blockquote.pull-quote{text-indent:0}blockquote.pull-quote p{color:#333;padding-left:10px;padding-right:10px;font-size:1.77379em;margin-bottom:0.48323em;text-indent:-.4em;margin-left:.4em;line-height:1.3}blockquote.pull-quote p span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}blockquote.pull-quote p span+span{left:5px}blockquote.pull-quote p cite{margin:10px 0 0;font-weight:300;display:block;font-size:.75em;text-indent:0}blockquote.pull-quote.js{padding-left:60px;display:table-cell}blockquote.quote-canonical,blockquote.quote-canonical-white{font-size:1.14286em;margin-bottom:0.75em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-white-360x360.png") no-repeat 20px -130px;color:#772953;float:right;font-size:1em;height:215px;margin-top:0;padding:20px 60px 0;position:relative;width:236px}blockquote.quote-canonical-white{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-aubergine-345x345.png") no-repeat 0 0;color:#fff;padding:80px 60px 0;height:265px}blockquote.quote p:first-child{font-size:1.28571em;margin-bottom:0.66667em;line-height:1.3;text-indent:-7px}blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.svg");background-repeat:no-repeat;background-size:287px 286px;color:#fff;height:167px;padding:60px 40px;position:static;right:-40px;top:-90px;width:207px}blockquote.quote-right-bottom p{color:#fff}blockquote.quote-grey{font-size:2.57143em;margin-bottom:0.33333em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-grey-br-211x211.png") no-repeat scroll 0 0 transparent;color:#fff;height:152px;line-height:40px;margin-left:20px;padding:60px 0 0;text-align:center;width:211px}blockquote.quote-bottom-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;color:#fff;height:167px;padding:55px 40px 70px 45px;width:225px}html.no-svg blockquote.quote-right-bottom,.opera-mini blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.png")}.row-quote{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-quote blockquote{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0;padding:0}.row-quote blockquote p{margin-bottom:.75em;line-height:1.3;color:#333;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333;font-style:normal;margin-bottom:0;font-size:.75em;text-indent:-14px;text-indent:0}.row-quote .quote-twitter{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-115x139.png") 20px bottom no-repeat;padding:20px 20px 20px 23.40425%}.row-quote .quote-twitter-small{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-54x63.png") 99% bottom no-repeat;padding:20px 20px 20px 80px}.row-quote .quote-twitter-small p{margin:0;padding:0}blockquote.quote-canonical,blockquote.quote-canonical-white{background:none;color:#333;width:auto;height:auto;padding:0 30px;margin-top:20px}@media only screen and (min-width: 768px){.row-quote blockquote{text-indent:-7px}.pull-quote{text-indent:-.4em}.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em}blockquote.pull-quote p,.row-quote blockquote p{padding-left:0;padding-right:0;text-indent:-.7em}blockquote.pull-quote p span,.row-quote blockquote p span{font-size:1.391304348em}blockquote.pull-quote p cite,.row-quote blockquote p cite{margin-left:0;text-indent:0}blockquote.pull-quote p span,.row-quote blockquote p span{top:5px}}@media only screen and (min-width: 769px){.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em;text-indent:-.4em}}@media only screen and (min-width: 984px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}blockquote.pull-quote p span,.row-quote blockquote p span{top:10px}}html.js .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:auto;padding-bottom:.6em;padding-right:20px}html.yui3-js-enabled .tabbed-menu{display:none;padding-bottom:20px;padding-top:20px}html.yui3-js-enabled .arrow{display:none;position:absolute;visibility:hidden}html.yui3-js-enabled .tabbed-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:8px 8px 0;background:#f7f7f7;margin-bottom:8px}html.yui3-js-enabled .tabbed-content.hide{display:block;opacity:1 !important}html.yui3-js-enabled .tabbed-content .title{display:none}html.yui3-js-enabled .tabbed-content div{display:none}html.yui3-js-enabled .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-down.svg") no-repeat scroll right 3px #f7f7f7;color:#333;display:block;font-size:16px;padding-bottom:.6em;padding-right:20px;width:100%}html.yui3-js-enabled .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.svg");margin-bottom:10px}html.yui3-js-enabled .tabbed-content.open div{display:block}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-right.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content.open .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content .accordion-button{background-image:none;margin-bottom:10px}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content div{display:block}@media only screen and (min-width: 768px){html.yui3-js-enabled .tabbed-menu{display:block}html.yui3-js-enabled .tabbed-content{margin-bottom:20px;padding:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0 !important}html.yui3-js-enabled .tabbed-content .title{display:block}html.yui3-js-enabled .tabbed-content div{display:block}html.yui3-js-enabled .tabbed-content .vertical-divider div{display:table-cell}html.yui3-js-enabled .tabbed-content .accordion-button{display:none}}html.yui3-js-enabled .accordion-button.active{background-color:transparent}@media only screen and (min-width: 768px){.tabbed-menu{-moz-box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-shadow:0 -1px 10px #cfcfcf inset;box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background:none repeat scroll 0 0 #f7f7f7;padding-bottom:20px;padding-top:20px;position:relative}.tabbed-menu ul{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;margin-bottom:0;padding:0;position:relative;table-layout:fixed;width:100%}.tabbed-menu li{text-align:center;display:table-cell}.tabbed-menu a{color:#666;display:block;outline:none}.tabbed-menu a .active{color:#772953;text-decoration:none}.tabbed-menu a:hover{text-decoration:none}.tabbed-menu .arrow{bottom:0;position:absolute}.tabbed-content{*zoom:1;padding:20px 40px 0}.tabbed-content:before,.tabbed-content:after{content:"";display:table}.tabbed-content:after{clear:both}.tabbed-content .row{padding-left:0;padding-right:0}.tabbed-content .main-content{padding-bottom:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0}.tabbed-content-bg{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin-left:20px;margin-right:20px}.tabbed-content-bg .row-box{padding-left:0;padding-right:0}html.yui3-js-enabled .arrow{visibility:visible}}.row.vertical-divider{padding-bottom:40px}.vertical-divider div,.vertical-divider li{border-right:0;display:block;padding-left:0;padding-right:0}.vertical-divider-full{padding-bottom:0}.vertical-divider-full>div{padding-bottom:40px}.row.vertical-divider-full{padding-bottom:0}@media only screen and (max-width: 767px){.vertical-divider>div,.vertical-divider>li{border-bottom:1px dotted #888;padding-bottom:20px}.vertical-divider div:last-of-type,.vertical-divider li:last-of-type,.inline-icons li:last-of-type{border-bottom:0;padding-bottom:5px}.row.vertical-divider{padding-bottom:0}.equal-height div,.equal-height li{height:auto !important}}@media only screen and (min-width: 984px){.row.vertical-divider{padding-bottom:60px}.vertical-divider>div,.vertical-divider>li{border-right:1px dotted #888;display:table-cell;float:none;margin-right:0;padding-left:20px;padding-right:20px;vertical-align:top}.vertical-divider>div:last-child,.vertical-divider>li:last-child,.vertical-divider>div.last-col,.vertical-divider>li.last-col,.vertical-divider>div:last-of-type,.vertical-divider>li:last-of-type{border-right:0;padding-right:0}.vertical-divider>div:first-child,.vertical-divider>li:first-child,.vertical-divider>div.first-col,.vertical-divider>li.first-col,.vertical-divider>div:first-of-type,.vertical-divider>li:first-of-type{padding-left:0}}.slider{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#f7f7f7;padding-top:40px}.slider .slide-window{overflow:hidden;position:relative;height:450px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s}.slider .slide-container{position:absolute;width:2800 px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s;left:0}.slider .slider-dots ul{position:absolute;top:550px;left:220px;z-index:5}.slider .slider-dots li{background-position:0 -8px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/sprite-pager.png") no-repeat;float:left;height:7px;list-style-type:none;margin-right:.75em;text-indent:-9999em;width:7px}.slider .slider-dots li.active{background-position:0 0}.slider .slider-dots a{display:block;outline:0}.slider .slide{float:right;width:700px}.slider .slide h3{margin-top:65px;display:inline-block}.slider .slide p{width:350px}.slider .arrow-prev,.slider .arrow-next{font-size:5em;margin-top:150px;display:block;color:#888;outline:0}.slider .arrow-prev:hover,.slider .arrow-next:hover{text-decoration:none;color:#333}.slider .arrow-prev:active,.slider .arrow-next:active{padding-top:1px;text-decoration:none}.slider .arrow-prev:focus,.slider .arrow-next:focus{text-decoration:none}.yui3-tooltip-hidden{display:none}.yui3-tooltip-content{-moz-box-shadow:0 2px 8px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.2);box-shadow:0 2px 8px rgba(0,0,0,0.2);background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg") repeat scroll 0 0 transparent;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #e3e3e3;color:#333;margin-top:-30px;max-width:520px;position:relative}.yui3-tooltip .yui3-widget-bd{padding:20px;width:320px}.yui3-tooltip .yui3-widget-bd *{max-width:100%}.yui3-tooltip .yui3-widget-bd h5{margin-bottom:10px;font-size:22px;font-weight:300}.yui3-tooltip .yui3-widget-bd img{float:left;margin-right:10px}.yui3-tooltip .yui3-widget-bd q{border-bottom:1px dotted #888;border-top:1px dotted #888;display:block;font-size:16px;font-style:italic;margin-bottom:0;margin-top:20px;padding:10px 0}.yui3-tooltip .yui3-widget-bd p:last-child{margin-bottom:0}.yui3-tooltip .yui3-widget-ft,.yui3-tooltip .yui3-widget-ft div{position:absolute;width:0;height:0;border-style:solid;line-height:0;font-size:0}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft,.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:-10px;left:50%;margin:0 0 0 -10px;border-width:0 10px 10px;border-color:#efefef transparent}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:0;border-color:#efefef transparent}.tooltip-label{-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.3);box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;border:1px solid #dfdcd9;display:none;font-size:13px;line-height:1;margin:0;padding:6px 5px;position:absolute;top:-20px;white-space:nowrap;z-index:1000}body,a:link,a:visited{-webkit-font-smoothing:antialiased}code,pre,p{line-height:1.5}body{font-size:16px}@media only screen and (min-width: 768px){code,pre,p{line-height:1.6}body{font-size:16px}}@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi){body{font-size:18px}}.not-for-medium{display:none}@media only screen and (min-width: 985px){.not-for-medium{display:block}}header.banner{background:#000;-moz-box-shadow:inset 0 2px 2px -2px #000;-webkit-box-shadow:inset 0 2px 2px -2px #000;box-shadow:inset 0 2px 2px -2px #000;margin-bottom:0}header.banner .nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;*zoom:1}header.banner .nav-primary:before,header.banner .nav-primary:after{content:"";display:table}header.banner .nav-primary:after{clear:both}header.banner nav.nav-primary{border-bottom:1px solid #262626;overflow:visible}header.banner nav.nav-primary .user-nav{float:right;margin-right:20px}header.banner nav.nav-primary .user-dropdown:hover ul:after{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img{margin-right:10px}header.banner nav.nav-primary .user-dropdown .menu-link img.hover{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img.normal{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.hover,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.hover{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.normal,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.normal{display:none}header.banner nav.nav-primary .user-dropdown ul{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin-top:-2px;background-color:#fff;border-width:0}header.banner nav.nav-primary .user-dropdown ul a:hover{background-color:transparent}header.banner nav.nav-primary #user-dropdown .dropdown ul{width:auto}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:73px 30px;-webkit-background-size:73px 30px;-o-background-size:73px 30px;background-size:73px 30px;background-image:url(../img/logos/logo.svg);background-position:20px;background-repeat:no-repeat;min-width:120px;padding-top:6px;margin-left:0}body.no-svg header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url(../img/logos/logo.png)}input[type=text]::-ms-reveal,input[type=text]::-ms-clear{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}.contextual-bar{overflow:hidden;background-color:#fff;border-bottom:1px solid #d4d4d4}form.search-form{overflow:hidden;float:right;width:100%;position:relative}form.search-form input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;border-left:0;margin:0;width:100%;height:50px;float:left;font-size:1em;padding-top:0;padding-bottom:0;padding-right:30px;background-color:transparent;-webkit-appearance:none}form.search-form input:focus{border-color:#dd4814}form.search-form button[type=submit],form.search-form button[type=submit]:hover{position:absolute;top:10px;right:10px;display:block;height:30px;width:30px;padding:0;line-height:0;-webkit-appearance:none;background:transparent}form.search-form button img{height:16px}.contextual-nav{border:0;display:block;margin:0;padding-left:10px;background-color:transparent;overflow:hidden;float:left}.contextual-nav li,.contextual-nav li:last-child{font-size:0.875em;float:left;list-style-type:none;margin:0;margin-left:5px}.contextual-nav li a:link,.contextual-nav li a:visited,.contextual-nav .contextual-nav__label{display:block;color:#333;font-weight:300;text-align:center;padding:16px 10px 10px 10px;border-bottom:3px solid transparent}.contextual-nav .contextual-nav__label{color:#cdcdcd}.contextual-nav li a:hover{border-bottom-color:#dd4814;text-decoration:none;color:#dd4814}.contextual-nav li a.active{border-bottom:3px solid #dd4814}.opera-mini header.banner .logo-ubuntu,.no-svg header.banner .logo-ubuntu{background-image:url(../img/logos/logo.png)}@media only screen and (min-width: 769px){header.banner .nav-primary ul li,header.banner .nav-primary ul li:last-child{border-bottom:0;width:auto}header.banner nav.nav-primary li a:link,header.banner nav.nav-primary li a:visited{border-left:1px solid #262626;font-weight:400}header.banner nav.nav-primary ul li a.active{padding-bottom:10px;background-color:#0e0c0b;border-bottom:3px solid #dd4814;border-left:1px solid #262626}header.banner nav.nav-primary ul li{border-left:1px solid #262626}header.banner nav.nav-primary ul li a:hover{background-color:#dd4814}header.banner nav.nav-primary ul{background-color:transparent;border-right:1px solid #262626;display:block}header.banner nav.nav-primary ul li:last-child{border-left:1px solid #262626;border-right:0}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:0}header.banner .nav-primary ul li a.external:hover{background-image:url("../img/icons/external-link-grey.png")}form.search-form{width:325px}form.search-form input{border-left:1px solid #d4d4d4;margin:0 20px;width:250px;font-size:0.875em}}@media only screen and (min-width: 1030px){header.banner{height:48px;overflow:hidden}header.banner .nav-primary{width:100%}}body{background-repeat:repeat}.row{border:0;background-color:rgba(255,255,255,0.6)}@media only screen and (min-width: 769px){.append-one{margin-right:10.6%}.row{padding:50px 40px 30px}}.inner-wrapper{*zoom:1;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:transparent;background-image:none;margin:0 auto;padding-bottom:0;float:none}.inner-wrapper:before,.inner-wrapper:after{content:"";display:table}.inner-wrapper:after{clear:both}.wrapper{position:static;background:transparent;width:100%;overflow:hidden}img.touch-border{margin-bottom:-50px}.inner-wrapper,footer.global .legal{max-width:1030px;width:auto;padding-left:0;padding-right:0}.touch-top{margin-top:-50px}@media only screen and (max-width: 1030px){.inner-wrapper,footer.global .legal{padding-left:8px;padding-right:8px;width:auto}}.footer-cta{background:#fff;padding-bottom:20px}.footer-wrapper.strip-light{background-color:#fff}.solutions-cta{height:60px;background-color:#dd4814;line-height:60px;text-align:center}.solutions-cta a{color:#fff;font-size:1.25em}footer.global{background-color:white;box-shadow:none;padding-top:0}footer.global .row{padding:10px 0 0}footer.global .two-col{width:46%;float:left;display:inline-block;min-height:200px}footer.global h2{padding-bottom:0;color:#888;font-size:16px}footer.global nav .canonlist ul li,footer.global nav .additional-info ul li{min-height:0;width:48%;float:left}footer.global ul.bullets li:after{line-height:1;color:#888;content:"•";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:auto}footer.global a.external{background-image:url("../img/icons/external-link-dark.png")}footer.global .top-link{margin-bottom:10px}footer.global a{color:#333}footer.global a:hover{color:#dd4814}footer.global .legal{background-image:none}footer.global .legal.has-cookie{padding-bottom:70px}footer.global .inner-wrapper{overflow:visible}footer.global a.link-cta-positive,footer.global a.link-cta-negative{width:auto;margin-top:10px;padding-left:20px;padding-right:20px;color:#fff;font-size:14px}footer.global .section__title{background:none;cursor:default}.legal-inner{clear:both;overflow:hidden;float:left;width:100%;padding:20px 10px 0;margin:-3px -10px 0}.social,.social--right{margin-left:0}.social .social__item,.social--right .social__item{display:inline;float:left;padding-right:1em}.social .social__google,.social .social__facebook,.social .social__twitter,.social--right .social__google,.social--right .social__facebook,.social--right .social__twitter{background-image:url("../img/icons/icon-social.png");display:block;width:45px;height:44px}.social .social__google.social__twitter:hover,.social .social__facebook.social__twitter:hover,.social .social__twitter.social__twitter:hover,.social--right .social__google.social__twitter:hover,.social--right .social__facebook.social__twitter:hover,.social--right .social__twitter.social__twitter:hover{background-position:0 -45px}.social .social__google.social__facebook,.social .social__facebook.social__facebook,.social .social__twitter.social__facebook,.social--right .social__google.social__facebook,.social--right .social__facebook.social__facebook,.social--right .social__twitter.social__facebook{background-position:90px 0}.social .social__google.social__facebook:hover,.social .social__facebook.social__facebook:hover,.social .social__twitter.social__facebook:hover,.social--right .social__google.social__facebook:hover,.social--right .social__facebook.social__facebook:hover,.social--right .social__twitter.social__facebook:hover{background-position:90px -45px}.social .social__google.social__google,.social .social__facebook.social__google,.social .social__twitter.social__google,.social--right .social__google.social__google,.social--right .social__facebook.social__google,.social--right .social__twitter.social__google{background-position:135px 0}.social .social__google.social__google:hover,.social .social__facebook.social__google:hover,.social .social__twitter.social__google:hover,.social--right .social__google.social__google:hover,.social--right .social__facebook.social__google:hover,.social--right .social__twitter.social__google:hover{background-position:135px -45px}@media only screen and (min-width: 768px){.social--right{float:right}}#additional-info{border-bottom:0}#additional-info h2:before{background-image:url("../img/icons/external-link-grey.svg"),none;background-repeat:no-repeat;background-size:14px 14px;content:"";display:inline-block;height:15px;margin-right:3px;position:relative;top:3px;width:15px}#additional-info div li{border-left:1px solid #d4d7d4;box-sizing:border-box;display:block;float:left;margin:0;padding:0;width:50%}#additional-info div li a{border-bottom:1px solid #d4d7d4;box-sizing:border-box;color:#333333;display:block;float:left;margin:0;overflow:hidden;padding:8px 10px;text-align:left;white-space:normal;width:100%}#additional-info .section__title{border-bottom:1px solid #d4d7d4;background-position:100% .1em}html.opera-mini footer #nav-global h2:before,html.opera-mini footer #additional-info h2:before,html.no-svg footer #nav-global h2:before,html.no-svg footer #additional-info h2:before{background-image:url("../img/icons/external-link-grey.png")}@media only screen and (min-width: 769px){.footer-wrapper.strip-light{white-space:nowrap}footer.global{padding-top:40px;padding-bottom:40px}footer.global .two-col{width:14.89361%;display:inline-block;min-height:0}footer.global .section{min-height:160px;margin-right:40px;padding-bottom:0;border-right:1px dotted #aaa;border-bottom:0}footer.global .section:last-child{margin-right:0;border-right:0}footer.global li{display:inline;float:left}footer.global ul.no-bullets li{border-right:1px dotted #aaa;padding-right:15px;padding-left:15px}footer.global ul.no-bullets li a{font-size:16px}footer.global ul.no-bullets li a:hover{color:#dd4814}footer.global ul.no-bullets li:last-child{border-right:none}footer.global ul.no-bullets li:first-child{padding-left:0px}#additional-info .section__title{border-bottom:0}#additional-info div li,#additional-info div a:link{width:100%;border:0}}.actions .actions__social-item--twitter,.actions .actions__social-item--google-plus{text-indent:-99999px;background-image:url("../img/icons/icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:block}.actions .actions__social-item--twitter{background-position:0 0}.actions .actions__social-item--twitter:hover{background-position:0 -45px}.actions .actions__social-item--google-plus{background-position:-45px 0}.actions .actions__social-item--google-plus:hover{background-position:-45px -45px}.anchor{display:inline-block;margin-left:3px;opacity:.0;position:relative;top:1px;width:1em;height:1em;background:url("../img/icons/anchor_16.svg") 0 80% no-repeat;background-size:16px;-moz-transition:opacity .1s;-webkit-transition:opacity .1s;transition:opacity .1s}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,dt:hover .anchor,li:hover .anchor{opacity:1}.box{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;display:block;margin-bottom:0;border-top:0;border-left:0;border-right:0;padding-left:0;padding-right:0}.box-dim{background-color:#fafafa}@media only screen and (min-width: 768px){.box{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);-webkit-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);display:inline-block;margin-bottom:20px;padding-left:20px;padding-right:20px;border:0}}a.indent{-moz-box-shadow:inset 0 1px 2px 0 #333;-webkit-box-shadow:inset 0 1px 2px 0 #333;box-shadow:inset 0 1px 2px 0 #333;background:rgba(0,0,0,0.1);padding:10px 30px;text-weight:normal}a.indent:hover{background:rgba(0,0,0,0.2)}a.link-cta-positive,a.link-cta-negative{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#dd4814;color:#fff;display:inline-block;font-size:1.14286em;font-weight:300;text-decoration:none;margin:0;padding:8px 14px;text-align:center;-moz-transition:background .2s;-webkit-transition:background .2s;transition:background .2s;width:100%}a.link-cta-positive:hover,a.link-cta-negative:hover{background-color:#ae3910}a.link-cta-positive .external,a.link-cta-negative .external{padding-right:1em;background-image:url("../img/icons/external-link-white.svg");background-repeat:no-repeat;background-size:11px;background-position:right top}@media only screen and (min-width: 769px){a.link-cta-positive .external,a.link-cta-negative .external{padding-right:.7em}}a.link-cta-negative{background-color:#b2b2b2}a.link-cta-negative:hover{background-color:#888}.charms__list{list-style:none;margin-bottom:1em;margin-left:0;border-bottom:1px dotted #d4d4d4}.charms__list .charms__list--config{display:none}.charms__list .charms__list--toggle{display:block}.charms__list .charms__list--toggle.is-open+.charms__list--config{display:block}.charms__list .charms__list--config-name{border-top:0}.charms__list--item{font-size:1em;border-top:1px dotted #d4d4d4;padding:10px 0 0 10px;margin-bottom:10px}.charms__list--item:last-of-type{margin-bottom:10px}.charms__list--icon{margin-right:.4em;width:25px;height:25px}.charms__list--toggle{background:url("../img/shared/icon-arrow-down.svg") no-repeat center center;width:16px;height:100%;float:right;text-indent:-99999px;margin-right:20px}.charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.svg");background-size:14px}.charms__list--config{padding-left:35px;padding-bottom:20px}.charms__list--config-name{font-size:1em;margin-top:15px;padding-top:15px;font-weight:400;border-top:1px dotted #d4d4d4}.charms__list--config-name:first-of-type{border-top:0}.charms__list--config-type{font-weight:400}.charms__list--config-description,.charms__list--config-setting{margin-left:30px;margin-top:8px}.charms__list--config-setting{font-size:0.875em;color:#888;font-family:"Ubuntu Mono","Consolas","Monaco","Lucida Console","Courier New",Courier,monospace}body.no-svg .charms__list .charms__list--toggle{background-image:url("../img/shared/icon-arrow-down.png")}body.no-svg .charms__list .charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.png")}pre{background:transparent;border:1px solid #888;margin:0 0 1.5em 0}pre:not(:first-child){margin-top:1.5em}code.language-bash .comment{color:#888}.cookie-policy{-moz-box-shadow:0 -1px 2px rgba(0,0,0,0.2);-webkit-box-shadow:0 -1px 2px rgba(0,0,0,0.2);box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;bottom:0;position:fixed;width:100%;z-index:100}.cookie-policy p{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:13px;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url(../img/icons/close-orange.svg);background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}html.no-svg .cookie-policy .link-cta,html.opera-mini .cookie-policy .link-cta{background-image:url(../img/icons/close-orange.png)}html.opera-mini .cookie-policy{position:relative;top:0}.deploy-command{margin-bottom:10px;position:relative}.deploy-command .deploy-command__field{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);background-image:url("../img/icons/code-snippet_16.svg");background-repeat:no-repeat;background-position:5px center;background-color:#fff;background-size:1.142857143em;width:100%;height:37px;border:1px solid #c1c1c1;padding:.6em;color:#888;padding-left:2em;font-size:0.875em;white-space:nowrap;overflow:hidden;cursor:text}.deploy-command .command2clipboard__clip{cursor:pointer;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;line-height:1;position:absolute;right:1px;top:1px;background-color:#fff;padding:9px 8px 7px;border-left:1px solid #b2b2b2;display:none}.deploy-command .command2clipboard__clip.zeroclipboard-is-hover{background-color:#eee}@media only screen and (min-width: 1030px){.deploy-command .command2clipboard__clip{display:inline-block}}.dropdown-menu{position:relative;display:block}.dropdown-menu.open .menu-link{background-color:#000}.dropdown-menu.open .dropdown{display:block}.dropdown-menu .menu-link .border-box{display:block;color:#f2f2f4}.dropdown-menu .dropdown{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;display:none;position:absolute;z-index:1000;top:0;left:0;right:0;width:auto;background-color:#fff;box-shadow:0 1px 5px rgba(0,0,0,0.2)}.dropdown-menu .dropdown.right{left:auto;right:0;text-align:right}.dropdown-menu .dropdown.narrow{min-width:140px;width:auto}.dropdown-menu .dropdown a,.dropdown-menu .dropdown p,.dropdown-menu .dropdown li{color:#333}.dropdown-menu .dropdown p{padding:11px 20px}.dropdown-menu .dropdown header,.dropdown-menu .dropdown footer{background-color:#fff}.dropdown-menu .dropdown header{padding:11px 20px;color:#f2f2f4;font-size:16px;font-weight:300}.dropdown-menu .dropdown footer{padding:20px}.dropdown-menu .dropdown ul{width:auto;left:0;right:0}.dropdown-menu .dropdown ul li a{width:auto;display:block;padding:15px 20px}.files .files__list{list-style:none;margin-bottom:1em;border-left:1px solid #cbcbcb;margin-left:1em}@media only screen and (min-width: 768px){.files .files__list{margin-left:0}}.files .files__list li{position:relative}.files .files__list li a:link,.files .files__list li a:visited{color:#333;text-decoration:none}.files .files__list li:before{content:'';width:12px;height:1px;background:#d4d4d4;display:inline-block;position:relative;top:-4px;margin-right:5px}.files .files__list li:last-child:after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;top:.85em;background:#fff}.files .files__list ul:last-child>li a:after{content:'';width:4px;height:3em;position:absolute;display:block;left:-1.8em;top:-1.45em;background:white;cursor:default}.files .files__list .files__list{margin-left:1.3em}.files .files__list .files__list--item,.files .files__list .files__list--item-folder{font-size:0.875em;margin-bottom:0.75em}.files .files__list .files__list--item-folder{background-position:center right;background-size:12px;cursor:pointer}.files .files__list .files__list--item-folder:after{font-size:14px;display:block;content:"-";position:absolute;left:-7px;top:4px;padding:0 4px;line-height:0.9em;background:#fff;border:1px solid #888}.files .files__list .files__list--item-folder.is-closed+ul{display:none}.files .files__list .files__list--item-folder.is-closed:after{content:"+";padding:0 2px}.files .files__actions--launchpad{background:url("../img/icons/icon-launchpad.svg") no-repeat;padding-left:1.4em}#main-content .row-hero{padding-top:20px;margin-top:0}#main-content .row-hero .intro{font-size:16px}@media only screen and (min-width: 769px){#main-content .row-hero{padding-top:60px}#main-content .row-hero .intro{font-size:1.4375em;margin-bottom:40px}}.how-to div div img{float:left;margin:0 20px 20px 0}header.banner a.external,header.banner a.external:hover{background-image:url("../img/icons/external-link-grey.png")}a.external,a.external:hover,header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-repeat:no-repeat}a.external,a.external:hover header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-position:right 14px top 14px;padding-right:35px;background-size:auto}@media only screen and (max-width: 769px){header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background:none}header.banner nav.nav-primary ul li a.external:after{display:inline-block;width:11px;height:11px;margin-left:0.25em;background-image:url("../img/icons/external-link-dark.png");vertical-align:text-top}}.list__icons{margin-left:0;margin-bottom:5px}.list__icons li{list-style:none;float:left;padding:8px 8px 0 0;margin-bottom:0}.list__icons li img{width:24px;height:24px;vertical-align:top}.list__tick{list-style-image:url("../img/icons/tick.png")}.list__middot{margin-left:0;list-style:none}.list__middot li{display:inline}.list__middot li:after{content:"•";color:#888;margin:0 5px 0 8px;vertical-align:middle}.list__middot li.files__actions--last:after{content:""}.combined-list .list li{border-bottom:1px dotted #888;padding:10px 0}@media only screen and (max-width: 767px){.combined-list .last-col .list li:last-of-type{border-bottom:0;padding-bottom:0}}@media only screen and (min-width: 768px){.combined-list .list li:last-of-type{border-bottom:0;padding-bottom:0}}.events-list li{position:relative;padding-bottom:20px}.events-list dd{margin-left:0;background-position:0 center;background-repeat:no-repeat;background-size:20px 20px;padding:6px 20px 6px 24px}.events-list .event-map{display:none}.events-list .event-date{background-image:url("../img/icons/calendar.svg")}.events-list .location{background-image:url("../img/icons/location.svg")}@media only screen and (min-width: 769px){.events-list .event-details-wrapper{padding-left:120px}.events-list .event-map{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;position:absolute;left:0;top:0;height:100px;width:100px;float:left;margin-right:10px;margin-top:5px;overflow:hidden;display:block}}body.no-svg .events-list .event-date{background-image:url("../img/icons/calendar.png")}body.no-svg .events-list .location{background-image:url("../img/icons/location.png")}.maintainers .maintainer__email{display:block}.ratings ul{margin-left:2px;margin-bottom:0}.ratings ul li{margin-bottom:0}.ratings ul li img{vertical-align:text-top}.ratings ul li:first-of-type{margin-left:0}.revisions__list{list-style:none;margin-left:0}.revisions__list .revisions__list-item{margin-bottom:1em}.revisions__list .revisions__list_meta{color:#888;margin-bottom:.2em}.revisions__list .revisions__list_meta_date{float:right}.section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;padding-bottom:20px;padding-top:20px}.section .section__title{background:url(../img/shared/icon-arrow-up.svg) no-repeat center right;cursor:pointer;margin-bottom:1em}.section.is-closed{height:60px}.section.is-closed .section__title{background-image:url(../img/shared/icon-arrow-down.svg)}.no-svg .row.section .section__title{background:url(../img/shared/icon-arrow-up.png)}.no-svg .row.section.is-closed .section__title{background:url(../img/shared/icon-arrow-down.png)}footer .section{margin-bottom:1em;padding-bottom:1em}footer .section.is-closed{height:auto;padding-bottom:0}footer .section.is-closed ul{display:none}@media only screen and (min-width: 769px){.row .section .section__title{background-image:none;cursor:auto}.row .section.is-closed{height:auto}}.list--concealed .list-item{display:none}.list--concealed .list-item:first-of-type{display:list-item}.list--concealed.list--visible-6 .list-item:nth-child(-n+6){display:list-item}.list--concealed.list--visible-4 .list-item:nth-child(-n+4){display:list-item}.list--concealed.list--visible-2 .list-item:nth-child(-n+2){display:list-item}.list--concealed a.btn__see--less{display:none}.list--concealed a.btn__see--more{display:inline}.list--revealed .list__controls,.list--concealed .list__controls{display:block;margin-top:2em}.list--revealed .list--item{display:list-item}.list--revealed a.btn__see--less{display:inline}.list--revealed a.btn__see--more{display:none}a.btn__see--more,a.btn__see--less{-moz-transition:background .2s;-webkit-transition:background .2s;transition:background .2s;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#333;border-radius:2px;border:1px solid #b2b2b2;background:#fff;padding:0.384615385em 1.153846154em}a.btn__see--more:hover,a.btn__see--less:hover{background:#eee;text-decoration:none}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}.tag-list{list-style:none;margin:0}.tag-list--item{display:inline-block;text-transform:lowercase}.tag-list--item a:link,.tag-list--item a:visited{color:#333}.tag-list--item a:after{content:','}.tag-list--item:last-child a:after{content:''}#twitter-feed,#blog-feed{margin:35px 0}#twitter-feed>ul,#blog-feed>ul{list-style:none;margin-left:0}#twitter-feed>ul li,#blog-feed>ul li{position:relative;margin-bottom:30px}#twitter-feed .user,#blog-feed .user{font-size:0.875em;margin-bottom:0.5em}#twitter-feed .user img,#blog-feed .user img{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:24px;height:24px;vertical-align:middle;margin-right:5px}#twitter-feed .user a:link,#twitter-feed .user a:visited,#twitter-feed .user a:hover,#blog-feed .user a:link,#blog-feed .user a:visited,#blog-feed .user a:hover{text-decoration:none}#twitter-feed .user span[data-scribe="element:name"],#blog-feed .user span[data-scribe="element:name"]{color:#333}#twitter-feed .tweet,#blog-feed .tweet{padding-left:33px;margin-bottom:.3em}#twitter-feed .timePosted,#blog-feed .timePosted{padding-left:33px;font-size:0.875em}#twitter-feed .interact,#blog-feed .interact{padding-left:33px}#twitter-feed .interact a:link,#twitter-feed .interact a:visited,#blog-feed .interact a:link,#blog-feed .interact a:visited{margin-right:20px}@media only screen and (min-width: 769px){#twitter-feed .timePosted{position:absolute;top:0;right:0;padding-left:0}}.spaced-segment{margin-bottom:50px}.spaced-segment h3{margin-bottom:1.3em}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}@media only screen and (min-width: 769px){.tip,.command2clipboard__clip{position:relative;display:inline-block}.tip .tip-content,.command2clipboard__clip .tip-content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tip:hover .tip-content:after,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tip:hover .tip-content:before,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}.fake{display:block}*{-webkit-backface-visibility:hidden;margin:0}html{height:100%}body{height:100%;font-size:1.0em;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-weight:300}hr{border:none;background:#B2B2B2;width:100%;height:1px;display:block;width:100%;float:left;margin-bottom:20px}ul,ol{margin-left:0}a.alt{color:#333}a.alt:hover{color:#dd4814}a:active,a:focus{outline:none}::selection{color:#FFF;background:#dd4814}::-moz-selection{color:#FFF;background:#dd4814}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot?") format("eot"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot?") format("eot"),url("../fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:400;src:url("../fonts/ubuntu-r-webfont.eot?") format("eot"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot?") format("eot"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot?") format("eot"),url("../fonts/ubuntu-mi-webfont.woff2") format("woff2"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot?") format("eot"),url("../fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}.accordion{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.disabled .accordion{opacity:.5;pointer-events:none}.accordion .accordion__title{border-bottom:1px dotted #B2B2B2;padding:13px 20px 12px;margin:0;font-size:1.3em}.accordion .accordion__tab{border-bottom:1px dotted #B2B2B2}.accordion .accordion__tab:last-of-type{border:none}.accordion .accordion__tab .accordion__tab-title{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../img/icons/accordion-open.svg") top 20px right 20px no-repeat}.accordion .accordion__tab .accordion__tab-title.active{background-image:url("../img/icons/accordion-close.svg")}.accordion .accordion__tab .accordion__tab-title.active+.accordion__tab-content{max-height:3000px;transition:max-height .5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height .5s ease-out;overflow:hidden}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:0.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active{font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active .accordion__tab-link{background:transparent url("../img/icons/cross.svg") top 7px right 0px no-repeat}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover{color:#dd4814}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover .accordion__tab-link{color:#dd4814;background-image:url("../img/icons/cross-orange.svg")}.cta-group .cta-group__link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px 0px 0px 3px;-moz-border-radius:3px 0px 0px 3px;border-radius:3px 0px 0px 3px;display:inline-block;padding:10px 14px;text-align:center;color:#fff;background-color:#dd4814}.cta-group .cta-group__link:hover{cursor:pointer;text-decoration:none;background-color:#c03f11}.cta-group.secondary .cta-group__link{color:#dd4814;border:1px solid #b2b2b2;background-color:#FFF;line-height:1}.cta-group.secondary .cta-group__link:hover{cursor:pointer;background-color:#F2F2F2}a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{font-size:1em;border:none;max-height:37px}a.link-cta-ubuntu[disabled],a.link-cta-ubuntu.disabled,button.cta-ubuntu[disabled],button.cta-ubuntu.disabled,input[type='submit'][disabled],input[type='submit'].disabled,form button[type='submit'][disabled],form button[type='submit'].disabled,form input[type='submit'][disabled],form input[type='submit'].disabled{cursor:default;opacity:.5}a.link-cta-ubuntu.clear,button.cta-ubuntu.clear,input[type='submit'].clear,form button[type='submit'].clear,form input[type='submit'].clear{background:none;color:#333}a.link-cta-ubuntu.secondary,button.cta-ubuntu.secondary,input[type='submit'].secondary,form button[type='submit'].secondary,form input[type='submit'].secondary{color:#dd4814;border:1px solid #b2b2b2;background:#FFF}a.link-cta-ubuntu.secondary.external,button.cta-ubuntu.secondary.external,input[type='submit'].secondary.external,form button[type='submit'].secondary.external,form input[type='submit'].secondary.external{background-image:url("../img/external-link-black.svg");background-size:16px 16px;background-repeat:no-repeat;background-position:top 8px right 8px}a.link-cta-ubuntu.secondary:hover,button.cta-ubuntu.secondary:hover,input[type='submit'].secondary:hover,form button[type='submit'].secondary:hover,form input[type='submit'].secondary:hover{background-color:#F2F2F2;cursor:pointer}a.link-cta-ubuntu.secondary[disabled],a.link-cta-ubuntu.secondary.disabled,button.cta-ubuntu.secondary[disabled],button.cta-ubuntu.secondary.disabled,input[type='submit'].secondary[disabled],input[type='submit'].secondary.disabled,form button[type='submit'].secondary[disabled],form button[type='submit'].secondary.disabled,form input[type='submit'].secondary[disabled],form input[type='submit'].secondary.disabled{cursor:default;color:#f5ae95;border:1px solid #ddd;background:#FFF;opacity:1}a.link-cta-ubuntu.secondary[disabled]:hover,a.link-cta-ubuntu.secondary.disabled:hover,button.cta-ubuntu.secondary[disabled]:hover,button.cta-ubuntu.secondary.disabled:hover,input[type='submit'].secondary[disabled]:hover,input[type='submit'].secondary.disabled:hover,form button[type='submit'].secondary[disabled]:hover,form button[type='submit'].secondary.disabled:hover,form input[type='submit'].secondary[disabled]:hover,form input[type='submit'].secondary.disabled:hover{background:#FFF}a.link-cta-ubuntu.text-button,button.cta-ubuntu.text-button,input[type='submit'].text-button,form button[type='submit'].text-button,form input[type='submit'].text-button{background-color:transparent;color:#333}a.link-cta-ubuntu.text-button:hover,button.cta-ubuntu.text-button:hover,input[type='submit'].text-button:hover,form button[type='submit'].text-button:hover,form input[type='submit'].text-button:hover{text-decoration:underline}a.link-cta-ubuntu.full,button.cta-ubuntu.full,input[type='submit'].full,form button[type='submit'].full,form input[type='submit'].full{display:block;width:100%}@media screen and (max-width: 768px){a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{margin-bottom:20px}}a.link-cta-ubuntu{line-height:20px}.cta-group{float:left;width:auto;clear:both;position:relative;overflow:hidden}.cta-group .cta-group__link{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;max-height:36px;padding-right:49px;width:100%;line-height:1.2;position:relative;margin:0;text-align:left}.cta-group .cta-group__link:after{-webkit-border-radius:0px 3px 3px 0px;-moz-border-radius:0px 3px 3px 0px;border-radius:0px 3px 3px 0px;content:'';display:block;height:36px;width:34px;background:red;position:absolute;top:0;right:0;background-image:url("../img/chevron-white.svg");background-color:#dd4814;background-repeat:no-repeat;background-position:center}.cta-group .cta-group__link:hover{background-color:#dd4814}.cta-group .cta-group__link:hover:after{background-color:#c03f11}.cta-group .cta-group__dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;right:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;position:relative;clear:both}.cta-group .cta-group__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out}.cta-group .cta-group__dropdown .cta-group__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;clear:both;padding:5px 10px;margin:0}.cta-group .cta-group__dropdown .cta-group__item a{color:#333;cursor:pointer;width:100%;float:left;margin:0}.cta-group .cta-group__dropdown .cta-group__item a:hover{color:#dd4814;text-decoration:none}.cta-group.secondary .cta-group__link{float:left;max-height:36px;width:100%}.cta-group.secondary .cta-group__link:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-color:#fff;border:1px solid #b2b2b2;border-left:none;top:-1px;right:-1px}.cta-group.secondary .cta-group__link:hover{background-color:#FFF}.cta-group.secondary .cta-group__link:hover:after{background-color:#F2F2F2}.flash-messages{margin:0px auto;padding:0;max-width:1440px}@media screen and (max-width: 1030px){.flash-messages{margin:0px 10px 20px}}.flash-messages .flash-messages__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.flash-messages .flash-messages__item.success{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.flash-messages .flash-messages__item.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.flash-messages .flash-messages__item.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url'],form textarea,form select,tags-input .tags .input,.accounts .api li input[type='text']{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;background:#FFF;color:#333;border:1px solid #D2D2D2;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0px 13px}form input[type='text']:active,form input[type='number']:active,form input[type='search']:active,form input[type='password']:active,form input[type='email']:active,form input[type='url']:active,form textarea:active,form select:active,tags-input .tags .input:active,.accounts .api li input[type='text']:active{border-color:#B2B2B2;outline:none}form input[type='text']:focus,form input[type='number']:focus,form input[type='search']:focus,form input[type='password']:focus,form input[type='email']:focus,form input[type='url']:focus,form textarea:focus,form select:focus,tags-input .tags .input:focus,.accounts .api li input[type='text']:focus{border-color:#B2B2B2;outline:none}form input.invalid[type='text'],form input.invalid[type='number'],form input.invalid[type='search'],form input.invalid[type='password'],form input.invalid[type='email'],form input.invalid[type='url'],form textarea.invalid,form select.invalid,tags-input .tags .invalid.input,.accounts .api li input.invalid[type='text'],form input.ng-invalid[type='text'],form input.ng-invalid[type='number'],form input.ng-invalid[type='search'],form input.ng-invalid[type='password'],form input.ng-invalid[type='email'],form input.ng-invalid[type='url'],form textarea.ng-invalid,form select.ng-invalid,tags-input .tags .ng-invalid.input,.accounts .api li input.ng-invalid[type='text']{border-color:#d90000}form input[disabled="disabled"][type='text'],form input[disabled="disabled"][type='number'],form input[disabled="disabled"][type='search'],form input[disabled="disabled"][type='password'],form input[disabled="disabled"][type='email'],form input[disabled="disabled"][type='url'],form textarea[disabled="disabled"],form select[disabled="disabled"],tags-input .tags [disabled="disabled"].input,.accounts .api li input[disabled="disabled"][type='text']{-webkit-text-fill-color:#333;border-color:#D2D2D2;background-color:transparent}label{position:relative}.disabled label{cursor:default}form li.help-msg{margin-bottom:1em}form li.help-msg .help{color:#888;font-size:0.875em}form label span{color:#333}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url']{padding:7px 10px}form input[type='text']::-webkit-input-placeholder,form input[type='number']::-webkit-input-placeholder,form input[type='search']::-webkit-input-placeholder,form input[type='password']::-webkit-input-placeholder,form input[type='email']::-webkit-input-placeholder,form input[type='url']::-webkit-input-placeholder{color:#888}form input[type='text']:-moz-placeholder,form input[type='number']:-moz-placeholder,form input[type='search']:-moz-placeholder,form input[type='password']:-moz-placeholder,form input[type='email']:-moz-placeholder,form input[type='url']:-moz-placeholder{color:#888}form input[type='text']::-moz-placeholder,form input[type='number']::-moz-placeholder,form input[type='search']::-moz-placeholder,form input[type='password']::-moz-placeholder,form input[type='email']::-moz-placeholder,form input[type='url']::-moz-placeholder{color:#888}form input[type='text']:-ms-input-placeholder,form input[type='number']:-ms-input-placeholder,form input[type='search']:-ms-input-placeholder,form input[type='password']:-ms-input-placeholder,form input[type='email']:-ms-input-placeholder,form input[type='url']:-ms-input-placeholder{color:#888}form input[type='number']{padding-right:15px}form input[type='search']{-webkit-appearance:textfield}form input[type='search']::-webkit-search-decoration,form input[type='search']::-webkit-search-cancel-button{-webkit-appearance:none}form input[type='radio'],form input[type='image']{display:inline-block;margin-right:10px}form textarea{overflow:auto;height:auto;min-height:175px;padding:7px 10px;vertical-align:top}form select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-position:top 16px right 10px;padding:6px 30px 6px 10px;-moz-appearance:none;text-indent:0.01px;text-overflow:''}form select[multiple],form select[size]{height:auto;background-image:none;padding-top:10px}form select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}form select[disabled]{color:#888;background-image:none}form select::-ms-expand{display:none}form fieldset{background:none;margin-left:0;padding:0}.checkbox{visibility:hidden;width:0;height:0;margin-right:0;position:absolute}.checkbox+.checkbox-label{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:20px;position:relative}.checkbox+.checkbox-label:before{content:"";display:inline-block;width:20px;height:20px;position:absolute;top:0;left:0;background:url("../img/checkbox.svg") no-repeat;background-size:13px 13px;background-position:0px 3px}.checkbox:checked+.checkbox-label:before{background:url("../img/checkbox-checked.svg") no-repeat;background-position:0px 3px}.checkbox[disabled="disabled"]+.checkbox-label:before{cursor:default;opacity:0.5}.field-error,.errors{color:#DF382C}.field-error .errorlist,.errors .errorlist{margin:0}.field-error .errorlist li,.errors .errorlist li{margin:0 0 14px 0}.inline{display:inline-block;width:100%;font-size:0;margin-bottom:10px}.inline.error{background-color:#fdf5f5;box-shadow:0px 0px 0px 5px #fdf5f5}.inline.error .ng-invalid{border-color:#D2D2D2}.inline:last-of-type{margin-bottom:0}.inline label{display:inline-block;float:none;font-size:16px;margin:0}.inline input[type='submit'],.inline input[type='text'],.inline input[type='number'],.inline input[type='search'],.inline input[type='password'],.inline input[type='email'],.inline input[type='checkbox'],.inline select{display:inline-block;clear:none;margin:0;float:none;font-size:16px}.inline input[type='submit']:invalid,.inline input[type='text']:invalid,.inline input[type='number']:invalid,.inline input[type='search']:invalid,.inline input[type='password']:invalid,.inline input[type='email']:invalid,.inline input[type='checkbox']:invalid,.inline select:invalid{-moz-box-shadow:none}.inline input[type='submit']:-moz-submit-invalid,.inline input[type='text']:-moz-submit-invalid,.inline input[type='number']:-moz-submit-invalid,.inline input[type='search']:-moz-submit-invalid,.inline input[type='password']:-moz-submit-invalid,.inline input[type='email']:-moz-submit-invalid,.inline input[type='checkbox']:-moz-submit-invalid,.inline select:-moz-submit-invalid{box-shadow:none}.inline input[type='submit']:-moz-ui-invalid,.inline input[type='text']:-moz-ui-invalid,.inline input[type='number']:-moz-ui-invalid,.inline input[type='search']:-moz-ui-invalid,.inline input[type='password']:-moz-ui-invalid,.inline input[type='email']:-moz-ui-invalid,.inline input[type='checkbox']:-moz-ui-invalid,.inline select:-moz-ui-invalid{box-shadow:none}.inline div{float:none;margin:0}.inline input.cta-ubuntu,.inline a.link-cta-ubuntu,.inline button.cta-ubuntu{font-size:16px}.inline .icon{position:absolute;top:11px;right:10px;cursor:pointer}.inline .error-message{font-size:12px;color:#e85232;margin-top:10px;margin-bottom:10px;font-weight:normal}.form-inline label,.form-inline button,.form-inline input[type='submit'],.form-inline input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{display:inline-block;width:auto;vertical-align:middle;margin-bottom:0}.form-inline input,.form-inline input[type='submit'] input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{margin-left:20px}.form-inline fieldset{width:auto;display:inline-block;margin:0 40px 0 0}.controls{position:absolute;top:0;right:20px}.controls a,.controls button{margin-left:20px}.icon{background-size:16px 16px;width:16px;height:16px;padding:0;display:inline-block}.icon.icon__loading{background:url("../img/in_progress.png") no-repeat;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear}a.icon{cursor:pointer}dl dt{clear:left}dl dd{color:#888;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:37px;margin-bottom:10px !important}tags-input{outline:none}tags-input .host:focus{outline:none}tags-input .tags:focus,tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:4px 0 0;padding:0;list-style-type:none;width:100%;float:left}tags-input .tags .tag-item{display:inline-block;float:left;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;height:30px;line-height:30px;cursor:default;color:#000;padding-right:15px;position:relative;margin:0 11px 0 0}tags-input .tags .tag-item .remove-button{display:inline-block;width:12px;height:12px;text-indent:-999em;background:url("../img/icons/cross.svg") no-repeat;background-size:12px 12px;position:absolute;right:0;top:9px;cursor:pointer}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags .input{padding:7px 10px;width:100% !important;float:left;position:relative !important;left:0}tags-input .tags .input::-ms-clear{display:none}tags-input .autocomplete{float:left;width:100%}tags-input .autocomplete .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px}tags-input .autocomplete .suggestion-list li:hover{background:#EEE;cursor:pointer}tags-input[disabled] .host:focus{outline:none}tags-input[disabled] .tags{cursor:default}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .input{cursor:default}.tag-link{margin-right:10px}.tag-link:last-of-type:after{content:''}.table__data tags-input .tags{margin-top:-10px}.table__data tags-input .tags input{margin-left:0;width:50% !important;float:left}.pagination{margin:10px 0;text-align:center}.pagination .inactive{color:#AEA79F}.pagination a,.pagination span{margin:0 5px}.search{position:relative;padding-bottom:20px}.search input[type='search']{-webkit-appearance:textfield}.search .search__input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:none;padding:13px 20px;font-size:1.25em}.search .search__input::-webkit-input-placeholder{color:#000 !important}.search .search__input:-moz-placeholder{color:#000 !important}.search .search__input::-moz-placeholder{color:#000 !important}.search .search__input:-ms-input-placeholder{color:#000 !important}.search .search__input[disabled="disabled"]{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input[disabled="disabled"]+.search__submit.close{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:25px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0;border:none}.search .search__submit:hover{background-color:transparent;background-image:url("../img/search-icon.svg")}.search .search__submit.close{background-image:url("../img/icons/cross.svg");background-size:21px;margin-top:2px}.search .search__submit.close:hover{background-image:url("../img/icons/cross.svg")}.spinner-col{width:10px}.spinner{float:left;margin:0 auto;text-indent:-9999em}.spinner.spin{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}table{text-align:left;width:100%;margin-bottom:40px;border-collapse:separate;border-spacing:0;font-size:16px}table th,table td{background:transparent;text-align:left;padding:13px 10px}table th .checkbox+.checkbox-label::before,table td .checkbox+.checkbox-label::before{top:-2px}table thead th{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}table tbody tr:hover .icon-controls a{opacity:1}table tbody td{border:none;border-bottom:1px dotted #B2B2B2;position:relative}table tbody td.icon-controls{text-align:right}table tbody td.icon-controls a{opacity:0}table tbody td input[type="text"]{position:absolute;left:10px;top:6px;width:80%}.table-listing{text-align:left;width:100%;margin:0 0 40px 0;border-collapse:separate;border-spacing:0}.table-listing .table-listing__row:hover .table-listing__cell{background-color:#FFF}.table-listing .table-listing__row.error{background-color:#F3E3E2}.table-listing .table-listing__row.error .status{color:#DD3832}.table-listing .table-listing__row.progress{background-color:rgba(25,182,238,0.1)}.table-listing .table-listing__row.selected{background-color:#FFF}.table-listing .table-listing__header{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}.table-listing .table-listing__header .table-listing__header-link{background-repeat:no-repeat;background-position:top 8px right 0;color:#888}.table-listing .table-listing__header .table-listing__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table-listing .table-listing__header .table-listing__header-link:focus,.table-listing .table-listing__header .table-listing__header-link:active,.table-listing .table-listing__header .table-listing__header-link:visited{text-decoration:none}.table-listing .table-listing__header .table-listing__header-link.active{color:#333}.table-listing .table-listing__header .table-listing__header-link.sort{border-bottom:1px solid #333}.table-listing .table-listing__header .divide{width:1px;display:inline-block;background:#D2D2D2 none repeat scroll 0% 0%;height:10px;padding:0px;margin:0px 5px}.table-listing .table-listing__cell{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-bottom:1px dotted #B2B2B2;position:relative}.table-listing .table-listing__cell.icon-controls{text-align:right;opacity:0}.table-listing .table-listing__cell input,.table-listing .table-listing__cell select{position:absolute;left:10px;top:5px;width:80%}.table-listing .fixed{max-width:200px;min-width:200px;width:200px;padding-left:0}.table-listing__header .table-listing .fixed{padding-left:0}.table-listing.no-hover .table-listing__row:hover .table-listing__cell,.table-listing.no-hover .table-listing__row:hover td{background-color:transparent}.t1{width:1%}.t2{width:2%}.t3{width:3%}.t4{width:4%}.t5{width:5%}.t6{width:6%}.t7{width:7%}.t8{width:8%}.t9{width:9%}.t10{width:10%}.t11{width:11%}.t12{width:12%}.t13{width:13%}.t14{width:14%}.t15{width:15%}.t16{width:16%}.t17{width:17%}.t18{width:18%}.t19{width:19%}.t20{width:20%}.t21{width:21%}.t22{width:22%}.t23{width:23%}.t24{width:24%}.t25{width:25%}.t26{width:26%}.t27{width:27%}.t28{width:28%}.t29{width:29%}.t30{width:30%}.t31{width:31%}.t32{width:32%}.t33{width:33%}.t34{width:34%}.t35{width:35%}.t36{width:36%}.t37{width:37%}.t38{width:38%}.t39{width:39%}.t40{width:40%}.t41{width:41%}.t42{width:42%}.t43{width:43%}.t44{width:44%}.t45{width:45%}.t46{width:46%}.t47{width:47%}.t48{width:48%}.t49{width:49%}.t50{width:50%}.t51{width:51%}.t52{width:52%}.t53{width:53%}.t54{width:54%}.t55{width:55%}.t56{width:56%}.t57{width:57%}.t58{width:58%}.t59{width:59%}.t60{width:60%}.t61{width:61%}.t62{width:62%}.t63{width:63%}.t64{width:64%}.t65{width:65%}.t66{width:66%}.t67{width:67%}.t68{width:68%}.t69{width:69%}.t70{width:70%}.t71{width:71%}.t72{width:72%}.t73{width:73%}.t74{width:74%}.t75{width:75%}.t76{width:76%}.t77{width:77%}.t78{width:78%}.t79{width:79%}.t80{width:80%}.t81{width:81%}.t82{width:82%}.t83{width:83%}.t84{width:84%}.t85{width:85%}.t86{width:86%}.t87{width:87%}.t88{width:88%}.t89{width:89%}.t90{width:90%}.t91{width:91%}.t92{width:92%}.t93{width:93%}.t94{width:94%}.t95{width:95%}.t96{width:96%}.t97{width:97%}.t98{width:98%}.t99{width:99%}.t100{width:100%}.table__column--1{width:1%}.table__column--2{width:2%}.table__column--3{width:3%}.table__column--4{width:4%}.table__column--5{width:5%}.table__column--6{width:6%}.table__column--7{width:7%}.table__column--8{width:8%}.table__column--9{width:9%}.table__column--10{width:10%}.table__column--11{width:11%}.table__column--12{width:12%}.table__column--13{width:13%}.table__column--14{width:14%}.table__column--15{width:15%}.table__column--16{width:16%}.table__column--17{width:17%}.table__column--18{width:18%}.table__column--19{width:19%}.table__column--20{width:20%}.table__column--21{width:21%}.table__column--22{width:22%}.table__column--23{width:23%}.table__column--24{width:24%}.table__column--25{width:25%}.table__column--26{width:26%}.table__column--27{width:27%}.table__column--28{width:28%}.table__column--29{width:29%}.table__column--30{width:30%}.table__column--31{width:31%}.table__column--32{width:32%}.table__column--33{width:33%}.table__column--34{width:34%}.table__column--35{width:35%}.table__column--36{width:36%}.table__column--37{width:37%}.table__column--38{width:38%}.table__column--39{width:39%}.table__column--40{width:40%}.table__column--41{width:41%}.table__column--42{width:42%}.table__column--43{width:43%}.table__column--44{width:44%}.table__column--45{width:45%}.table__column--46{width:46%}.table__column--47{width:47%}.table__column--48{width:48%}.table__column--49{width:49%}.table__column--50{width:50%}.table__column--51{width:51%}.table__column--52{width:52%}.table__column--53{width:53%}.table__column--54{width:54%}.table__column--55{width:55%}.table__column--56{width:56%}.table__column--57{width:57%}.table__column--58{width:58%}.table__column--59{width:59%}.table__column--60{width:60%}.table__column--61{width:61%}.table__column--62{width:62%}.table__column--63{width:63%}.table__column--64{width:64%}.table__column--65{width:65%}.table__column--66{width:66%}.table__column--67{width:67%}.table__column--68{width:68%}.table__column--69{width:69%}.table__column--70{width:70%}.table__column--71{width:71%}.table__column--72{width:72%}.table__column--73{width:73%}.table__column--74{width:74%}.table__column--75{width:75%}.table__column--76{width:76%}.table__column--77{width:77%}.table__column--78{width:78%}.table__column--79{width:79%}.table__column--80{width:80%}.table__column--81{width:81%}.table__column--82{width:82%}.table__column--83{width:83%}.table__column--84{width:84%}.table__column--85{width:85%}.table__column--86{width:86%}.table__column--87{width:87%}.table__column--88{width:88%}.table__column--89{width:89%}.table__column--90{width:90%}.table__column--91{width:91%}.table__column--92{width:92%}.table__column--93{width:93%}.table__column--94{width:94%}.table__column--95{width:95%}.table__column--96{width:96%}.table__column--97{width:97%}.table__column--98{width:98%}.table__column--99{width:99%}.table__column--100{width:100%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}.table{display:table;border-color:#B2B2B2;border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}.table .table__row{float:left;width:100%;display:table-row;border-bottom:1px dotted #B2B2B2}.table .table__row:hover{background-color:#FFF}.table .table__row:hover .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row:hover .table__input.invalid{border-color:#D90000}.table .table__row:hover .table__input[disabled]{border-color:transparent;color:#333}.table .table__row:hover .table__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.table__row--no-hover:hover{background-color:transparent}.table .table__row.active{background-color:#FFF}.table .table__row.active .table__dropdown .table__data,.table .table__row.active .table__dropdown .table__input{color:#333}.table .table__row.active:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.active:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.active:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input[disabled]{border-color:transparent;color:#333}.table .table__row.active .table__dropdown{max-height:3000px}.table .table__row.selected .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.selected:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.selected:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.selected:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.disabled>.table__data{color:#888;pointer-events:none}.table .table__row.disabled>.table__data>.table__input{color:#888;pointer-events:none}.table .table__row.disabled .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.disabled:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.noEdit .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.noEdit:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;height:100%;background:none;border:0;text-align:left;float:left}.table .table__header a,.table .table__data a{color:#dd4814}.table .table__header a:hover,.table .table__data a:hover{cursor:pointer}.table .table__head{display:table-head;width:100%;box-sizing:border-box}.table .table__head .table__row{border-bottom:1px solid #B2B2B2}.table .table__head .table__row:hover{background-color:transparent}.table .table__head .table__header{font-size:13px;background:none;color:#888}.table .table__head a,.table .table__head .table__header-link{color:#888}.table .table__head a:hover,.table .table__head .table__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table .table__head a.active,.table .table__head .table__header-link.active{color:#333;text-decoration:none}.table .table__head a.sort,.table .table__head .table__header-link.sort{border-bottom:1px solid inherit}.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.table .table__label a{color:#BCBCBC}.table .table__label a:hover{color:#dd4814}.table .table__label.active a{color:#dd4814}.table .table__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.table .table__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.table .table__tags .table__tag{display:inline-block;margin-right:5px}.table .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.table .table__input.invalid{border-color:transparent}.table .table__input.invalid:focus{border-color:#D90000}.table .table__input[disabled]{border-color:transparent;color:#333}.table .table__input:focus{background-color:#FFF;border-color:#D2D2D2}.table label{font-size:13px;color:#BCBCBC}.table input,.table select{margin:0 0 0 -14px}.table input[type="radio"]{margin-left:0}.table ul li{margin:0;margin-top:14px}.table ul li:first-of-type{margin-top:0}.table .table__dropdown{width:100%;max-height:0;overflow-y:hidden}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative;max-height:0;transition:max-height 0.10s ease-out;overflow:hidden}.table .table__dropdown .table__dropdown-row.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown .table__dropdown-row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head{border-bottom:0}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head .table__header{color:#BCBCBC;font-size:13px}.table .table__dropdown .table__dropdown-row.no-border{border:0}.table .table__dropdown .table__dropdown-row.no-border:before{border:0}.table .table__dropdown .table__dropdown-row .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__dropdown--info{width:100%;max-height:0;background-color:transparent}.table .table__dropdown--info .table__dropdown-row--info{border-bottom:0;position:relative;max-height:0;transition:max-height 0.10s ease-out;overflow:hidden}.table .table__dropdown--info .table__dropdown-row--info.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown--info .table__dropdown-row--info .table__data{color:#BCBCBC}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}h4{font-size:20px;font-weight:300}pre{border:0;background-color:#FFF;border-radius:2px}pre code{counter-reset:line-numbering}pre code .line{float:left}pre code .line::before{content:counter(line-numbering);counter-increment:line-numbering;padding-right:1em;width:1.5em;text-align:right;opacity:0.5;pointer-events:none;user-select:none}.yui3-node-add-widget{width:65.9292%;margin-right:2.21238%}@media screen and (max-width: 768px){.yui3-node-add-widget{width:100%;margin:0}}.yui3-node-add-widget .buttons{margin-top:30px}.yui3-node-add-widget .add-link img.icon{margin-right:6px}.yui3-overlay{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#fff;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.5);box-shadow:0 0 10px 0 rgba(0,0,0,0.5)}.yui3-overlay ul{padding:5px 0}.yui3-overlay li{float:none}.yui3-overlay li:last-child a{border-bottom:none}.yui3-overlay a{display:block;padding:6px 20px;color:#dd4814 !important;border-bottom:1px solid #e5e2e0}.yui3-overlay a:focus,.yui3-overlay a:hover{background-color:#f2f2f2}.yui3-overlay-hidden{display:none}.yui3-widget-mask{background-color:#000;opacity:0.3}.yui3-panel{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#FFF;padding:50px 80px 50px 80px;-webkit-box-shadow:0 0 15px 0 #000;box-shadow:0 0 15px 0 #000}.yui3-panel .yui3-button{float:right}.yui3-panel .yui3-button.link-button{float:left;padding-left:0;padding-right:0;color:#dd4814;border:none;background:none;-webkit-box-shadow:none;box-shadow:none;font-size:13px}.yui3-widget-hd{margin-bottom:30px;font-size:24px}.yui3-widget-ft{margin-top:50px}.yui3-widget-button-wrapper{width:100%}.icon{margin-left:5px;width:16px;height:16px;display:inline-block;text-indent:999em;background-repeat:no-repeat;background-size:16px 16px;vertical-align:middle}.icon.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.icon.edit{background-image:url("../img/icons/edit.png");background-image:url("../img/icons/edit.svg"),none}.icon.delete{background-image:url("../img/icons/delete.png");background-image:url("../img/icons/delete.svg"),none}.icon.remove{background-image:url("../img/icons/filter-remove.svg"),none}.icon.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.icon.debug{background-image:url("../img/icons/debug.png");background-image:url("../img/icons/debug.svg"),none}.icon.success,.icon.tick{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.icon.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}.icon.partition{background-image:url("../img/icons/partition.svg")}.icon.add{background-image:url("../img/icons/add.svg")}.icon.tags{background-image:url("../img/icons/tags.svg")}.icon.mount{background-image:url("../img/icons/mount.svg")}.icon.unmount{background-image:url("../img/icons/unmount.svg")}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.right{float:right !important}.left{float:left !important}.border{border-top:1px dotted #B2B2B2}.border.bottom{border-bottom:1px dotted #B2B2B2}.border.solid{border-style:solid}.vertical-align{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.margin-top{margin-top:20px}.margin-top--five{margin-top:5px}.margin-top--ten{margin-top:10px}.margin-right{margin-right:20px !important}.margin-right--ten{margin-right:10px !important}.margin-bottom{margin-bottom:20px}.margin-left{margin-left:20px !important}.margin-left--ten{margin-left:10px !important}.margin-left--thirty{margin-left:30px !important}.padding-top{padding-top:20px}.padding-top--ten{padding-top:10px !important}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px !important}.padding-bottom--ten{padding-bottom:10px !important}.padding-left{padding-left:20px !important}.padding-left--30,.padding-left--thirty{padding-left:30px !important}.padding-left--35{padding-left:35px !important}.padding-left--45{padding-left:45px !important}.padding-left--50{padding-left:50px !important}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-margin{margin:0}.no-margin-top{margin-top:0 !important}.no-padding{padding:0}.no-padding-top{padding-top:0 !important}.no-padding-left{padding-left:0}.no-padding-bottom{padding-bottom:0 !important}.no-margin-bottom{margin-bottom:0}.width--auto{width:auto}.width--half{width:50%}.width--full{width:100%}.tooltip{position:relative}.tooltip::before{content:attr(data-tooltip);font-size:13px;font-weight:400;position:absolute;z-index:999;white-space:nowrap;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);background:#333;color:#FFF;padding:10px;text-indent:0;opacity:0;transition:opacity 0.4s ease-out;border-radius:5px;box-shadow:0px 1px 3px 0 rgba(51,51,51,0.2);top:-9999em}.tooltip::after{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;z-index:1000;transition:opacity 0.4s ease-out;border-top:5px solid #333;opacity:0;top:-9999em}.tooltip:hover::before{opacity:1 !important;top:-47px}.tooltip:hover::after{opacity:1 !important;top:-10px}.link-cta-ubuntu.tooltip:hover::before,.cta-ubuntu.tooltip:hover::before{top:-50px}.footer-wrapper{border-top:1px dotted #b2b2b2}.footer-wrapper footer.global{background-color:transparent;padding-top:0px;padding-right:20px;padding-left:20px;background-image:url("../img/logos/logo-ubuntu-orange.png");background-image:url("../img/logos/logo-ubuntu-orange.svg"),none;background-size:107px 25px;background-position:top 20px right 20px;background-repeat:no-repeat;max-width:1480px}.footer-wrapper footer.global p{font-size:0.875em}.footer-wrapper footer.global a{margin:0 5px;color:#dd4814}.footer-wrapper footer.global .version{font-weight:500;margin-right:5px}.footer-wrapper footer.global .copy{margin-top:10px}.footer-wrapper footer.global .legal{max-width:1440px}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto -112px;position:relative;background:rgba(255,255,255,0.6);padding-top:172px}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../img/backgrounds/image-background-paper.png");height:100%;width:100%;z-index:-1}.inner-wrapper{max-width:1480px;padding:0px 20px;margin:0 auto;position:relative}.push,.footer-wrapper{height:112px}.row{background-color:transparent;border-bottom:1px dotted #CCC}.row:last-child{border-bottom:none}header.banner{overflow:visible;z-index:20;position:fixed;top:0}header.banner .logo{padding-left:15px}header.banner nav.nav-primary{border-bottom:none}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:100px 30px;-webkit-background-size:100px 30px;-o-background-size:100px 30px;background-size:100px 30px;background-position:5px 9px;background-image:url("../img/logos/logo.png");background-image:url("../img/logos/logo.svg"),none}header.banner .nav-primary li:hover ul:after{display:none}@media screen and (max-width: 768px){header.banner .nav-primary ul{border-right:none}}header.banner #right-nav{float:right;margin-right:20px}@media screen and (max-width: 768px){header.banner #right-nav{margin-right:0}}header.banner #user-link{position:relative}@media screen and (max-width: 768px){header.banner #user-link{border-top:1px solid #d4d7d4;width:100%}}header.banner #user-link>a{padding-bottom:12px}@media screen and (max-width: 768px){header.banner #user-link>a{display:none}}header.banner #user-link .normal,header.banner #user-link .hover{margin-right:7px}@media screen and (max-width: 768px){header.banner #user-link .normal,header.banner #user-link .hover{display:none}}header.banner #user-link .hover{display:none}header.banner #user-link .nav{-webkit-border-radius:0px 0px 4px 4px;-moz-border-radius:0px 0px 4px 4px;border-radius:0px 0px 4px 4px;background-color:#FFF;border:none;display:none;position:absolute;right:0;top:48px;box-shadow:0px 2px 4px rgba(0,0,0,0.15)}@media screen and (min-width: 769px){header.banner #user-link .nav a.active{background:none;border:none}}header.banner #user-link .nav a:hover{background-color:transparent}@media screen and (max-width: 768px){header.banner #user-link .nav a:hover{background-color:#F8F8F8;color:#333}}@media screen and (max-width: 768px){header.banner #user-link .nav{background:none;position:relative;top:inherit;width:100%;box-shadow:none;float:left;padding:0}header.banner #user-link .nav li{border-bottom:1px solid #d4d7d4;width:100%;float:left}header.banner #user-link .nav li a{padding:10px 14px;width:100%}}@media screen and (max-width: 768px){header.banner #user-link:hover>a{background-color:transparent}}header.banner #user-link:hover .normal{display:none}header.banner #user-link:hover .hover{display:inline-block}@media screen and (max-width: 768px){header.banner #user-link:hover .hover{display:none}}header.banner #user-link:hover .nav{display:block}header.banner .nav-toggle{background-image:url("../img/icons/navigation-menu-plain.png");background-image:url("../img/icons/navigation-menu-plain.svg"),none;top:0}@media screen and (max-width: 768px){header.banner .nav-toggles .open{display:block}header.banner .nav-toggles .close{display:none}header.banner #canonlist:target ul{display:block}header.banner #canonlist:target+.nav-toggles .open{display:none}header.banner #canonlist:target+.nav-toggles .close{display:block}}.page-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;float:left;position:fixed;z-index:10;top:48px}.page-header .page-header__nav{position:absolute;top:10px;z-index:1000}.page-header .page-header__nav a{font-weight:300}.page-header .page-header__title{font-size:2em;width:auto;padding:31px 0;margin:0;float:left;font-size:32px}.page-header .page-header__title [contenteditable="true"]{display:inline-block;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-10px 0 -10px -10px;border-radius:2px;color:#333;cursor:default;font-size:32px}.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#FFF;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#d90000}.page-header .page-header__title [contenteditable="true"] br{display:none}.page-header .page-header__title .icon{vertical-align:3px;margin-right:10px}.page-header .page-header__title .page-header__title--identicator{font-size:0.6em;width:auto;display:inline-block;position:relative;top:0px;padding-left:20px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator a{color:#888}.page-header .page-header__title .page-header__title--identicator a:hover{text-decoration:none;border-bottom:3px solid #888}.page-header .page-header__title .page-header__title--identicator a:focus,.page-header .page-header__title .page-header__title--identicator a:active{text-decoration:none}.page-header .page-header__title .page-header__title--identicator a.active{color:#333;border-bottom:3px solid #dd4814}.page-header .page-header__title .page-header__title--identicator a.active:hover{text-decoration:none;cursor:default}.page-header .page-header__title .page-header__title--identicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore{font-size:14px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore:hover{border:0;text-decoration:underline}.page-header .page-header__title .link-cta-ubuntu,.page-header .page-header__title .alt{font-size:16px;margin-left:20px;position:relative;vertical-align:middle;margin-top:-5px}.page-header .page-header__actions{float:right;padding:34px 0;margin-bottom:0}.page-header .page-header__actions .page-header__cta{float:right;position:relative;height:auto;max-height:36px}.page-header .page-header__actions .page-header__cta .cta-group{float:right}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback{display:inline-block;position:relative;line-height:36px;text-align:right;color:#dd4814;margin-right:20px;cursor:pointer}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback:hover{text-decoration:underline}.page-header .page-header__dropdown{float:left;width:100%;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;border-color:#888 !important}.page-header .page-header__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out;border-top:none}.page-header .page-header__dropdown .page-header__feedback{border-top:1px dotted #888;display:inline-block;width:100%;padding:20px 0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;background-position:top 3px left 0px;background-repeat:no-repeat;padding:6px 0 5px 25px;width:auto;display:inline-block;position:relative}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none;background-position:0px 9px}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info.progress,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error.progress{width:100%}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress{padding-left:0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress .loader{position:relative;top:1px}.title .title__indicator .title__link{color:#888;font-size:20px}.title .title__indicator .title__link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.title .title__indicator .title__link:focus,.title .title__indicator .title__link:active{text-decoration:none}.title .title__indicator .title__link.active{color:#333;border-bottom:1px #dd4814 solid}.title .title__indicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:7px;right:7px}form.page-title-form{margin-bottom:30px}form.page-title-form input{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid transparent;background-color:transparent;font-size:36px;line-height:26px;color:#333;margin:6px 10px;padding:4px;height:auto;box-shadow:none}form.page-title-form input:hover{outline:none;background:#FFF;border-color:#D2D2D2;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}form.page-title-form input:focus{border:1px solid #dd4814;background-color:#fff;outline:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}#loader{width:10px;margin:16px auto 0 auto}#importing{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;position:relative}#importing .spinner{position:absolute;left:15px}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.selector{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:20px;background:#FFF;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;width:100%;float:left}.selector h2{font-size:1em;font-weight:300}.selector h2 img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;background:url("../img/icons/help.svg") no-repeat;width:16px;height:16px;padding-left:16px;margin-left:5px}.selector .selector-available,.selector .selector-chosen{width:46%;float:left;margin:0;text-align:left}@media screen and (max-width: 768px){.selector .selector-available,.selector .selector-chosen{width:100%}}.selector .selector-available h2,.selector .selector-chosen h2{background:none;border:none}.selector .selector-available select,.selector .selector-chosen select{margin-bottom:10px}.selector ul.selector-chooser{width:8%;float:left;margin:20% 0 0}@media screen and (max-width: 768px){.selector ul.selector-chooser{width:100%;margin:0 0 10px;text-align:center}}.selector ul.selector-chooser li{width:100%;text-align:center}@media screen and (max-width: 768px){.selector ul.selector-chooser li{width:auto;display:inline-block;height:16px;width:16px;margin:0 20px}}.selector ul.selector-chooser li a{display:block;text-indent:999em;width:16px;height:16px;overflow:hidden;margin:0 auto}.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_right.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_down.svg")}}.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_left.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_up.svg")}}.selector .selector-filter img{display:none}.selector .selector-filter input{background-image:url("../img/search-orange.png");background-repeat:no-repeat;background-position:top 7px right 8px}.selector select#id_mac_addresses_to.filtered{height:269px !important}.nodes{position:relative}.nodes .search{position:absolute;right:0}.nodes .search input[type='submit']{position:absolute;top:8px;right:12px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0}.nodes .search input[type='submit']:hover{color:transparent;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat}@media screen and (max-width: 768px){.nodes .search{position:relative}}@media screen and (max-width: 768px){.nodes .actions select{width:100%;margin-bottom:20px}.nodes .actions input{position:absolute;right:0;top:0}}.powerstates{width:14px;height:15px;display:inline-block}.powerstates.power-on{background:transparent url("../img/icons/power-on.svg") left top no-repeat}.powerstates.power-off{background:transparent url("../img/icons/power-off.svg") left top no-repeat}.powerstates.power-unknown{background:none}.powerstates.power-error{background:transparent url("../img/icons/power-error.svg") left top no-repeat}.powerstates.power-check-ok{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#33CC00}.powerstates.power-check-error{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#FF0000}.node-actions .link-cta-ubuntu,.node-actions .cta-ubuntu{margin-bottom:10px;float:left;font-size:16px}.buttons{margin-top:30px}#network-interfaces li{list-style-type:none}#content-discovery-data{padding-top:20px;margin-top:20px;border-top:1px dotted #B2B2B2}#content-discovery-data .slider{height:0;overflow:hidden}.slider{padding-top:0 !important}.slider .content{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#FFF;border:1px solid #EEE;border-top:none;padding:20px}.slider .content pre{margin:0}.slider .tabs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;padding:8px 20px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;border:1px solid #EEE}.add-machine__list{padding:13px 0 20px;border-top:1px dotted #888;margin-bottom:0}.add-machine__list .add-machine__details{background:transparent url("../img/icons/accordion-open.svg") top 12px right 10px no-repeat}.add-machine__list .add-machine__details>div{margin-bottom:0}.add-machine__list .add-machine__details .add-machine__details-form{display:none}.add-machine__list .add-machine__details.active{background-image:url("../img/icons/accordion-close.svg")}.add-machine__list .add-machine__details.active .add-machine__details-form{display:block}.power-status{display:inline-block;font-size:100%;padding-left:0}.power-status--power{display:inline-block;margin-left:20px;position:relative;font-size:100%}.power-status--power.checking{color:#2AB7EC;background:url("../img/status_in_progress.svg");padding-left:20px}.power-status--power.on{padding-left:20px;color:#38B44A;background:transparent url("../img/icons/power-on.svg") left top 4px no-repeat}.power-status--power.off{padding-left:20px;color:#D2D2D2;background:transparent url("../img/icons/power-off.svg") left top 4px no-repeat}.power-status--power.error{padding-left:20px;color:#DB3832;background:transparent url("../img/icons/power-error.svg") left top 4px no-repeat}.power-status--power .power-check{font-size:0.75em;color:#D2D2D2;display:inline-block;padding:0}.power-status--power .power-check .power-check__link{color:#888;text-decoration:none;margin-left:5px}.power-status--power .power-check .power-check__link:hover{border-bottom:0 !important;text-decoration:underline !important}.loading,.loader{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0;display:inline-block}.details__used{color:#BCBCBC}.details .details__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.details .details__label a{color:#BCBCBC}.details .details__label a:hover{color:#dd4814}.details .details__label.active a{color:#dd4814}.details .details__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.details .details__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.details .table-row .details__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.details .table-row .details__text{line-height:37px}.details .table-row:hover .details__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.details .table-row:hover .details__controls{z-index:1;opacity:1}.details .table-row:hover .details__controls--secondary{z-index:1;opacity:1}.details .table-row.active:hover .details__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.details .table-row.active:hover .details__controls{opacity:0;z-index:-1000;pointer-events:none}.details .table-row.active:hover .details__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.details .table-row label{font-size:13px;color:#BCBCBC}.details .table-row input,.details .table-row select{margin:0 0 0 -14px}.details .table-row input[type="radio"]{margin-left:0}.details .details__dropdown .details__row{border-bottom:0;position:relative}.details .details__dropdown .details__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:relative;height:1px;content:''}.details .details__dropdown .details__row.details__row--head{border-bottom:0}.details .details__dropdown .details__row.details__row--head .table-cell{color:#BCBCBC;font-size:13px}.details .details__dropdown .details__row.no-border{border:0}.details .details__dropdown .details__row.no-border:before{border:0}.details .details__dropdown--info .table-row{border-bottom:0}.details .details__dropdown--info .table-cell{color:#BCBCBC} | 2 | .fake{display:none}body{font-size:14px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;clear:none;display:inline-block;float:none;margin-right:2.12766%;margin-bottom:20px;position:relative;width:100%}.twelve-col .one-col,.twelve-col .two-col,.twelve-col .three-col,.twelve-col .four-col,.twelve-col .five-col,.twelve-col .six-col,.twelve-col .seven-col,.twelve-col .eight-col,.twelve-col .nine-col,.twelve-col .ten-col,.twelve-col .eleven-col{width:100%}.last-col,.last{margin-right:0}.clearfix:after,.container:after{clear:both;content:"\0020";display:block;height:0;overflow:hidden;visibility:hidden}.clear{clear:both}.clearfix{display:block}@media only screen and (min-width: 768px){body{font-size:15px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col{width:48.8938%;margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}@media only screen and (min-width: 984px){body{font-size:16px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.three-col:nth-child(1):nth-last-child(4),.three-col:nth-child(2):nth-last-child(3),.three-col:nth-child(3):nth-last-child(2),.three-col:nth-child(4):nth-last-child(1){width:23.36%}.three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col:nth-child(1):nth-last-child(4),.twelve-col .three-col:nth-child(2):nth-last-child(3),.twelve-col .three-col:nth-child(3):nth-last-child(2),.twelve-col .three-col:nth-child(4):nth-last-child(1){width:23.3407%}.twelve-col .three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot");src:url("../fonts/ubuntu-l-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#ubuntulight") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:local("Ubuntu");src:url("../fonts/ubuntu-r-webfont.eot");src:url("../fonts/ubuntu-r-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#ubunturegular") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot");src:local("Ubuntu Medium"),local("Ubuntu-Medium"),url("../fonts/ubuntu-m-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#ubuntumedium") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot");src:local("Ubuntu Bold"),local("Ubuntu-Bold"),url("../fonts/ubuntu-b-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#ubuntubold") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot");src:local("Ubuntu Light Italic"),local("Ubuntu-LightItalic"),url("../fonts/ubuntu-li-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#ubuntulight_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:local("Ubuntu Italic"),local("Ubuntu-Italic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot");src:local("Ubuntu Medium Italic"),local("Ubuntu-MediumItalic"),url("../fonts/ubuntu-mi-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#ubuntumedium_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:local("Ubuntu Bold Italic"),local("Ubuntu-BoldItalic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}html{font-size:100%}body{color:#333;font-family:Ubuntu, Arial, "libra sans", sans-serif;font-weight:300}blockquote,q{quotes:none}blockquote{margin:28px 20px}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}legend{border:0;*margin-left:-7px}figure{margin:0}abbr,acronym{cursor:help}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a:link,a:visited{color:#dd4814;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}a.link-arrow:after{content:"\0000a0›"}nav ul li h2 a:after{content:"\0000a0›"}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:""}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img.left{margin-right:20px}img.right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}h1,h2,h3,h4,h5,h6{font-weight:300;line-height:1.3}h1{font-size:1.625em;margin-bottom:.5em}h2{font-size:1.438em;margin-bottom:.5em}h3{font-size:1.219em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.723em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}h2 span,h1 span{display:block}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:0.78261em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.39286em}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}li{margin-bottom:.4em}li:last-of-type{margin-bottom:0}ins{background:#fffbeb;text-decoration:none}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}dfn{font-style:italic}mark{background:#ff0;color:#000}code,pre{font-family:"Ubuntu Mono", "Consolas", "Monaco", "Lucida Console", "Courier New", Courier, monospace}pre{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdf6f2;padding:.6em 1em;white-space:pre-wrap;word-wrap:break-word}blockquote{margin:0}blockquote>p{font-size:0.92857em;margin-bottom:0.92308em;font-weight:100;margin:0 0 .4em 0}blockquote small{font-size:.813em;line-height:1.4}button,input,select,textarea{font-family:Ubuntu,Arial,"libra sans",sans-serif;margin:0;vertical-align:baseline;*vertical-align:middle}select{font-size:1em;font-weight:300}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-box-sizing:content-box;-webkit-appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-weight:300;outline:none;padding:0.6956522em 0.869565em}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}form fieldset{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-repeat:no-repeat;background-color:#EFEEEC;background-position:-15px -15px;border:0;margin-bottom:8px;padding:15px 20px}form fieldset h3{border-bottom:1px dotted #dfdcd9;margin-bottom:9px;padding-bottom:10px}form fieldset li:first-child{margin-top:0}form input[type="text"],form input[type="email"],form input[type="tel"],form textarea{-webkit-appearance:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;border:1px solid #999;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0.6956522em 0.869565em}form input:focus,form textarea:focus{border:1px solid #dd4814}form textarea[readonly='readonly']{color:#999}form input[type="checkbox"],form input[type="radio"]{margin:0;width:auto}form input[type="checkbox"]+label,form input[type="radio"]+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}form input[type="submit"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#dd4814;background-image:-moz-linear-gradient(#f26120, #dd4814);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#f26120), to(#dd4814));background-image:-webkit-linear-gradient(#f26120, #dd4814);background-image:-o-linear-gradient(#f26120, #dd4814);-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border:0;color:#fff;display:block;padding:10px 14px;text-shadow:none;width:auto;margin-bottom:0}form input[type="submit"]:hover{background:#dd4814}form label{cursor:pointer;display:block;margin-bottom:4px}form label span{color:#df382c}form ul{margin-left:0}form li{list-style:none outside none;margin-top:14px}form button[type="submit"]{border:0;display:inline-block;font-family:Ubuntu, Arial, "libra sans", sans-serif;text-decoration:none;font-weight:300}form input[type="reset"]{display:none}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.85714em 0;width:100%}table th,table td{padding:15px 10px;background:#f0edea;border:1px dotted #888}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333333;font-weight:normal}table tbody th{text-align:left;font-weight:normal;font-weight:300}table th[scope="col"]{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}@media only screen and (min-width: 984px){form fieldset{padding:15px 20px}img{max-width:none}}.audience-consumer{color:#333}.audience-consumer .row-box,.audience-consumer .main-content{color:#333}.audience-consumer .inner-wrapper{background:#fff}.audience-consumer .quote-right-top{padding:60px 60px 0 40px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat;height:287px;position:absolute;right:-40px;text-align:left;top:-90px;width:31.91489%}.audience-consumer .quote-right-top p{font-size:1.14286em;margin-bottom:0.75em;margin:0.769em;padding-bottom:0;color:#fff}.audience-consumer .quote-right-top p cite{font-size:0.85714em;margin-bottom:1em;color:#fff;padding:0}.audience-consumer .quote-right-top p a,.audience-consumer .quote-right p a{color:#fff}.audience-consumer .quote-right{font-size:1.28571em;margin-bottom:0.66667em;color:#fff;padding:50px 100px 0 50px;text-indent:-6px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;min-height:287px;position:absolute;right:-20px;text-align:left;top:-90px;width:21.2006% em}.audience-consumer .quote-right cite{font-style:normal;margin-left:6px}.audience-consumer .quote-right-alt{background:url(/sites/ubuntu/latest/u/img/patterns/quote-white-br-360x360.png) 0 -100px no-repeat;color:#dd4814;padding:50px 50px 0 50px}.audience-consumer .quote-right-right{background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat}.audience-enterprise h1{margin:0 0 18px 0}.audience-enterprise td{background:#fff}.audience-enterprise th,.audience-enterprise td{padding:6px 10px;background:#fff}.audience-enterprise th[scope="col"]{background:#E2D4DC;color:#772953}.audience-enterprise tbody th[rowspan]{background:#F7F2F6}.audience-enterprise tfoot th[rowspan]{background:#dfdcd9}.audience-enterprise tfoot td,.audience-enterprise tfoot th{font-weight:normal;background:#dfdcd9}.audience-enterprise .inner-wrapper{background:#2c001e;color:#fff}.audience-enterprise .row-box{background:#fff;color:#333}.row-enterprise{background:#772953;color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-enterprise .box,.row-enterprise div{background:#772953;color:#fff}.row-enterprise a{color:#fff}.enterprise-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/enterprise-dot-pattern.png")}.developer-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/developer-dot-pattern.png")}.wrapper,header.banner .nav-primary,nav div.footer-a div,.inline-lists ul,.legal{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:auto}.inner-wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;clear:both;display:block;float:left;width:100%;margin:0;padding-bottom:20px;position:relative;z-index:1}@media only screen and (min-width: 768px){.med-six-col .three-col{width:48%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}@media only screen and (min-width: 769px){.inner-wrapper{border-radius:4px;padding-bottom:20px}}@media only screen and (min-width: 984px){.wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin:0 auto;position:relative;text-align:left;width:984px}.inner-wrapper{-moz-box-shadow:0 0 3px #c9c9c9;-webkit-box-shadow:0 0 3px #c9c9c9;box-shadow:0 0 3px #c9c9c9;margin:10px 0 30px}.three-col,.med-six-col .three-col{width:23.30%}.three-col.last-col:nth-of-type(2n){margin-right:0}.med-six-col .three-col:nth-of-type(2n){margin-right:20px}.med-six-col .three-col.last-col{margin-right:0}}.left{float:left}.right{float:right}.caps{text-transform:uppercase}img{border:0 none;height:auto;max-width:100%}img.left{margin-right:0}img.touch-border{margin-bottom:-3px}.accessibility-aid,.off-left{position:absolute;left:-999em}a.external{-moz-background-size:0.7em 0.7em;-webkit-background-size:0.7em 0.7em;-o-background-size:0.7em 0.7em;background-size:0.7em 0.7em;padding-right:.9em;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.svg");background-position:right 1px;background-repeat:no-repeat}.opera-mini a.external,.no-svg a.external{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.png")}.text-center,.align-center{text-align:center}.no-margin{margin:0}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-left-20{margin-left:-20px}.pull-right-20{margin-right:-20px}.pull-left-40{margin-left:-40px}.pull-right-40{margin-right:-41px}.no-border{border:0}.link-top{font-size:1em;margin-bottom:0.85714em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-17px;padding:5px;float:right}.pull-bottom-right{position:absolute;right:0;bottom:0;left:auto}.box .pull-bottom-right{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}.pull-bottom-left{margin-left:-20px;margin-bottom:-21px}.pull-top-right{margin-left:-20px;margin-top:-21px}div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:absolute;left:-999em}.priority-0,.not-for-small{position:absolute;left:-999em}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+h3,.video-container+.video-title{margin-top:20px}@media only screen and (max-width: 768px){.pull-right-40{margin-right:-30px}.pull-bottom-right,.pull-bottom-left{position:static}img.pull-bottom-left{margin-bottom:0;margin-left:0}}@media only screen and (min-width: 768px){div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:relative;left:auto}.priority-0,.not-for-small{position:relative;left:auto}.for-mobile,.for-small{position:absolute;left:-999em}.pull-right{float:right;margin-right:-30px}img.pull-left{margin-left:-30px}img.touch-border{float:left;margin-bottom:-30px}}@media only screen and (min-width: 769px){img.left{margin-right:20px}}@media only screen and (min-width: 984px){img.touch-border{float:left;margin-bottom:-40px}img.pull-left{margin-left:-40px}.pull-right{float:right;margin-right:-40px}.for-tablet,.for-medium{display:none}.no-border{border:0}}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}p.intro{font-size:1.14286em;margin-bottom:0.75em;line-height:1.4}.row div p:last-child,.row div ul:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888;font-size:.813em}@media only screen and (min-width: 768px){p.intro{font-size:1.13333em}}@media only screen and (min-width: 984px){h1{font-size:2.8125em}h2{font-size:2em;margin-bottom:.375em}h3{font-size:1.438em;margin-bottom:.522em}h4{font-size:1em;margin-bottom:.75em}h5{font-size:1em}p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}p.intro{font-size:1.25em}}header.banner{border-top:0;min-width:100%;width:auto;background:#dd4814;display:block;position:relative;z-index:2}header.banner .nav-primary{border:0;margin:0 auto;overflow:hidden}header.banner .nav-primary ul{border-right:1px solid #ed6637;float:left;margin:0;position:relative}header.banner .nav-primary ul li{border-left:1px solid #c64012;float:left;list-style-image:none;margin:0;text-indent:0;vertical-align:bottom}header.banner .nav-primary ul li:last-child{border-right:1px solid #c64012}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited{font-size:14px;border-left:1px solid #ec5b29;color:#fff;display:block;margin-bottom:0;padding:14px 14px 13px;position:relative;text-align:center;text-decoration:none;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased}header.banner .nav-primary ul a.active{background:#B83A10;border-left:1px solid #ec5b29}header.banner .nav-primary ul li a:hover{background:#e1662f;border-top:0;-moz-box-shadow:inset 0 2px 2px -2px #777;-webkit-box-shadow:inset 0 2px 2px -2px #777;box-shadow:inset 0 2px 2px -2px #777}#main-navigation-link{display:none}header.banner .nav-toggle{position:absolute;right:0;display:block;width:48px;height:48px;text-indent:-99999px;background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg);-moz-background-size:25px auto;-webkit-background-size:25px auto;-o-background-size:25px auto;background-size:25px auto;background-repeat:no-repeat;background-position:center center;cursor:pointer}header.banner .no-script{display:none}.opera-mini header.banner .nav-toggle,.no-svg header.banner .nav-toggle{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png)}header.banner nav ul{background-color:#f0f0f0;display:none;float:left}header.banner .nav-primary.active{-moz-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);padding:0;border-bottom:1px solid #d4d7d4}header nav ul.active{display:block}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{display:block;padding:0;margin:0;border:none}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:#d0d0d0}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner .nav-primary ul li{border-bottom:1px solid #F2F2F4;font-size:16px}header.banner .nav-primary ul li:last-child{border:0}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:14px 14px 13px;text-align:left}header.banner nav.nav-primary ul.active li ul{display:none}#menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.svg);background-repeat:no-repeat;background-position:50% 26px;content:"";display:block;height:23px;margin-left:0;padding-bottom:17px;position:relative;top:-3px;width:48px;z-index:999}html.no-svg #menu.active:after,.opera-mini #menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.png)}.nav-secondary{border-bottom:1px solid #dfdcd9;margin-bottom:0}.nav-secondary ul{float:left;margin-bottom:10px;margin-left:2px}.nav-secondary ul li{float:left;margin-top:16px;font-size:14px;margin-right:15px}.nav-secondary ul li a:link,.nav-secondary ul li a:visited{color:#333;font-size:14px;float:left}.nav-secondary ul li a:hover,.nav-secondary ul li a:active{color:#dd4814;text-decoration:none}.nav-secondary ul li,.nav-secondary ul li.active a:link,.nav-secondary ul li.active a:visited{color:#dd4814;text-decoration:none}.nav-secondary ul.breadcrumb{margin-left:20px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{color:#888;margin-right:8px}.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#dd4814}header.banner h2{font-size:1.78571em;margin-bottom:0.48em;display:block;left:4px;margin-bottom:0;position:relative;text-transform:lowercase;top:14px}header.banner h2 a:link,header.banner h2 a:visited,header.banner a{color:#fff;float:left;text-decoration:none}header.banner .logo{border-left:0;float:left;height:48px;overflow:hidden}header.banner .logo-ubuntu{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/ubuntu-logo.png") no-repeat scroll 0 10px transparent;font-size:18px;margin-bottom:0;position:relative;text-transform:lowercase;float:left;margin:0;display:inline-block;height:32px;min-width:128px;margin-right:-20px;margin-left:10px;padding:7px 14px 9px 0}header.banner .logo-ubuntu img{margin-right:8px;position:absolute;left:-999em}header.banner .logo-ubuntu span{float:left;font-size:23px;font-weight:300;padding-left:122px;padding-right:20px;position:relative;top:5px}header.banner .nav-primary.nav-left .logo-ubuntu{float:right}header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.svg");background-size:107px 25px;float:left}html.no-svg header.banner .nav-primary.nav-right .logo-ubuntu,.opera-mini header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.png")}@media only screen and (max-width: 295px){header.banner .nav-primary.nav-right .logo-ubuntu,header.banner .logo-ubuntu{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.svg") 0 50% no-repeat;min-width:0;width:38px}header.banner .logo-ubuntu span{padding-left:38px}}html.no-svg header.banner .logo-ubuntu,.opera-mini header.banner .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.png")}@media only screen and (max-width: 768px){header.banner .nav-primary{-moz-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);box-shadow:0 1px 2px 1px rgba(0,0,0,0.2)}header.banner .nav-primary.active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;padding:0}header nav ul.active{float:left}header nav ul.active li:last-child a:link,header nav ul.active li:last-child a:visited{border-bottom:0}header.banner .nav-primary ul{position:relative;width:100%}header.banner .nav-primary ul li.active a:link,header.banner .nav-primary ul li.active a:visited{color:#333;font-weight:700}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;display:block;font-weight:300;margin:0;padding:0;width:100%}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{background-color:#f0f0f0;border-bottom:1px solid #d4d7d4;color:#333333;font-size:1em}header.banner .nav-primary ul li:nth-last-child(-n+2) a:link,header.banner .nav-primary ul li:nth-last-child(-n+2) a:visited{border:0}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:#f8f8f8}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:8px 10px;text-align:left}header.banner .nav-primary ul li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border-bottom:0;border-right:1px solid #d4d7d4;float:left;width:50%}.nav-secondary{background:#fff}.nav-secondary ul.second-level-nav{border-top:1px solid #d4d7d4;display:none;margin-bottom:0;margin-left:0;padding-bottom:10px;padding-top:10px;width:100%}.nav-secondary ul.second-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left}.nav-secondary ul.second-level-nav li a,.nav-secondary ul.second-level-nav li a:link,.nav-secondary ul.second-level-nav li a:visited{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;height:100%;padding:10px 10px 10px 20px;width:100%}.nav-secondary ul.second-level-nav li.active a,.nav-secondary ul.second-level-nav li.active a:link,.nav-secondary ul.second-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav{display:none;margin-bottom:0;width:100%;padding-bottom:20px}.nav-secondary ul.third-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left;padding-left:30px}.nav-secondary ul.third-level-nav li a,.nav-secondary ul.third-level-nav li a:link,.nav-secondary ul.third-level-nav li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px 10px 10px 0;display:block;width:100%;height:100%}.nav-secondary ul.third-level-nav li.active a,.nav-secondary ul.third-level-nav li.active a:link,.nav-secondary ul.third-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav li.single-link{width:100%}.nav-secondary ul.third-level-nav li:only-child{width:100%}.nav-secondary ul.breadcrumb{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:0;margin-bottom:0}.nav-secondary ul.breadcrumb li:first-of-type{border-bottom:1px solid #d4d7d4;margin-bottom:-1px}.nav-secondary ul.breadcrumb li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#fff;width:100%;display:block;height:40px;margin:0}.nav-secondary ul.breadcrumb li a,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;width:100%;color:#333333;display:block;margin-right:0;text-decoration:none;padding:8px 10px 0 10px}.nav-secondary ul.breadcrumb li.active{margin-top:12px}.nav-secondary ul.breadcrumb li.active a,.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.breadcrumb li:nth-of-type(2n){margin-top:12px}.nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.svg);background-position:center center;background-repeat:no-repeat;background-size:18px;float:right;height:18px;margin-right:-5px;margin-top:-6px;padding:10px;position:relative;right:0;top:0;width:18px}.nav-secondary ul.breadcrumb li+li{display:none}.nav-secondary ul.breadcrumb li+li a:link,.nav-secondary ul.breadcrumb li+li a:active,.nav-secondary ul.breadcrumb li+li a:visited{padding-left:20px}.nav-secondary ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li a:after,.nav-secondary.open ul.breadcrumb li a:link:after,.nav-secondary.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg)}.nav-secondary.open ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg);margin-top:-7px}.nav-secondary.open ul.second-level-nav,.nav-secondary.open ul.third-level-nav,.nav-secondary.open ul.breadcrumb li+li{display:block}.no-js .nav-secondary ul.second-level-nav{display:block}.no-js #main-navigation-link{position:absolute;right:10px;top:12px;width:20px;height:28px;z-index:999;text-indent:-999em;display:block}.no-js #main-navigation-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;display:block;width:28px;height:28px;position:absolute}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}html.no-svg header.banner .nav-toggle,.opera-mini header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png")}}@media only screen and (min-width: 768px){header.banner .nav-primary ul li{border-bottom:0}}@media only screen and (min-width: 769px){header.banner{-moz-box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF;-webkit-box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF;box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF}header.banner nav.nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border-bottom:0}header.banner .nav-toggle{display:none}header.banner nav ul{background-color:transparent;display:block}header.banner .nav-primary ul li{border-left:1px solid #C64012}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:1px solid #EC5B29}header.banner .nav-primary ul li:last-child{border-right:1px solid #C64012;border-left:1px solid #C64012}header.banner .nav-primary ul li a.active{background-color:#B83A10}header.banner .nav-primary ul li a:hover{background-color:#E1662F}.nav-secondary ul:last-child li:last-child{padding-bottom:10px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.second-level-nav li,.nav-secondary ul.third-level-nav li{margin-right:15px}.nav-secondary ul.breadcrumb{float:left}.nav-secondary ul.breadcrumb li{margin-bottom:10px}.nav-secondary ul{float:none;margin-bottom:0}.nav-secondary ul li{margin-bottom:5px}}@media only screen and (min-width: 984px){header.banner{margin-bottom:20px}header.banner nav.nav-primary ul{display:block}header.banner .nav-primary,#nav-global .nav-global-wrapper{width:984px}header.banner .nav-primary.nav-right .logo-ubuntu{margin-left:0}}header.banner .nav-primary ul{position:static}header.banner .nav-primary li ul{-moz-box-shadow:0 2px 2px -1px #777;-webkit-box-shadow:0 2px 2px -1px #777;box-shadow:0 2px 2px -1px #777;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:#f7f7f7;border:1px solid #d5d5d5;display:none;float:none;margin:0;padding:5px 0;position:absolute;top:51px;width:200px}header.banner .nav-primary li:hover ul:after{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up-smaller.png") no-repeat;content:'';display:block;height:8px;left:20px;position:relative;top:-13px;width:200px;z-index:999}.no-generatedcontent header.banner .nav-primary li ul{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;top:48px}header.banner .nav-primary li ul .arrow-up{display:none}header.banner .nav-primary li ul li{border:0;float:none}header.banner .nav-primary li ul li a:link,header.banner .nav-primary li ul li a:visited{border:0;color:#333333;padding:0 0 11px 14px;text-align:left;width:170px}header.banner .nav-primary li ul li a:hover{background:none repeat scroll 0 0 transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#DD4814}header.banner .nav-primary li ul li.first a:link,header.banner .nav-primary li ul li.first a:visited,header.banner .nav-primary li ul li:first-of-type a:link{padding:10px 14px}header.banner .nav-primary li ul li.active a:link,header.banner .nav-primary li ul li.active a:visited{background:none repeat scroll 0 0 transparent !important}header.banner .nav-primary li ul .promo{border-top:1px solid #D5D5D5;float:left;margin-top:5px;padding:15px 0 0}header.banner .nav-primary li ul .promo a:link,header.banner .nav-primary li ul .promo a:visited{background:none repeat scroll 0 0 transparent;border-left:0 none;color:#333333;height:auto;padding:0;text-align:left}header.banner .nav-primary li ul .promo p{margin:0 10px}header.banner .nav-primary li ul .promo a:hover{box-shadow:none;color:#DD4814}header.banner .nav-primary li ul .promo img{margin-top:14px;margin-bottom:-6px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;position:relative;top:1px}header.banner .nav-primary li ul .promo .category{color:#888;font-size:11px;margin:0 10px;text-transform:uppercase}header.banner .nav-primary li:hover ul{display:block}html.lt-ie8 header.banner .nav-primary li:hover ul{display:none}.header-search,#box-search{padding:7px 0 7px 14px;overflow:hidden}.header-search input[type="search"],.header-search input[type="text"],#box-search input[type="search"],#box-search input[type="text"]{-webkit-appearance:none;-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;background-color:#be3d00;border:none;color:#fff;display:block;float:left;font-size:16px;height:2.1em;margin-bottom:0;padding:0.5em 2.5em 0.5em 0.5em;width:100%}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-moz-placeholder,#box-search ::-moz-placeholder{color:white;opacity:0.4}.header-search :-ms-input-placeholder,#box-search :-ms-input-placeholder{color:white;opacity:0.4}.header-search input:-moz-placeholder,#box-search input:-moz-placeholder{color:white;opacity:0.4}.header-search ::placeholder,#box-search ::placeholder{color:white;opacity:0.4}.header-search input[type="search"]:focus,#box-search input[type="search"]:focus{background-color:#a63603}.header-search button[type=submit],#box-search button[type=submit]{padding:3px 2px;line-height:0;float:left;margin-left:-40px;display:block;background:none;overflow:visible}.header-search button[type=submit]:hover,#box-search button[type=submit]:hover{background:none}.header-search button[type=submit] img,#box-search button[type=submit] img{height:28px;width:28px}header.banner .search-toggle{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search_icon_white_64.png");background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search.svg");background-position:center center;background-repeat:no-repeat;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:58px;text-indent:-999em;top:0;width:24px}.search-toggle:link,.search-toggle:active{outline:none}#box-search,.header-search{background:#f0f0f0;border:0;display:none;float:left;margin-bottom:0;position:relative;margin:0 0 -1px 0;padding:0;width:100%;z-index:3}#box-search.active,.header-search.active,.header-search.open{display:block}#box-search div,.header-search div{-moz-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#f0f0f0;margin:10px;position:relative;z-index:1}#box-search form input[type="search"],.header-search form input[type="search"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;border:0;color:#333;font-size:16px;height:auto;margin:0;float:left;padding:9px 10px;width:100%}.yes-js .header-inner #box-search,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner #box-search form,.yes-js .header-inner .header-search form{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;margin-right:0;overflow:hidden;padding:10px;top:0;z-index:999;position:relative;width:100%}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}html.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.png")}}@media only screen and (min-width: 768px){header.banner .search-toggle{display:none}}@media only screen and (min-width: 960px){#box-search,.header-search{background:none;overflow:hidden;padding:7px 0 7px 14px;border-right:0 none;float:right;margin-bottom:0;padding-bottom:5px;padding-right:0;padding-top:7px;max-width:220px}#box-search form input[type="text"],#box-search form input[type="search"],.header-search form input[type="text"],.header-search form input[type="search"]{-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-search.png") no-repeat scroll 5px center,none repeat scroll 0 0 #BE3D00;border:6px solid #DE6532;border-width:0 0 1px;color:#fff;font-size:0.813em;height:24px;margin-bottom:0;padding:4px 4px 4px 30px;transition:all 0.5s ease 0s;width:86px}}@media only screen and (max-width: 960px){header.banner nav.nav-primary .header-search{padding:0;position:relative;top:0;width:100%}header.banner nav.nav-primary .header-search input[type="search"]{border-radius:0;background:#f7f7f7;color:#333}header.banner nav.nav-primary .header-search button[type="submit"]{width:32px;height:38px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.svg") no-repeat scroll center center transparent;background-size:28px 28px}header.banner nav.nav-primary .header-search button[type="submit"] img{max-width:none;display:none}header.banner nav.nav-primary .header-search.open{display:block}header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;right:0;display:block;height:48px;position:absolute;text-indent:-99999px;width:48px}html.no-svg header.banner .search-toggle,.opera-mini header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/img/search-white.png")}.opera-mini x:-o-prefocus,.opera-mini header.banner .search-toggle{-o-background-size:25px auto;background-size:25px auto}}@media only screen and (min-width: 984px){#box-search,.header-search{display:block;margin-right:0}#box-search form input[type="text"]:focus,.header-search form input[type="text"]:focus{width:160px}}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}}body.ubuntu-search .nav-secondary,body.search-results .nav-secondary,body.search-no-results .nav-secondary{display:none}body.ubuntu-search section>h1,body.ubuntu-search section article h1,body.search-results section>h1,body.search-results section article h1,body.search-no-results section>h1,body.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}body.ubuntu-search section>h1,body.search-results section>h1,body.search-no-results section>h1{border-bottom:1px dotted #dfdcd9}body.ubuntu-search .main-search,body.search-results .main-search,body.search-no-results .main-search{padding:20px 0;margin:0 0 20px 0;background-color:transparent}body.ubuntu-search .main-search input[type="search"],body.search-results .main-search input[type="search"],body.search-no-results .main-search input[type="search"]{float:left;width:100%;font-size:2em;border:1px solid #999;-moz-box-sizing:border-box;box-sizing:border-box;padding:0.2em 65px 0.2em 0.2em}body.ubuntu-search .main-search button[type=submit],body.search-results .main-search button[type=submit],body.search-no-results .main-search button[type=submit]{padding:4px;line-height:0;float:left;margin-left:-53px;display:block;background:none;overflow:visible;width:auto;margin-top:-4px}body.ubuntu-search .main-search button[type=submit]:hover,body.search-results .main-search button[type=submit]:hover,body.search-no-results .main-search button[type=submit]:hover{background:none}body.ubuntu-search .main-search button[type=submit] img,body.search-results .main-search button[type=submit] img,body.search-no-results .main-search button[type=submit] img{height:45px;width:45px}body.ubuntu-search .search-result h1 .title-main,body.search-results .search-result h1 .title-main,body.search-no-results .search-result h1 .title-main{margin-right:20px}body.ubuntu-search .search-result h1 .result-url,body.search-results .search-result h1 .result-url,body.search-no-results .search-result h1 .result-url{color:#999;overflow:hidden;text-overflow:ellipsis;display:block;vertical-align:bottom;padding-bottom:2px}body.ubuntu-search .search-result h1 .result-url a,body.search-results .search-result h1 .result-url a,body.search-no-results .search-result h1 .result-url a{color:#999}body.ubuntu-search .search-result p,body.search-results .search-result p,body.search-no-results .search-result p{margin-bottom:0}body.ubuntu-search .num-results,body.search-results .num-results,body.search-no-results .num-results{display:inline-block;margin-left:20px}body.ubuntu-search .bottom-results-total,body.search-results .bottom-results-total,body.search-no-results .bottom-results-total{text-align:center;width:100%;overflow:visible;padding-top:20px;margin:0}body.ubuntu-search .bottom-nav,body.search-results .bottom-nav,body.search-no-results .bottom-nav{overflow:hidden;margin-top:-26px}body.ubuntu-search .bottom-nav ul,body.search-results .bottom-nav ul,body.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;padding:0;overflow:hidden}body.ubuntu-search .bottom-nav li,body.search-results .bottom-nav li,body.search-no-results .bottom-nav li{float:left;margin-left:15px}body.ubuntu-search .bottom-nav li:first-child,body.search-results .bottom-nav li:first-child,body.search-no-results .bottom-nav li:first-child{margin-left:0}body.ubuntu-search .nav-back,body.search-results .nav-back,body.search-no-results .nav-back{float:left}body.ubuntu-search .nav-back li:before,body.search-results .nav-back li:before,body.search-no-results .nav-back li:before{content:"\2039";color:#dd4814;margin-right:5px}body.ubuntu-search .nav-back li.item-extreme:before,body.search-results .nav-back li.item-extreme:before,body.search-no-results .nav-back li.item-extreme:before{content:"\2039\2039"}body.ubuntu-search .nav-forward,body.search-results .nav-forward,body.search-no-results .nav-forward{float:right}body.ubuntu-search .nav-forward li:after,body.search-results .nav-forward li:after,body.search-no-results .nav-forward li:after{content:"\203A";color:#dd4814;margin-left:5px}body.ubuntu-search .nav-forward li.item-extreme:after,body.search-results .nav-forward li.item-extreme:after,body.search-no-results .nav-forward li.item-extreme:after{content:"\203A\203A"}body.ubuntu-search .error-notification,body.search-results .error-notification,body.search-no-results .error-notification{background-color:#fdffdc;color:#333;padding:20px;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:20px;display:block}body.ubuntu-search .result-line,body.search-results .result-line,body.search-no-results .result-line{color:#ada69e}body.ubuntu-search .results-top,body.search-results .results-top,body.search-no-results .results-top{border-bottom:1px dotted #dfdcd9;padding-bottom:0.5em}body.ubuntu-search .search-container,body.search-results .search-container,body.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 768px){.ubuntu-search .main-search button[type=submit]{margin-left:-60px;margin-top:0}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 2px 2px -1px #d3d3d3;-webkit-box-shadow:inset 0 2px 2px -1px #d3d3d3;box-shadow:inset 0 2px 2px -1px #d3d3d3;background:none;border-top:0;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{margin:0 auto;width:100%}footer.global .legal{background-image:none;position:relative;clear:both;min-height:40px}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:0.75em;line-height:1.4;margin-bottom:0;padding-bottom:0.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333;font-weight:normal}footer.global nav ul li h2 a:after{content:""}footer.global ul{margin:0}footer.global nav ul li.two-col{display:inline-block;min-height:10em;vertical-align:top}footer.global nav ul li li{font-size:0.85714em;margin-bottom:1em;font-size:0.75em;margin-bottom:0}footer.global ul li li a:link,footer.global ul li li a:visited{color:#333;margin-bottom:0}footer.global ul li li a:hover,footer.global ul li li a:active,footer.global h2 a:hover,footer.global h2 a:active{color:#dd4814}footer.global .inline li{display:inline}footer.global p,footer.global ul.inline li a{color:#333;font-size:12px;margin-bottom:0}footer.global ul.inline li a:hover{color:#dd4814}footer.global ul.inline li:after{color:#888;content:"\00b7";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:120px}footer.global ul.inline li:last-child:after{content:""}footer.global .inline li{float:none;margin-bottom:0}footer.global .top-link{-moz-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;background:none repeat scroll 0 0 transparent;border:0 none;float:left;font-size:0.75em;letter-spacing:0.05em;margin:0 0 0 -10px;padding-right:20px;text-transform:uppercase;width:100%}footer.global .top-link a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.svg");background-position:10px center;background-repeat:no-repeat;background-size:14px 14px;border-bottom:0 none;color:#888888;display:block;float:none;font-weight:400;padding:12px 0 12px 28px}html.no-svg footer.global .top-link a,.opera-mini footer.global .top-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.png")}@media only screen and (max-width: 768px){footer.no-global .legal{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;box-shadow:0 2px 2px -1px #D3D3D3 inset;padding-top:10px;margin-left:-10px;padding-left:10px;padding-right:10px}#livechat-eye-catcher{display:block}}@media only screen and (min-width: 768px){footer.global .inline li{display:inline;float:left}}@media only screen and (min-width: 769px){footer.global .top-link{display:none}footer.global .footer-b h2 a i{font-style:normal;display:inline}}@media only screen and (min-width: 984px){footer.global .legal{width:984px}footer.global{padding:30px 0 20px}footer.global .legal{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png") 100% 0 no-repeat}footer.global .footer-a{display:block}}#context-footer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1em;margin-bottom:0.85714em;border-bottom:0;clear:both;padding-bottom:1px;padding-top:0;position:relative;margin-bottom:0;margin-left:0;margin-right:0;width:100%}#context-footer hr{-moz-box-shadow:inset 0 2px 2px -2px #333;-webkit-box-shadow:inset 0 2px 2px -2px #333;box-shadow:inset 0 2px 2px -2px #333;background:#dd4814;height:14px;margin:0 0 10px;border:0;clear:both}#context-footer div.twelve-col{display:table;float:none;margin-bottom:7px}#context-footer div div{display:block;padding-left:0;margin-bottom:20px}#context-footer div div div{display:block;padding-left:0;margin-bottom:0}#context-footer div div.feature-one{padding-left:0}#context-footer div div.feature-four{margin-bottom:0;margin-right:0}#context-footer>div{padding-left:10px;padding-right:10px}#context-footer ul{margin-bottom:5px}#context-footer li.active{display:none}#context-footer h3{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}#context-footer .list a:after,#context-footer a.link-arrow:after,#context-footer nav ul li h2 a:after{content:' \203A'}@media only screen and (min-width: 768px){#context-footer{margin-bottom:12px;padding-left:30px;padding-right:30px}#context-footer div+div{width:31%}#context-footer div div.feature-four{padding-bottom:20px}#context-footer hr{margin:0 -30px 40px}#context-footer>div{padding-left:0;padding-right:0}}@media only screen and (min-width: 984px){#context-footer{padding:0 40px 10px}#context-footer div div{display:table-cell;float:none;padding-left:20px;margin-bottom:0}#context-footer hr{margin:0 -40px 40px}}a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#dd4814;color:#fff;text-decoration:none;display:inline-block;margin:0;font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased;padding:8px 14px;width:100%;text-align:center}a.cta-large,button.cta-large{font-size:1.28571em;margin-bottom:0.66667em;padding:10px 20px}a.link-cta-canonical,button.cta-canonical,form button.cta-canonical[type="submit"],form input.cta-canonical[type="submit"]{background:#772953;color:#fff}a.link-cta-inverted,button.cta-inverted{background:#fff;color:#333}.row-enterprise a.link-cta-canonical,.row-enterprise button.link-cta-canonical{background:#fff;color:#772953}a.link-cta-ubuntu:hover,a.link-cta-ubuntu:hover,button.cta-ubuntu:hover,form button[type="submit"]:hover,form input[type="submit"]:hover{background:#c03f11;text-decoration:none}a.link-cta-canonical:hover,button.cta-canonical:hover{background:#5f2143;text-decoration:none}a.link-cta-inverted:hover,.row-enterprise a.link-cta-canonical:hover,button.cta-inverted:hover,.row-enterprise button.cta-canonical:hover{background:#fff;text-decoration:underline}a.cta-deactivated,a.cta-deactivated:hover,button.cta-deactivated,button.cta-deactivated:hover{background:#efefef;color:#fff;cursor:not-allowed}@media only screen and (min-width: 768px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}@media only screen and (min-width: 984px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}form input,form select,form textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}form .fieldset-submit ul{margin-bottom:0}form fieldset .mktError,form fieldset .errMsg,form fieldset .reqMark{color:#df382c}form fieldset .mktFormMsg{clear:both;display:block}.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-bottom:1px dotted #888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0 !important}.row-grey{background:#f7f7f7}.no-border{border:0}#main-content .row-hero{margin-top:20px;padding-top:0}.row-background{color:#fff;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/image-background-wallpaper.jpg") no-repeat scroll 50% 50% #4b1827}.row-background a.alternate{color:#fff;text-decoration:underline}.row-background a.alternate:hover{color:rgba(255,255,255,0.6)}@media only screen and (min-width: 768px){.row-background{background-position:center 50%;background-size:100% auto}}.strip{width:100%;display:block}.strip-dark{background-color:#2c001e;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/background-grid.png");background-repeat:repeat;color:#fff}.strip-dark .list-ubuntu li{border:0}.strip-dark .resource{color:#333;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.strip-dark .resource:before{border-right-color:#2c001e}#main-content .strip-dark .resource:before{border-bottom-width:29px;right:-2px;top:-1px}#main-content .strip-dark .resource:hover:before{border-bottom-width:34px}#main-content .strip-dark .resource h2{padding-right:20px}.row-aux{background-color:rgba(255,255,255,0.6);text-align:center}.row-aux h2,.row-aux p{text-align:left}.row-aux a p{color:#333;margin-bottom:30px}.row-step h2{position:relative;top:5px}.row-step .step{position:relative;top:-5px;height:32px;width:32px;border-radius:50%;border:3px solid #dd4814;color:#dd4814;line-height:32px;text-align:center;background-color:#fff;font-size:23px;font-weight:400}@media only screen and (min-width: 768px){.row{padding:30px}#main-content .row-hero{margin-top:40px}}@media only screen and (min-width: 769px){.row-step .step{height:42px;width:42px;line-height:42px}.row br{display:block}}@media only screen and (min-width: 984px){.row br{display:block}.row{padding:60px 40px 40px}.no-border{border:0}}.box,.box-grey{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1.333em 20px}.box{background:#fff;border:1px solid #dfdcd9}.box-grey{background:#f7f7f7;color:#333}.box-orange{background:#dd4814;color:#fff}.box-highlight{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;border:1px solid #f7f7f7}.box-textured{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg");border:0}.box-padded{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#efefef;border:0;margin-bottom:20px;padding:6px 5px}.box-padded h3{font-size:1.39286em;margin-bottom:0.61538em;margin-left:5px;margin-top:5px}.box-padded li h3{font-size:1.39286em;margin-bottom:0.61538em;margin:0}.box-padded div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:8px 8px 2px}.box-padded-feature{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/soft-centre-bkg.gif") repeat scroll 0 0 #a09f9f;border:0;margin-bottom:20px;padding:11px 5px 6px}.box-padded-feature h3{color:#fff;margin-left:5px;font-size:1.39286em;margin-bottom:0.61538em}.box-padded-feature h4{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}.box-padded-feature>div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:20px 8px}.box-padded-feature div div{margin-bottom:0}.box-padded-feature .inline-icons{display:table;width:100%;margin:0;text-align:center}.box-padded-feature .inline-icons li{display:table-cell;text-align:left;float:none}.box-padded-feature .one-col{width:48px;float:left}.resource{cursor:pointer;padding-bottom:40px;position:relative;-moz-transition:background .2s ease-out;-webkit-transition:background .2s ease-out;transition:background .2s ease-out}.resource h2{padding-right:20px}.resource.five-col h2 a:link,.resource.five-col h2 a:visited,.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:inherit !important}.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:1.125em}.resource.twelve-col h2 a:link,.resource.twelve-col h2 a:visited{font-size:1.40625em}.resource:hover{background-color:#fafafa}.resource:after{-moz-box-shadow:0 -1px 2px 0 #ddd;-webkit-box-shadow:0 -1px 2px 0 #ddd;box-shadow:0 -1px 2px 0 #ddd;content:'';height:1px;position:absolute;right:-6px;top:14px;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-moz-transition:all .2s ease-out;-webkit-transition:all .2s ease-out;transition:all .2s ease-out;width:41px;z-index:2}.resource:hover:after{right:-9px;top:18px;width:48px}.resource:before{content:'';position:absolute;-moz-transition:border-width .2s ease-out;-webkit-transition:border-width .2s ease-out;transition:border-width .2s ease-out;top:-2px;right:-3px;width:0;height:0;border-bottom:30px solid #fdfdfd;border-right:30px solid #fff;-webkit-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);-moz-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);box-shadow:-2px 2px 2px rgba(176,176,176,0.4);z-index:2;-webkit-border-radius:0 0 0 0;-moz-border-radius:0 0 0 0;border-radius:0 0 0 0}.resource:hover:before{border-bottom-width:35px;border-right-width:35px}.resource:last-of-type{margin-bottom:30px}.resource .content-cat{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-icon-document.png") left center no-repeat;color:#aea79f;font-size:14px;letter-spacing:1px;margin:0;padding-left:20px;padding:0;position:absolute;text-transform:uppercase}.resource .content-cat-webinar{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-webinar.png") left center no-repeat}.resource.box-image-centered div+span img{margin-top:40px}html.yui3-js-enabled .resource:hover a{text-decoration:underline}.row-grey .resource:before{border-right-color:#f7f7f7}@media only screen and (max-width: 768px){.box-padded-feature .inline-icons li{float:left;display:block}.box-padded-feature .one-col{width:48px;float:left}}.arrow-up,.arrow-down,.arrow-right,.arrow-left{height:11px;position:absolute;width:18px}.arrow-up{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up.png") 0 0 no-repeat;left:20px;top:-11px}.arrow-down{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-down.png") 0 0 no-repeat;bottom:-11px;right:20px}.arrow-right{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-right.png") 0 0 no-repeat;height:18px;right:-11px;top:20px;width:11px}.arrow-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-left.png") 0 0 no-repeat;bottom:20px;height:18px;left:-11px;width:11px}div>.arrow-left{left:-10px}@media only screen and (min-width: 769px){html.yui3-js-enabled .arrow{visibility:visible}}.list,.list-ubuntu,.list-canonical{list-style:none;margin-left:0}.list li,.list-ubuntu li,.list-canonical li{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list li:last-of-type,.list li.last-item,.list-ubuntu li:last-of-type,.list-ubuntu li.last-item,.list-canonical li:last-of-type,.list-canonical li.last-item{border:0;padding-bottom:0}.list article{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list-spaced article,.list-spaced li{padding:30px 0}nav .list a{display:block}.list-ubuntu li,.list-canonical li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.svg")}.list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.svg")}.list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.svg")}.list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.svg")}.vertical-divider .list-canonical li,.vertical-divider .list-ubuntu li{padding-left:25px}html.no-svg .list-ubuntu li,.opera-mini .list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.png")}html.no-svg .list-canonical li,.opera-mini .list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.png")}html.no-svg .list-warm li,.opera-mini .list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.png")}html.no-svg .list-dark li,.opera-mini .list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.png")}.no-bullets{list-style:none;margin-left:0}.row .combined-list ul,.row .combined-list div{margin-bottom:0}.row .combined-list li.last-item{border-bottom:1px dotted #888;padding-bottom:10px}.row .combined-list div.last-col,.row .combined-list ul.last-col{margin-bottom:20px}.row .combined-list div.last-col li.last-item,.row .combined-list ul.last-col li.last-item{border-bottom:0;padding-bottom:0}.inline{margin-left:0}.inline li{display:inline;list-style:none;margin-left:0;float:left}@media only screen and (min-width: 768px){.row .combined-list ul,.row .combined-list div{margin-bottom:20px}.row .combined-list li.last-item{border-bottom:0;padding-bottom:0}}ul.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}ul.inline-logos li{clear:none;display:inline-block;float:none;margin:10px 20px;padding:0}ul.inline-logos li.clear-row{clear:left}ul.inline-logos li.last-item{border:0}ul.inline-logos img{-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;vertical-align:middle;max-width:115px;max-height:32px}.inline-icons{margin:0 0 20px}.inline-icons li{margin-right:20px;margin-bottom:20px;text-align:left;display:inline-block}.inline-icons li.last-item{margin-right:0}.inline-icons.no-margin-bottom li{margin-bottom:0}.inline-icons img{vertical-align:middle;max-width:115px;max-height:32px}@media only screen and (max-width: 768px){ul.inline-logos img{max-width:172px;max-height:48px}}@media only screen and (min-width: 769px){ul.inline-logos li{clear:none;display:inline-block;height:auto;margin:20px 0;line-height:60px;padding:0 40px}ul.inline-logos li img{float:none;vertical-align:middle;max-width:200px;max-height:45px}}@media only screen and (min-width: 984px){.inline-icons{text-align:left;margin-bottom:20px}}blockquote.pull-quote{text-indent:0}blockquote.pull-quote p{color:#333;padding-left:10px;padding-right:10px;font-size:1.77379em;margin-bottom:0.48323em;text-indent:-.4em;margin-left:.4em;line-height:1.3}blockquote.pull-quote p span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}blockquote.pull-quote p span+span{left:5px}blockquote.pull-quote p cite{margin:10px 0 0;font-weight:300;display:block;font-size:.75em;text-indent:0}blockquote.pull-quote.js{padding-left:60px;display:table-cell}blockquote.quote-canonical,blockquote.quote-canonical-white{font-size:1.14286em;margin-bottom:0.75em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-white-360x360.png") no-repeat 20px -130px;color:#772953;float:right;font-size:1em;height:215px;margin-top:0;padding:20px 60px 0;position:relative;width:236px}blockquote.quote-canonical-white{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-aubergine-345x345.png") no-repeat 0 0;color:#fff;padding:80px 60px 0;height:265px}blockquote.quote p:first-child{font-size:1.28571em;margin-bottom:0.66667em;line-height:1.3;text-indent:-7px}blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.svg");background-repeat:no-repeat;background-size:287px 286px;color:#fff;height:167px;padding:60px 40px;position:static;right:-40px;top:-90px;width:207px}blockquote.quote-right-bottom p{color:#fff}blockquote.quote-grey{font-size:2.57143em;margin-bottom:0.33333em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-grey-br-211x211.png") no-repeat scroll 0 0 transparent;color:#fff;height:152px;line-height:40px;margin-left:20px;padding:60px 0 0;text-align:center;width:211px}blockquote.quote-bottom-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;color:#fff;height:167px;padding:55px 40px 70px 45px;width:225px}html.no-svg blockquote.quote-right-bottom,.opera-mini blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.png")}.row-quote{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-quote blockquote{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0;padding:0}.row-quote blockquote p{margin-bottom:.75em;line-height:1.3;color:#333;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333;font-style:normal;margin-bottom:0;font-size:.75em;text-indent:-14px;text-indent:0}.row-quote .quote-twitter{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-115x139.png") 20px bottom no-repeat;padding:20px 20px 20px 23.40425%}.row-quote .quote-twitter-small{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-54x63.png") 99% bottom no-repeat;padding:20px 20px 20px 80px}.row-quote .quote-twitter-small p{margin:0;padding:0}blockquote.quote-canonical,blockquote.quote-canonical-white{background:none;color:#333;width:auto;height:auto;padding:0 30px;margin-top:20px}@media only screen and (min-width: 768px){.row-quote blockquote{text-indent:-7px}.pull-quote{text-indent:-.4em}.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em}blockquote.pull-quote p,.row-quote blockquote p{padding-left:0;padding-right:0;text-indent:-.7em}blockquote.pull-quote p span,.row-quote blockquote p span{font-size:1.391304348em}blockquote.pull-quote p cite,.row-quote blockquote p cite{margin-left:0;text-indent:0}blockquote.pull-quote p span,.row-quote blockquote p span{top:5px}}@media only screen and (min-width: 769px){.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em;text-indent:-.4em}}@media only screen and (min-width: 984px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}blockquote.pull-quote p span,.row-quote blockquote p span{top:10px}}html.js .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:auto;padding-bottom:.6em;padding-right:20px}html.yui3-js-enabled .tabbed-menu{display:none;padding-bottom:20px;padding-top:20px}html.yui3-js-enabled .arrow{display:none;position:absolute;visibility:hidden}html.yui3-js-enabled .tabbed-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:8px 8px 0;background:#f7f7f7;margin-bottom:8px}html.yui3-js-enabled .tabbed-content.hide{display:block;opacity:1 !important}html.yui3-js-enabled .tabbed-content .title{display:none}html.yui3-js-enabled .tabbed-content div{display:none}html.yui3-js-enabled .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-down.svg") no-repeat scroll right 3px #f7f7f7;color:#333;display:block;font-size:16px;padding-bottom:.6em;padding-right:20px;width:100%}html.yui3-js-enabled .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.svg");margin-bottom:10px}html.yui3-js-enabled .tabbed-content.open div{display:block}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-right.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content.open .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content .accordion-button{background-image:none;margin-bottom:10px}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content div{display:block}@media only screen and (min-width: 768px){html.yui3-js-enabled .tabbed-menu{display:block}html.yui3-js-enabled .tabbed-content{margin-bottom:20px;padding:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0 !important}html.yui3-js-enabled .tabbed-content .title{display:block}html.yui3-js-enabled .tabbed-content div{display:block}html.yui3-js-enabled .tabbed-content .vertical-divider div{display:table-cell}html.yui3-js-enabled .tabbed-content .accordion-button{display:none}}html.yui3-js-enabled .accordion-button.active{background-color:transparent}@media only screen and (min-width: 768px){.tabbed-menu{-moz-box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-shadow:0 -1px 10px #cfcfcf inset;box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background:none repeat scroll 0 0 #f7f7f7;padding-bottom:20px;padding-top:20px;position:relative}.tabbed-menu ul{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;margin-bottom:0;padding:0;position:relative;table-layout:fixed;width:100%}.tabbed-menu li{text-align:center;display:table-cell}.tabbed-menu a{color:#666;display:block;outline:none}.tabbed-menu a .active{color:#772953;text-decoration:none}.tabbed-menu a:hover{text-decoration:none}.tabbed-menu .arrow{bottom:0;position:absolute}.tabbed-content{*zoom:1;padding:20px 40px 0}.tabbed-content:before,.tabbed-content:after{content:"";display:table}.tabbed-content:after{clear:both}.tabbed-content .row{padding-left:0;padding-right:0}.tabbed-content .main-content{padding-bottom:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0}.tabbed-content-bg{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin-left:20px;margin-right:20px}.tabbed-content-bg .row-box{padding-left:0;padding-right:0}html.yui3-js-enabled .arrow{visibility:visible}}.row.vertical-divider{padding-bottom:40px}.vertical-divider div,.vertical-divider li{border-right:0;display:block;padding-left:0;padding-right:0}.vertical-divider-full{padding-bottom:0}.vertical-divider-full>div{padding-bottom:40px}.row.vertical-divider-full{padding-bottom:0}@media only screen and (max-width: 767px){.vertical-divider>div,.vertical-divider>li{border-bottom:1px dotted #888;padding-bottom:20px}.vertical-divider div:last-of-type,.vertical-divider li:last-of-type,.inline-icons li:last-of-type{border-bottom:0;padding-bottom:5px}.row.vertical-divider{padding-bottom:0}.equal-height div,.equal-height li{height:auto !important}}@media only screen and (min-width: 984px){.row.vertical-divider{padding-bottom:60px}.vertical-divider>div,.vertical-divider>li{border-right:1px dotted #888;display:table-cell;float:none;margin-right:0;padding-left:20px;padding-right:20px;vertical-align:top}.vertical-divider>div:last-child,.vertical-divider>li:last-child,.vertical-divider>div.last-col,.vertical-divider>li.last-col,.vertical-divider>div:last-of-type,.vertical-divider>li:last-of-type{border-right:0;padding-right:0}.vertical-divider>div:first-child,.vertical-divider>li:first-child,.vertical-divider>div.first-col,.vertical-divider>li.first-col,.vertical-divider>div:first-of-type,.vertical-divider>li:first-of-type{padding-left:0}}.slider{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#f7f7f7;padding-top:40px}.slider .slide-window{overflow:hidden;position:relative;height:450px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s}.slider .slide-container{position:absolute;width:2800 px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s;left:0}.slider .slider-dots ul{position:absolute;top:550px;left:220px;z-index:5}.slider .slider-dots li{background-position:0 -8px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/sprite-pager.png") no-repeat;float:left;height:7px;list-style-type:none;margin-right:.75em;text-indent:-9999em;width:7px}.slider .slider-dots li.active{background-position:0 0}.slider .slider-dots a{display:block;outline:0}.slider .slide{float:right;width:700px}.slider .slide h3{margin-top:65px;display:inline-block}.slider .slide p{width:350px}.slider .arrow-prev,.slider .arrow-next{font-size:5em;margin-top:150px;display:block;color:#888;outline:0}.slider .arrow-prev:hover,.slider .arrow-next:hover{text-decoration:none;color:#333}.slider .arrow-prev:active,.slider .arrow-next:active{padding-top:1px;text-decoration:none}.slider .arrow-prev:focus,.slider .arrow-next:focus{text-decoration:none}.yui3-tooltip-hidden{display:none}.yui3-tooltip-content{-moz-box-shadow:0 2px 8px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.2);box-shadow:0 2px 8px rgba(0,0,0,0.2);background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg") repeat scroll 0 0 transparent;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #e3e3e3;color:#333;margin-top:-30px;max-width:520px;position:relative}.yui3-tooltip .yui3-widget-bd{padding:20px;width:320px}.yui3-tooltip .yui3-widget-bd *{max-width:100%}.yui3-tooltip .yui3-widget-bd h5{margin-bottom:10px;font-size:22px;font-weight:300}.yui3-tooltip .yui3-widget-bd img{float:left;margin-right:10px}.yui3-tooltip .yui3-widget-bd q{border-bottom:1px dotted #888;border-top:1px dotted #888;display:block;font-size:16px;font-style:italic;margin-bottom:0;margin-top:20px;padding:10px 0}.yui3-tooltip .yui3-widget-bd p:last-child{margin-bottom:0}.yui3-tooltip .yui3-widget-ft,.yui3-tooltip .yui3-widget-ft div{position:absolute;width:0;height:0;border-style:solid;line-height:0;font-size:0}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft,.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:-10px;left:50%;margin:0 0 0 -10px;border-width:0 10px 10px;border-color:#efefef transparent}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:0;border-color:#efefef transparent}.tooltip-label{-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.3);box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;border:1px solid #dfdcd9;display:none;font-size:13px;line-height:1;margin:0;padding:6px 5px;position:absolute;top:-20px;white-space:nowrap;z-index:1000}body,a:link,a:visited{-webkit-font-smoothing:antialiased}code,pre,p{line-height:1.5}body{font-size:16px}@media only screen and (min-width: 768px){code,pre,p{line-height:1.6}body{font-size:16px}}@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi){body{font-size:18px}}.not-for-medium{display:none}@media only screen and (min-width: 985px){.not-for-medium{display:block}}header.banner{background:#000;-moz-box-shadow:inset 0 2px 2px -2px #000;-webkit-box-shadow:inset 0 2px 2px -2px #000;box-shadow:inset 0 2px 2px -2px #000;margin-bottom:0}header.banner .nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;*zoom:1}header.banner .nav-primary:before,header.banner .nav-primary:after{content:"";display:table}header.banner .nav-primary:after{clear:both}header.banner nav.nav-primary{border-bottom:1px solid #262626;overflow:visible}header.banner nav.nav-primary .user-nav{float:right;margin-right:20px}header.banner nav.nav-primary .user-dropdown:hover ul:after{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img{margin-right:10px}header.banner nav.nav-primary .user-dropdown .menu-link img.hover{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img.normal{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.hover,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.hover{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.normal,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.normal{display:none}header.banner nav.nav-primary .user-dropdown ul{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin-top:-2px;background-color:#fff;border-width:0}header.banner nav.nav-primary .user-dropdown ul a:hover{background-color:transparent}header.banner nav.nav-primary #user-dropdown .dropdown ul{width:auto}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:73px 30px;-webkit-background-size:73px 30px;-o-background-size:73px 30px;background-size:73px 30px;background-image:url(../img/logos/logo.svg);background-position:20px;background-repeat:no-repeat;min-width:120px;padding-top:6px;margin-left:0}body.no-svg header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url(../img/logos/logo.png)}input[type=text]::-ms-reveal,input[type=text]::-ms-clear{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}.contextual-bar{overflow:hidden;background-color:#fff;border-bottom:1px solid #d4d4d4}form.search-form{overflow:hidden;float:right;width:100%;position:relative}form.search-form input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;border-left:0;margin:0;width:100%;height:50px;float:left;font-size:1em;padding-top:0;padding-bottom:0;padding-right:30px;background-color:transparent;-webkit-appearance:none}form.search-form input:focus{border-color:#dd4814}form.search-form button[type=submit],form.search-form button[type=submit]:hover{position:absolute;top:10px;right:10px;display:block;height:30px;width:30px;padding:0;line-height:0;-webkit-appearance:none;background:transparent}form.search-form button img{height:16px}.contextual-nav{border:0;display:block;margin:0;padding-left:10px;background-color:transparent;overflow:hidden;float:left}.contextual-nav li,.contextual-nav li:last-child{font-size:0.875em;float:left;list-style-type:none;margin:0;margin-left:5px}.contextual-nav li a:link,.contextual-nav li a:visited,.contextual-nav .contextual-nav__label{display:block;color:#333;font-weight:300;text-align:center;padding:16px 10px 10px 10px;border-bottom:3px solid transparent}.contextual-nav .contextual-nav__label{color:#cdcdcd}.contextual-nav li a:hover{border-bottom-color:#dd4814;text-decoration:none;color:#dd4814}.contextual-nav li a.active{border-bottom:3px solid #dd4814}.opera-mini header.banner .logo-ubuntu,.no-svg header.banner .logo-ubuntu{background-image:url(../img/logos/logo.png)}@media only screen and (min-width: 769px){header.banner .nav-primary ul li,header.banner .nav-primary ul li:last-child{border-bottom:0;width:auto}header.banner nav.nav-primary li a:link,header.banner nav.nav-primary li a:visited{border-left:1px solid #262626;font-weight:400}header.banner nav.nav-primary ul li a.active{padding-bottom:10px;background-color:#0e0c0b;border-bottom:3px solid #dd4814;border-left:1px solid #262626}header.banner nav.nav-primary ul li{border-left:1px solid #262626}header.banner nav.nav-primary ul li a:hover{background-color:#dd4814}header.banner nav.nav-primary ul{background-color:transparent;border-right:1px solid #262626;display:block}header.banner nav.nav-primary ul li:last-child{border-left:1px solid #262626;border-right:0}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:0}header.banner .nav-primary ul li a.external:hover{background-image:url("../img/icons/external-link-grey.png")}form.search-form{width:325px}form.search-form input{border-left:1px solid #d4d4d4;margin:0 20px;width:250px;font-size:0.875em}}@media only screen and (min-width: 1030px){header.banner{height:48px;overflow:hidden}header.banner .nav-primary{width:100%}}body{background-repeat:repeat}.row{border:0;background-color:rgba(255,255,255,0.6)}@media only screen and (min-width: 769px){.append-one{margin-right:10.6%}.row{padding:50px 40px 30px}}.inner-wrapper{*zoom:1;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:transparent;background-image:none;margin:0 auto;padding-bottom:0;float:none}.inner-wrapper:before,.inner-wrapper:after{content:"";display:table}.inner-wrapper:after{clear:both}.wrapper{position:static;background:transparent;width:100%;overflow:hidden}img.touch-border{margin-bottom:-50px}.inner-wrapper,footer.global .legal{max-width:1030px;width:auto;padding-left:0;padding-right:0}.touch-top{margin-top:-50px}@media only screen and (max-width: 1030px){.inner-wrapper,footer.global .legal{padding-left:8px;padding-right:8px;width:auto}}.footer-cta{background:#fff;padding-bottom:20px}.footer-wrapper.strip-light{background-color:#fff}.solutions-cta{height:60px;background-color:#dd4814;line-height:60px;text-align:center}.solutions-cta a{color:#fff;font-size:1.25em}footer.global{background-color:white;box-shadow:none;padding-top:0}footer.global .row{padding:10px 0 0}footer.global .two-col{width:46%;float:left;display:inline-block;min-height:200px}footer.global h2{padding-bottom:0;color:#888;font-size:16px}footer.global nav .canonlist ul li,footer.global nav .additional-info ul li{min-height:0;width:48%;float:left}footer.global ul.bullets li:after{line-height:1;color:#888;content:"•";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:auto}footer.global a.external{background-image:url("../img/icons/external-link-dark.png")}footer.global .top-link{margin-bottom:10px}footer.global a{color:#333}footer.global a:hover{color:#dd4814}footer.global .legal{background-image:none}footer.global .legal.has-cookie{padding-bottom:70px}footer.global .inner-wrapper{overflow:visible}footer.global a.link-cta-positive,footer.global a.link-cta-negative{width:auto;margin-top:10px;padding-left:20px;padding-right:20px;color:#fff;font-size:14px}footer.global .section__title{background:none;cursor:default}.legal-inner{clear:both;overflow:hidden;float:left;width:100%;padding:20px 10px 0;margin:-3px -10px 0}.social,.social--right{margin-left:0}.social .social__item,.social--right .social__item{display:inline;float:left;padding-right:1em}.social .social__google,.social .social__facebook,.social .social__twitter,.social--right .social__google,.social--right .social__facebook,.social--right .social__twitter{background-image:url("../img/icons/icon-social.png");display:block;width:45px;height:44px}.social .social__google.social__twitter:hover,.social .social__facebook.social__twitter:hover,.social .social__twitter.social__twitter:hover,.social--right .social__google.social__twitter:hover,.social--right .social__facebook.social__twitter:hover,.social--right .social__twitter.social__twitter:hover{background-position:0 -45px}.social .social__google.social__facebook,.social .social__facebook.social__facebook,.social .social__twitter.social__facebook,.social--right .social__google.social__facebook,.social--right .social__facebook.social__facebook,.social--right .social__twitter.social__facebook{background-position:90px 0}.social .social__google.social__facebook:hover,.social .social__facebook.social__facebook:hover,.social .social__twitter.social__facebook:hover,.social--right .social__google.social__facebook:hover,.social--right .social__facebook.social__facebook:hover,.social--right .social__twitter.social__facebook:hover{background-position:90px -45px}.social .social__google.social__google,.social .social__facebook.social__google,.social .social__twitter.social__google,.social--right .social__google.social__google,.social--right .social__facebook.social__google,.social--right .social__twitter.social__google{background-position:135px 0}.social .social__google.social__google:hover,.social .social__facebook.social__google:hover,.social .social__twitter.social__google:hover,.social--right .social__google.social__google:hover,.social--right .social__facebook.social__google:hover,.social--right .social__twitter.social__google:hover{background-position:135px -45px}@media only screen and (min-width: 768px){.social--right{float:right}}#additional-info{border-bottom:0}#additional-info h2:before{background-image:url("../img/icons/external-link-grey.svg"),none;background-repeat:no-repeat;background-size:14px 14px;content:"";display:inline-block;height:15px;margin-right:3px;position:relative;top:3px;width:15px}#additional-info div li{border-left:1px solid #d4d7d4;box-sizing:border-box;display:block;float:left;margin:0;padding:0;width:50%}#additional-info div li a{border-bottom:1px solid #d4d7d4;box-sizing:border-box;color:#333333;display:block;float:left;margin:0;overflow:hidden;padding:8px 10px;text-align:left;white-space:normal;width:100%}#additional-info .section__title{border-bottom:1px solid #d4d7d4;background-position:100% .1em}html.opera-mini footer #nav-global h2:before,html.opera-mini footer #additional-info h2:before,html.no-svg footer #nav-global h2:before,html.no-svg footer #additional-info h2:before{background-image:url("../img/icons/external-link-grey.png")}@media only screen and (min-width: 769px){.footer-wrapper.strip-light{white-space:nowrap}footer.global{padding-top:40px;padding-bottom:40px}footer.global .two-col{width:14.89361%;display:inline-block;min-height:0}footer.global .section{min-height:160px;margin-right:40px;padding-bottom:0;border-right:1px dotted #aaa;border-bottom:0}footer.global .section:last-child{margin-right:0;border-right:0}footer.global li{display:inline;float:left}footer.global ul.no-bullets li{border-right:1px dotted #aaa;padding-right:15px;padding-left:15px}footer.global ul.no-bullets li a{font-size:16px}footer.global ul.no-bullets li a:hover{color:#dd4814}footer.global ul.no-bullets li:last-child{border-right:none}footer.global ul.no-bullets li:first-child{padding-left:0px}#additional-info .section__title{border-bottom:0}#additional-info div li,#additional-info div a:link{width:100%;border:0}}.actions .actions__social-item--twitter,.actions .actions__social-item--google-plus{text-indent:-99999px;background-image:url("../img/icons/icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:block}.actions .actions__social-item--twitter{background-position:0 0}.actions .actions__social-item--twitter:hover{background-position:0 -45px}.actions .actions__social-item--google-plus{background-position:-45px 0}.actions .actions__social-item--google-plus:hover{background-position:-45px -45px}.anchor{display:inline-block;margin-left:3px;opacity:.0;position:relative;top:1px;width:1em;height:1em;background:url("../img/icons/anchor_16.svg") 0 80% no-repeat;background-size:16px;-moz-transition:opacity .1s;-webkit-transition:opacity .1s;transition:opacity .1s}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,dt:hover .anchor,li:hover .anchor{opacity:1}.box{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;display:block;margin-bottom:0;border-top:0;border-left:0;border-right:0;padding-left:0;padding-right:0}.box-dim{background-color:#fafafa}@media only screen and (min-width: 768px){.box{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);-webkit-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);display:inline-block;margin-bottom:20px;padding-left:20px;padding-right:20px;border:0}}a.indent{-moz-box-shadow:inset 0 1px 2px 0 #333;-webkit-box-shadow:inset 0 1px 2px 0 #333;box-shadow:inset 0 1px 2px 0 #333;background:rgba(0,0,0,0.1);padding:10px 30px;text-weight:normal}a.indent:hover{background:rgba(0,0,0,0.2)}a.link-cta-positive,a.link-cta-negative{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#dd4814;color:#fff;display:inline-block;font-size:1.14286em;font-weight:300;text-decoration:none;margin:0;padding:8px 14px;text-align:center;-moz-transition:background .2s;-webkit-transition:background .2s;transition:background .2s;width:100%}a.link-cta-positive:hover,a.link-cta-negative:hover{background-color:#ae3910}a.link-cta-positive .external,a.link-cta-negative .external{padding-right:1em;background-image:url("../img/icons/external-link-white.svg");background-repeat:no-repeat;background-size:11px;background-position:right top}@media only screen and (min-width: 769px){a.link-cta-positive .external,a.link-cta-negative .external{padding-right:.7em}}a.link-cta-negative{background-color:#b2b2b2}a.link-cta-negative:hover{background-color:#888}.charms__list{list-style:none;margin-bottom:1em;margin-left:0;border-bottom:1px dotted #d4d4d4}.charms__list .charms__list--config{display:none}.charms__list .charms__list--toggle{display:block}.charms__list .charms__list--toggle.is-open+.charms__list--config{display:block}.charms__list .charms__list--config-name{border-top:0}.charms__list--item{font-size:1em;border-top:1px dotted #d4d4d4;padding:10px 0 0 10px;margin-bottom:10px}.charms__list--item:last-of-type{margin-bottom:10px}.charms__list--icon{margin-right:.4em;width:25px;height:25px}.charms__list--toggle{background:url("../img/shared/icon-arrow-down.svg") no-repeat center center;width:16px;height:100%;float:right;text-indent:-99999px;margin-right:20px}.charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.svg");background-size:14px}.charms__list--config{padding-left:35px;padding-bottom:20px}.charms__list--config-name{font-size:1em;margin-top:15px;padding-top:15px;font-weight:400;border-top:1px dotted #d4d4d4}.charms__list--config-name:first-of-type{border-top:0}.charms__list--config-type{font-weight:400}.charms__list--config-description,.charms__list--config-setting{margin-left:30px;margin-top:8px}.charms__list--config-setting{font-size:0.875em;color:#888;font-family:"Ubuntu Mono","Consolas","Monaco","Lucida Console","Courier New",Courier,monospace}body.no-svg .charms__list .charms__list--toggle{background-image:url("../img/shared/icon-arrow-down.png")}body.no-svg .charms__list .charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.png")}pre{background:transparent;border:1px solid #888;margin:0 0 1.5em 0}pre:not(:first-child){margin-top:1.5em}code.language-bash .comment{color:#888}.cookie-policy{-moz-box-shadow:0 -1px 2px rgba(0,0,0,0.2);-webkit-box-shadow:0 -1px 2px rgba(0,0,0,0.2);box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;bottom:0;position:fixed;width:100%;z-index:100}.cookie-policy p{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:13px;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url(../img/icons/close-orange.svg);background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}html.no-svg .cookie-policy .link-cta,html.opera-mini .cookie-policy .link-cta{background-image:url(../img/icons/close-orange.png)}html.opera-mini .cookie-policy{position:relative;top:0}.deploy-command{margin-bottom:10px;position:relative}.deploy-command .deploy-command__field{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);background-image:url("../img/icons/code-snippet_16.svg");background-repeat:no-repeat;background-position:5px center;background-color:#fff;background-size:1.142857143em;width:100%;height:37px;border:1px solid #c1c1c1;padding:.6em;color:#888;padding-left:2em;font-size:0.875em;white-space:nowrap;overflow:hidden;cursor:text}.deploy-command .command2clipboard__clip{cursor:pointer;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;line-height:1;position:absolute;right:1px;top:1px;background-color:#fff;padding:9px 8px 7px;border-left:1px solid #b2b2b2;display:none}.deploy-command .command2clipboard__clip.zeroclipboard-is-hover{background-color:#eee}@media only screen and (min-width: 1030px){.deploy-command .command2clipboard__clip{display:inline-block}}.dropdown-menu{position:relative;display:block}.dropdown-menu.open .menu-link{background-color:#000}.dropdown-menu.open .dropdown{display:block}.dropdown-menu .menu-link .border-box{display:block;color:#f2f2f4}.dropdown-menu .dropdown{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;display:none;position:absolute;z-index:1000;top:0;left:0;right:0;width:auto;background-color:#fff;box-shadow:0 1px 5px rgba(0,0,0,0.2)}.dropdown-menu .dropdown.right{left:auto;right:0;text-align:right}.dropdown-menu .dropdown.narrow{min-width:140px;width:auto}.dropdown-menu .dropdown a,.dropdown-menu .dropdown p,.dropdown-menu .dropdown li{color:#333}.dropdown-menu .dropdown p{padding:11px 20px}.dropdown-menu .dropdown header,.dropdown-menu .dropdown footer{background-color:#fff}.dropdown-menu .dropdown header{padding:11px 20px;color:#f2f2f4;font-size:16px;font-weight:300}.dropdown-menu .dropdown footer{padding:20px}.dropdown-menu .dropdown ul{width:auto;left:0;right:0}.dropdown-menu .dropdown ul li a{width:auto;display:block;padding:15px 20px}.files .files__list{list-style:none;margin-bottom:1em;border-left:1px solid #cbcbcb;margin-left:1em}@media only screen and (min-width: 768px){.files .files__list{margin-left:0}}.files .files__list li{position:relative}.files .files__list li a:link,.files .files__list li a:visited{color:#333;text-decoration:none}.files .files__list li:before{content:'';width:12px;height:1px;background:#d4d4d4;display:inline-block;position:relative;top:-4px;margin-right:5px}.files .files__list li:last-child:after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;top:.85em;background:#fff}.files .files__list ul:last-child>li a:after{content:'';width:4px;height:3em;position:absolute;display:block;left:-1.8em;top:-1.45em;background:white;cursor:default}.files .files__list .files__list{margin-left:1.3em}.files .files__list .files__list--item,.files .files__list .files__list--item-folder{font-size:0.875em;margin-bottom:0.75em}.files .files__list .files__list--item-folder{background-position:center right;background-size:12px;cursor:pointer}.files .files__list .files__list--item-folder:after{font-size:14px;display:block;content:"-";position:absolute;left:-7px;top:4px;padding:0 4px;line-height:0.9em;background:#fff;border:1px solid #888}.files .files__list .files__list--item-folder.is-closed+ul{display:none}.files .files__list .files__list--item-folder.is-closed:after{content:"+";padding:0 2px}.files .files__actions--launchpad{background:url("../img/icons/icon-launchpad.svg") no-repeat;padding-left:1.4em}#main-content .row-hero{padding-top:20px;margin-top:0}#main-content .row-hero .intro{font-size:16px}@media only screen and (min-width: 769px){#main-content .row-hero{padding-top:60px}#main-content .row-hero .intro{font-size:1.4375em;margin-bottom:40px}}.how-to div div img{float:left;margin:0 20px 20px 0}header.banner a.external,header.banner a.external:hover{background-image:url("../img/icons/external-link-grey.png")}a.external,a.external:hover,header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-repeat:no-repeat}a.external,a.external:hover header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-position:right 14px top 14px;padding-right:35px;background-size:auto}@media only screen and (max-width: 769px){header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background:none}header.banner nav.nav-primary ul li a.external:after{display:inline-block;width:11px;height:11px;margin-left:0.25em;background-image:url("../img/icons/external-link-dark.png");vertical-align:text-top}}.list__icons{margin-left:0;margin-bottom:5px}.list__icons li{list-style:none;float:left;padding:8px 8px 0 0;margin-bottom:0}.list__icons li img{width:24px;height:24px;vertical-align:top}.list__tick{list-style-image:url("../img/icons/tick.png")}.list__middot{margin-left:0;list-style:none}.list__middot li{display:inline}.list__middot li:after{content:"•";color:#888;margin:0 5px 0 8px;vertical-align:middle}.list__middot li.files__actions--last:after{content:""}.combined-list .list li{border-bottom:1px dotted #888;padding:10px 0}@media only screen and (max-width: 767px){.combined-list .last-col .list li:last-of-type{border-bottom:0;padding-bottom:0}}@media only screen and (min-width: 768px){.combined-list .list li:last-of-type{border-bottom:0;padding-bottom:0}}.events-list li{position:relative;padding-bottom:20px}.events-list dd{margin-left:0;background-position:0 center;background-repeat:no-repeat;background-size:20px 20px;padding:6px 20px 6px 24px}.events-list .event-map{display:none}.events-list .event-date{background-image:url("../img/icons/calendar.svg")}.events-list .location{background-image:url("../img/icons/location.svg")}@media only screen and (min-width: 769px){.events-list .event-details-wrapper{padding-left:120px}.events-list .event-map{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;position:absolute;left:0;top:0;height:100px;width:100px;float:left;margin-right:10px;margin-top:5px;overflow:hidden;display:block}}body.no-svg .events-list .event-date{background-image:url("../img/icons/calendar.png")}body.no-svg .events-list .location{background-image:url("../img/icons/location.png")}.maintainers .maintainer__email{display:block}.ratings ul{margin-left:2px;margin-bottom:0}.ratings ul li{margin-bottom:0}.ratings ul li img{vertical-align:text-top}.ratings ul li:first-of-type{margin-left:0}.revisions__list{list-style:none;margin-left:0}.revisions__list .revisions__list-item{margin-bottom:1em}.revisions__list .revisions__list_meta{color:#888;margin-bottom:.2em}.revisions__list .revisions__list_meta_date{float:right}.section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;padding-bottom:20px;padding-top:20px}.section .section__title{background:url(../img/shared/icon-arrow-up.svg) no-repeat center right;cursor:pointer;margin-bottom:1em}.section.is-closed{height:60px}.section.is-closed .section__title{background-image:url(../img/shared/icon-arrow-down.svg)}.no-svg .row.section .section__title{background:url(../img/shared/icon-arrow-up.png)}.no-svg .row.section.is-closed .section__title{background:url(../img/shared/icon-arrow-down.png)}footer .section{margin-bottom:1em;padding-bottom:1em}footer .section.is-closed{height:auto;padding-bottom:0}footer .section.is-closed ul{display:none}@media only screen and (min-width: 769px){.row .section .section__title{background-image:none;cursor:auto}.row .section.is-closed{height:auto}}.list--concealed .list-item{display:none}.list--concealed .list-item:first-of-type{display:list-item}.list--concealed.list--visible-6 .list-item:nth-child(-n+6){display:list-item}.list--concealed.list--visible-4 .list-item:nth-child(-n+4){display:list-item}.list--concealed.list--visible-2 .list-item:nth-child(-n+2){display:list-item}.list--concealed a.btn__see--less{display:none}.list--concealed a.btn__see--more{display:inline}.list--revealed .list__controls,.list--concealed .list__controls{display:block;margin-top:2em}.list--revealed .list--item{display:list-item}.list--revealed a.btn__see--less{display:inline}.list--revealed a.btn__see--more{display:none}a.btn__see--more,a.btn__see--less{-moz-transition:background .2s;-webkit-transition:background .2s;transition:background .2s;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#333;border-radius:2px;border:1px solid #b2b2b2;background:#fff;padding:0.384615385em 1.153846154em}a.btn__see--more:hover,a.btn__see--less:hover{background:#eee;text-decoration:none}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}.tag-list{list-style:none;margin:0}.tag-list--item{display:inline-block;text-transform:lowercase}.tag-list--item a:link,.tag-list--item a:visited{color:#333}.tag-list--item a:after{content:','}.tag-list--item:last-child a:after{content:''}#twitter-feed,#blog-feed{margin:35px 0}#twitter-feed>ul,#blog-feed>ul{list-style:none;margin-left:0}#twitter-feed>ul li,#blog-feed>ul li{position:relative;margin-bottom:30px}#twitter-feed .user,#blog-feed .user{font-size:0.875em;margin-bottom:0.5em}#twitter-feed .user img,#blog-feed .user img{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:24px;height:24px;vertical-align:middle;margin-right:5px}#twitter-feed .user a:link,#twitter-feed .user a:visited,#twitter-feed .user a:hover,#blog-feed .user a:link,#blog-feed .user a:visited,#blog-feed .user a:hover{text-decoration:none}#twitter-feed .user span[data-scribe="element:name"],#blog-feed .user span[data-scribe="element:name"]{color:#333}#twitter-feed .tweet,#blog-feed .tweet{padding-left:33px;margin-bottom:.3em}#twitter-feed .timePosted,#blog-feed .timePosted{padding-left:33px;font-size:0.875em}#twitter-feed .interact,#blog-feed .interact{padding-left:33px}#twitter-feed .interact a:link,#twitter-feed .interact a:visited,#blog-feed .interact a:link,#blog-feed .interact a:visited{margin-right:20px}@media only screen and (min-width: 769px){#twitter-feed .timePosted{position:absolute;top:0;right:0;padding-left:0}}.spaced-segment{margin-bottom:50px}.spaced-segment h3{margin-bottom:1.3em}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}@media only screen and (min-width: 769px){.tip,.command2clipboard__clip{position:relative;display:inline-block}.tip .tip-content,.command2clipboard__clip .tip-content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tip:hover .tip-content:after,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tip:hover .tip-content:before,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}.fake{display:block}*{-webkit-backface-visibility:hidden;margin:0}html{height:100%}body{height:100%;font-size:1.0em;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-weight:300}hr{border:none;background:#B2B2B2;width:100%;height:1px;display:block;width:100%;float:left;margin-bottom:20px}ul,ol{margin-left:0}a.alt{color:#333}a.alt:hover{color:#dd4814}a:active,a:focus{outline:none}::selection{color:#FFF;background:#dd4814}::-moz-selection{color:#FFF;background:#dd4814}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot?") format("eot"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot?") format("eot"),url("../fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:400;src:url("../fonts/ubuntu-r-webfont.eot?") format("eot"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot?") format("eot"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot?") format("eot"),url("../fonts/ubuntu-mi-webfont.woff2") format("woff2"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot?") format("eot"),url("../fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}.accordion{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.disabled .accordion{opacity:.5;pointer-events:none}.accordion .accordion__title{border-bottom:1px dotted #B2B2B2;padding:13px 20px 12px;margin:0;font-size:1.3em}.accordion .accordion__tab{border-bottom:1px dotted #B2B2B2}.accordion .accordion__tab:last-of-type{border:none}.accordion .accordion__tab .accordion__tab-title{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../img/icons/accordion-open.svg") top 20px right 20px no-repeat}.accordion .accordion__tab .accordion__tab-title.active{background-image:url("../img/icons/accordion-close.svg")}.accordion .accordion__tab .accordion__tab-title.active+.accordion__tab-content{max-height:3000px;transition:max-height .5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height .5s ease-out;overflow:hidden}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:0.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active{font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active .accordion__tab-link{background:transparent url("../img/icons/cross.svg") top 7px right 0px no-repeat}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover{color:#dd4814}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover .accordion__tab-link{color:#dd4814;background-image:url("../img/icons/cross-orange.svg")}.cta-group .cta-group__link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px 0px 0px 3px;-moz-border-radius:3px 0px 0px 3px;border-radius:3px 0px 0px 3px;display:inline-block;padding:10px 14px;text-align:center;color:#fff;background-color:#dd4814}.cta-group .cta-group__link:hover{cursor:pointer;text-decoration:none;background-color:#c03f11}.cta-group.secondary .cta-group__link{color:#dd4814;border:1px solid #b2b2b2;background-color:#FFF;line-height:1}.cta-group.secondary .cta-group__link:hover{cursor:pointer;background-color:#F2F2F2}a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{font-size:1em;border:none;max-height:37px}a.link-cta-ubuntu[disabled],a.link-cta-ubuntu.disabled,button.cta-ubuntu[disabled],button.cta-ubuntu.disabled,input[type='submit'][disabled],input[type='submit'].disabled,form button[type='submit'][disabled],form button[type='submit'].disabled,form input[type='submit'][disabled],form input[type='submit'].disabled{cursor:default;opacity:.5}a.link-cta-ubuntu.clear,button.cta-ubuntu.clear,input[type='submit'].clear,form button[type='submit'].clear,form input[type='submit'].clear{background:none;color:#333}a.link-cta-ubuntu.secondary,button.cta-ubuntu.secondary,input[type='submit'].secondary,form button[type='submit'].secondary,form input[type='submit'].secondary{color:#dd4814;border:1px solid #b2b2b2;background:#FFF}a.link-cta-ubuntu.secondary.external,button.cta-ubuntu.secondary.external,input[type='submit'].secondary.external,form button[type='submit'].secondary.external,form input[type='submit'].secondary.external{background-image:url("../img/external-link-black.svg");background-size:16px 16px;background-repeat:no-repeat;background-position:top 8px right 8px}a.link-cta-ubuntu.secondary:hover,button.cta-ubuntu.secondary:hover,input[type='submit'].secondary:hover,form button[type='submit'].secondary:hover,form input[type='submit'].secondary:hover{background-color:#F2F2F2;cursor:pointer}a.link-cta-ubuntu.secondary[disabled],a.link-cta-ubuntu.secondary.disabled,button.cta-ubuntu.secondary[disabled],button.cta-ubuntu.secondary.disabled,input[type='submit'].secondary[disabled],input[type='submit'].secondary.disabled,form button[type='submit'].secondary[disabled],form button[type='submit'].secondary.disabled,form input[type='submit'].secondary[disabled],form input[type='submit'].secondary.disabled{cursor:default;color:#f5ae95;border:1px solid #ddd;background:#FFF;opacity:1}a.link-cta-ubuntu.secondary[disabled]:hover,a.link-cta-ubuntu.secondary.disabled:hover,button.cta-ubuntu.secondary[disabled]:hover,button.cta-ubuntu.secondary.disabled:hover,input[type='submit'].secondary[disabled]:hover,input[type='submit'].secondary.disabled:hover,form button[type='submit'].secondary[disabled]:hover,form button[type='submit'].secondary.disabled:hover,form input[type='submit'].secondary[disabled]:hover,form input[type='submit'].secondary.disabled:hover{background:#FFF}a.link-cta-ubuntu.text-button,button.cta-ubuntu.text-button,input[type='submit'].text-button,form button[type='submit'].text-button,form input[type='submit'].text-button{background-color:transparent;color:#333}a.link-cta-ubuntu.text-button:hover,button.cta-ubuntu.text-button:hover,input[type='submit'].text-button:hover,form button[type='submit'].text-button:hover,form input[type='submit'].text-button:hover{text-decoration:underline}a.link-cta-ubuntu.full,button.cta-ubuntu.full,input[type='submit'].full,form button[type='submit'].full,form input[type='submit'].full{display:block;width:100%}@media screen and (max-width: 768px){a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{margin-bottom:20px}}a.link-cta-ubuntu{line-height:20px}.cta-group{float:left;width:auto;clear:both;position:relative;overflow:hidden}.cta-group .cta-group__link{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;max-height:36px;padding-right:49px;width:100%;line-height:1.2;position:relative;margin:0;text-align:left}.cta-group .cta-group__link:after{-webkit-border-radius:0px 3px 3px 0px;-moz-border-radius:0px 3px 3px 0px;border-radius:0px 3px 3px 0px;content:'';display:block;height:36px;width:34px;background:red;position:absolute;top:0;right:0;background-image:url("../img/chevron-white.svg");background-color:#dd4814;background-repeat:no-repeat;background-position:center}.cta-group .cta-group__link:hover{background-color:#dd4814}.cta-group .cta-group__link:hover:after{background-color:#c03f11}.cta-group .cta-group__dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;right:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;position:relative;clear:both}.cta-group .cta-group__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out}.cta-group .cta-group__dropdown .cta-group__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;clear:both;padding:5px 10px;margin:0}.cta-group .cta-group__dropdown .cta-group__item a{color:#333;cursor:pointer;width:100%;float:left;margin:0}.cta-group .cta-group__dropdown .cta-group__item a:hover{color:#dd4814;text-decoration:none}.cta-group.secondary .cta-group__link{float:left;max-height:36px;width:100%}.cta-group.secondary .cta-group__link:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-color:#fff;border:1px solid #b2b2b2;border-left:none;top:-1px;right:-1px}.cta-group.secondary .cta-group__link:hover{background-color:#FFF}.cta-group.secondary .cta-group__link:hover:after{background-color:#F2F2F2}.flash-messages{margin:0px auto;padding:0;max-width:1440px}@media screen and (max-width: 1030px){.flash-messages{margin:0px 10px 20px}}.flash-messages .flash-messages__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.flash-messages .flash-messages__item.success{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.flash-messages .flash-messages__item.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.flash-messages .flash-messages__item.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url'],form textarea,form select,tags-input .tags .input,.accounts .api li input[type='text']{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;background:#FFF;color:#333;border:1px solid #D2D2D2;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0px 13px}form input[type='text']:active,form input[type='number']:active,form input[type='search']:active,form input[type='password']:active,form input[type='email']:active,form input[type='url']:active,form textarea:active,form select:active,tags-input .tags .input:active,.accounts .api li input[type='text']:active{border-color:#B2B2B2;outline:none}form input[type='text']:focus,form input[type='number']:focus,form input[type='search']:focus,form input[type='password']:focus,form input[type='email']:focus,form input[type='url']:focus,form textarea:focus,form select:focus,tags-input .tags .input:focus,.accounts .api li input[type='text']:focus{border-color:#B2B2B2;outline:none}form input.invalid[type='text'],form input.invalid[type='number'],form input.invalid[type='search'],form input.invalid[type='password'],form input.invalid[type='email'],form input.invalid[type='url'],form textarea.invalid,form select.invalid,tags-input .tags .invalid.input,.accounts .api li input.invalid[type='text'],form input.ng-invalid[type='text'],form input.ng-invalid[type='number'],form input.ng-invalid[type='search'],form input.ng-invalid[type='password'],form input.ng-invalid[type='email'],form input.ng-invalid[type='url'],form textarea.ng-invalid,form select.ng-invalid,tags-input .tags .ng-invalid.input,.accounts .api li input.ng-invalid[type='text']{border-color:#d90000}form input[disabled="disabled"][type='text'],form input[disabled="disabled"][type='number'],form input[disabled="disabled"][type='search'],form input[disabled="disabled"][type='password'],form input[disabled="disabled"][type='email'],form input[disabled="disabled"][type='url'],form textarea[disabled="disabled"],form select[disabled="disabled"],tags-input .tags [disabled="disabled"].input,.accounts .api li input[disabled="disabled"][type='text']{-webkit-text-fill-color:#333;border-color:#D2D2D2;background-color:transparent}label{position:relative}.disabled label{cursor:default}form li.help-msg{margin-bottom:1em}form li.help-msg .help{color:#888;font-size:0.875em}form label span{color:#333}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url']{padding:7px 10px}form input[type='text']::-webkit-input-placeholder,form input[type='number']::-webkit-input-placeholder,form input[type='search']::-webkit-input-placeholder,form input[type='password']::-webkit-input-placeholder,form input[type='email']::-webkit-input-placeholder,form input[type='url']::-webkit-input-placeholder{color:#888}form input[type='text']:-moz-placeholder,form input[type='number']:-moz-placeholder,form input[type='search']:-moz-placeholder,form input[type='password']:-moz-placeholder,form input[type='email']:-moz-placeholder,form input[type='url']:-moz-placeholder{color:#888}form input[type='text']::-moz-placeholder,form input[type='number']::-moz-placeholder,form input[type='search']::-moz-placeholder,form input[type='password']::-moz-placeholder,form input[type='email']::-moz-placeholder,form input[type='url']::-moz-placeholder{color:#888}form input[type='text']:-ms-input-placeholder,form input[type='number']:-ms-input-placeholder,form input[type='search']:-ms-input-placeholder,form input[type='password']:-ms-input-placeholder,form input[type='email']:-ms-input-placeholder,form input[type='url']:-ms-input-placeholder{color:#888}form input[type='number']{padding-right:15px}form input[type='search']{-webkit-appearance:textfield}form input[type='search']::-webkit-search-decoration,form input[type='search']::-webkit-search-cancel-button{-webkit-appearance:none}form input[type='radio'],form input[type='image']{display:inline-block;margin-right:10px}form textarea{overflow:auto;height:auto;min-height:175px;padding:7px 10px;vertical-align:top}form select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-position:top 16px right 10px;padding:6px 30px 6px 10px;-moz-appearance:none;text-indent:0.01px;text-overflow:''}form select[multiple],form select[size]{height:auto;background-image:none;padding-top:10px}form select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}form select[disabled]{color:#888;background-image:none}form select::-ms-expand{display:none}form fieldset{background:none;margin-left:0;padding:0}.checkbox{visibility:hidden;width:0;height:0;margin-right:0;position:absolute}.checkbox+.checkbox-label{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:20px;position:relative}.checkbox+.checkbox-label:before{content:"";display:inline-block;width:20px;height:20px;position:absolute;top:0;left:0;background:url("../img/checkbox.svg") no-repeat;background-size:13px 13px;background-position:0px 3px}.checkbox:checked+.checkbox-label:before{background:url("../img/checkbox-checked.svg") no-repeat;background-position:0px 3px}.checkbox[disabled="disabled"]+.checkbox-label:before{cursor:default;opacity:0.5}.field-error,.errors{color:#DF382C}.field-error .errorlist,.errors .errorlist{margin:0}.field-error .errorlist li,.errors .errorlist li{margin:0 0 14px 0}.inline{display:inline-block;width:100%;font-size:0;margin-bottom:10px}.inline.error{background-color:#fdf5f5;box-shadow:0px 0px 0px 5px #fdf5f5}.inline.error .ng-invalid{border-color:#D2D2D2}.inline:last-of-type{margin-bottom:0}.inline label{display:inline-block;float:none;font-size:16px;margin:0}.inline input[type='submit'],.inline input[type='text'],.inline input[type='number'],.inline input[type='search'],.inline input[type='password'],.inline input[type='email'],.inline input[type='checkbox'],.inline select{display:inline-block;clear:none;margin:0;float:none;font-size:16px}.inline input[type='submit']:invalid,.inline input[type='text']:invalid,.inline input[type='number']:invalid,.inline input[type='search']:invalid,.inline input[type='password']:invalid,.inline input[type='email']:invalid,.inline input[type='checkbox']:invalid,.inline select:invalid{-moz-box-shadow:none}.inline input[type='submit']:-moz-submit-invalid,.inline input[type='text']:-moz-submit-invalid,.inline input[type='number']:-moz-submit-invalid,.inline input[type='search']:-moz-submit-invalid,.inline input[type='password']:-moz-submit-invalid,.inline input[type='email']:-moz-submit-invalid,.inline input[type='checkbox']:-moz-submit-invalid,.inline select:-moz-submit-invalid{box-shadow:none}.inline input[type='submit']:-moz-ui-invalid,.inline input[type='text']:-moz-ui-invalid,.inline input[type='number']:-moz-ui-invalid,.inline input[type='search']:-moz-ui-invalid,.inline input[type='password']:-moz-ui-invalid,.inline input[type='email']:-moz-ui-invalid,.inline input[type='checkbox']:-moz-ui-invalid,.inline select:-moz-ui-invalid{box-shadow:none}.inline div{float:none;margin:0}.inline input.cta-ubuntu,.inline a.link-cta-ubuntu,.inline button.cta-ubuntu{font-size:16px}.inline .icon{position:absolute;top:11px;right:10px;cursor:pointer}.inline .error-message{font-size:12px;color:#e85232;margin-top:10px;margin-bottom:10px;font-weight:normal}.form-inline label,.form-inline button,.form-inline input[type='submit'],.form-inline input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{display:inline-block;width:auto;vertical-align:middle;margin-bottom:0}.form-inline input,.form-inline input[type='submit'] input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{margin-left:20px}.form-inline fieldset{width:auto;display:inline-block;margin:0 40px 0 0}.controls{position:absolute;top:0;right:20px}.controls a,.controls button{margin-left:20px}.icon{background-size:16px 16px;width:16px;height:16px;padding:0;display:inline-block}.icon.icon__loading{background:url("../img/in_progress.png") no-repeat;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear}a.icon{cursor:pointer}dl dt{clear:left}dl dd{color:#888;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:37px;margin-bottom:10px !important}tags-input{outline:none}tags-input .host:focus{outline:none}tags-input .tags:focus,tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:4px 0 0;padding:0;list-style-type:none;width:100%;float:left}tags-input .tags .tag-item{display:inline-block;float:left;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;height:30px;line-height:30px;cursor:default;color:#000;padding-right:15px;position:relative;margin:0 11px 0 0}tags-input .tags .tag-item .remove-button{display:inline-block;width:12px;height:12px;text-indent:-999em;background:url("../img/icons/cross.svg") no-repeat;background-size:12px 12px;position:absolute;right:0;top:9px;cursor:pointer}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags .input{padding:7px 10px;width:100% !important;float:left;position:relative !important;left:0}tags-input .tags .input::-ms-clear{display:none}tags-input .autocomplete{float:left;width:100%}tags-input .autocomplete .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px}tags-input .autocomplete .suggestion-list li:hover{background:#EEE;cursor:pointer}tags-input[disabled] .host:focus{outline:none}tags-input[disabled] .tags{cursor:default}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .input{cursor:default}.tag-link{margin-right:10px}.tag-link:last-of-type:after{content:''}.table__data tags-input .tags{margin-top:-10px}.table__data tags-input .tags input{margin-left:0;width:50% !important;float:left}.pagination{margin:10px 0;text-align:center}.pagination .inactive{color:#AEA79F}.pagination a,.pagination span{margin:0 5px}.search{position:relative;padding-bottom:20px}.search input[type='search']{-webkit-appearance:textfield}.search .search__input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:none;padding:13px 20px;font-size:1.25em}.search .search__input::-webkit-input-placeholder{color:#000 !important}.search .search__input:-moz-placeholder{color:#000 !important}.search .search__input::-moz-placeholder{color:#000 !important}.search .search__input:-ms-input-placeholder{color:#000 !important}.search .search__input[disabled="disabled"]{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input[disabled="disabled"]+.search__submit.close{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:25px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0;border:none}.search .search__submit:hover{background-color:transparent;background-image:url("../img/search-icon.svg")}.search .search__submit.close{background-image:url("../img/icons/cross.svg");background-size:21px;margin-top:2px}.search .search__submit.close:hover{background-image:url("../img/icons/cross.svg")}.spinner-col{width:10px}.spinner{float:left;margin:0 auto;text-indent:-9999em}.spinner.spin{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}table{text-align:left;width:100%;margin-bottom:40px;border-collapse:separate;border-spacing:0;font-size:16px}table th,table td{background:transparent;text-align:left;padding:13px 10px}table th .checkbox+.checkbox-label::before,table td .checkbox+.checkbox-label::before{top:-2px}table thead th{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}table tbody tr:hover .icon-controls a{opacity:1}table tbody td{border:none;border-bottom:1px dotted #B2B2B2;position:relative}table tbody td.icon-controls{text-align:right}table tbody td.icon-controls a{opacity:0}table tbody td input[type="text"]{position:absolute;left:10px;top:6px;width:80%}.table-listing{text-align:left;width:100%;margin:0 0 40px 0;border-collapse:separate;border-spacing:0}.table-listing .table-listing__row:hover .table-listing__cell{background-color:#FFF}.table-listing .table-listing__row.error{background-color:#F3E3E2}.table-listing .table-listing__row.error .status{color:#DD3832}.table-listing .table-listing__row.progress{background-color:rgba(25,182,238,0.1)}.table-listing .table-listing__row.selected{background-color:#FFF}.table-listing .table-listing__header{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}.table-listing .table-listing__header .table-listing__header-link{background-repeat:no-repeat;background-position:top 8px right 0;color:#888}.table-listing .table-listing__header .table-listing__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table-listing .table-listing__header .table-listing__header-link:focus,.table-listing .table-listing__header .table-listing__header-link:active,.table-listing .table-listing__header .table-listing__header-link:visited{text-decoration:none}.table-listing .table-listing__header .table-listing__header-link.active{color:#333}.table-listing .table-listing__header .table-listing__header-link.sort{border-bottom:1px solid #333}.table-listing .table-listing__header .divide{width:1px;display:inline-block;background:#D2D2D2 none repeat scroll 0% 0%;height:10px;padding:0px;margin:0px 5px}.table-listing .table-listing__cell{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-bottom:1px dotted #B2B2B2;position:relative}.table-listing .table-listing__cell.icon-controls{text-align:right;opacity:0}.table-listing .table-listing__cell input,.table-listing .table-listing__cell select{position:absolute;left:10px;top:5px;width:80%}.table-listing .fixed{max-width:200px;min-width:200px;width:200px;padding-left:0}.table-listing__header .table-listing .fixed{padding-left:0}.table-listing.no-hover .table-listing__row:hover .table-listing__cell,.table-listing.no-hover .table-listing__row:hover td{background-color:transparent}.t1{width:1%}.t2{width:2%}.t3{width:3%}.t4{width:4%}.t5{width:5%}.t6{width:6%}.t7{width:7%}.t8{width:8%}.t9{width:9%}.t10{width:10%}.t11{width:11%}.t12{width:12%}.t13{width:13%}.t14{width:14%}.t15{width:15%}.t16{width:16%}.t17{width:17%}.t18{width:18%}.t19{width:19%}.t20{width:20%}.t21{width:21%}.t22{width:22%}.t23{width:23%}.t24{width:24%}.t25{width:25%}.t26{width:26%}.t27{width:27%}.t28{width:28%}.t29{width:29%}.t30{width:30%}.t31{width:31%}.t32{width:32%}.t33{width:33%}.t34{width:34%}.t35{width:35%}.t36{width:36%}.t37{width:37%}.t38{width:38%}.t39{width:39%}.t40{width:40%}.t41{width:41%}.t42{width:42%}.t43{width:43%}.t44{width:44%}.t45{width:45%}.t46{width:46%}.t47{width:47%}.t48{width:48%}.t49{width:49%}.t50{width:50%}.t51{width:51%}.t52{width:52%}.t53{width:53%}.t54{width:54%}.t55{width:55%}.t56{width:56%}.t57{width:57%}.t58{width:58%}.t59{width:59%}.t60{width:60%}.t61{width:61%}.t62{width:62%}.t63{width:63%}.t64{width:64%}.t65{width:65%}.t66{width:66%}.t67{width:67%}.t68{width:68%}.t69{width:69%}.t70{width:70%}.t71{width:71%}.t72{width:72%}.t73{width:73%}.t74{width:74%}.t75{width:75%}.t76{width:76%}.t77{width:77%}.t78{width:78%}.t79{width:79%}.t80{width:80%}.t81{width:81%}.t82{width:82%}.t83{width:83%}.t84{width:84%}.t85{width:85%}.t86{width:86%}.t87{width:87%}.t88{width:88%}.t89{width:89%}.t90{width:90%}.t91{width:91%}.t92{width:92%}.t93{width:93%}.t94{width:94%}.t95{width:95%}.t96{width:96%}.t97{width:97%}.t98{width:98%}.t99{width:99%}.t100{width:100%}.table__column--1{width:1%}.table__column--2{width:2%}.table__column--3{width:3%}.table__column--4{width:4%}.table__column--5{width:5%}.table__column--6{width:6%}.table__column--7{width:7%}.table__column--8{width:8%}.table__column--9{width:9%}.table__column--10{width:10%}.table__column--11{width:11%}.table__column--12{width:12%}.table__column--13{width:13%}.table__column--14{width:14%}.table__column--15{width:15%}.table__column--16{width:16%}.table__column--17{width:17%}.table__column--18{width:18%}.table__column--19{width:19%}.table__column--20{width:20%}.table__column--21{width:21%}.table__column--22{width:22%}.table__column--23{width:23%}.table__column--24{width:24%}.table__column--25{width:25%}.table__column--26{width:26%}.table__column--27{width:27%}.table__column--28{width:28%}.table__column--29{width:29%}.table__column--30{width:30%}.table__column--31{width:31%}.table__column--32{width:32%}.table__column--33{width:33%}.table__column--34{width:34%}.table__column--35{width:35%}.table__column--36{width:36%}.table__column--37{width:37%}.table__column--38{width:38%}.table__column--39{width:39%}.table__column--40{width:40%}.table__column--41{width:41%}.table__column--42{width:42%}.table__column--43{width:43%}.table__column--44{width:44%}.table__column--45{width:45%}.table__column--46{width:46%}.table__column--47{width:47%}.table__column--48{width:48%}.table__column--49{width:49%}.table__column--50{width:50%}.table__column--51{width:51%}.table__column--52{width:52%}.table__column--53{width:53%}.table__column--54{width:54%}.table__column--55{width:55%}.table__column--56{width:56%}.table__column--57{width:57%}.table__column--58{width:58%}.table__column--59{width:59%}.table__column--60{width:60%}.table__column--61{width:61%}.table__column--62{width:62%}.table__column--63{width:63%}.table__column--64{width:64%}.table__column--65{width:65%}.table__column--66{width:66%}.table__column--67{width:67%}.table__column--68{width:68%}.table__column--69{width:69%}.table__column--70{width:70%}.table__column--71{width:71%}.table__column--72{width:72%}.table__column--73{width:73%}.table__column--74{width:74%}.table__column--75{width:75%}.table__column--76{width:76%}.table__column--77{width:77%}.table__column--78{width:78%}.table__column--79{width:79%}.table__column--80{width:80%}.table__column--81{width:81%}.table__column--82{width:82%}.table__column--83{width:83%}.table__column--84{width:84%}.table__column--85{width:85%}.table__column--86{width:86%}.table__column--87{width:87%}.table__column--88{width:88%}.table__column--89{width:89%}.table__column--90{width:90%}.table__column--91{width:91%}.table__column--92{width:92%}.table__column--93{width:93%}.table__column--94{width:94%}.table__column--95{width:95%}.table__column--96{width:96%}.table__column--97{width:97%}.table__column--98{width:98%}.table__column--99{width:99%}.table__column--100{width:100%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}.table{display:table;border-color:#B2B2B2;border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}.table .table__row{float:left;width:100%;display:table-row;border-bottom:1px dotted #B2B2B2}.table .table__row:hover{background-color:#FFF}.table .table__row:hover .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row:hover .table__input.invalid{border-color:#D90000}.table .table__row:hover .table__input[disabled]{border-color:transparent;color:#333}.table .table__row:hover .table__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.table__row--no-hover:hover{background-color:transparent}.table .table__row.active{background-color:#FFF}.table .table__row.active .table__dropdown .table__data,.table .table__row.active .table__dropdown .table__input{color:#333}.table .table__row.active:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.active:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.active:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input[disabled]{border-color:transparent;color:#333}.table .table__row.active .table__dropdown{max-height:3000px}.table .table__row.selected .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.selected:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.selected:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.selected:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.disabled>.table__data{color:#888;pointer-events:none}.table .table__row.disabled>.table__data>.table__input{color:#888;pointer-events:none}.table .table__row.disabled .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.disabled:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.noEdit .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.noEdit:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;height:100%;background:none;border:0;text-align:left;float:left}.table .table__header a,.table .table__data a{color:#dd4814}.table .table__header a:hover,.table .table__data a:hover{cursor:pointer}.table .table__head{display:table-head;width:100%;box-sizing:border-box}.table .table__head .table__row{border-bottom:1px solid #B2B2B2}.table .table__head .table__row:hover{background-color:transparent}.table .table__head .table__header{font-size:13px;background:none;color:#888}.table .table__head a,.table .table__head .table__header-link{color:#888}.table .table__head a:hover,.table .table__head .table__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table .table__head a.active,.table .table__head .table__header-link.active{color:#333;text-decoration:none}.table .table__head a.sort,.table .table__head .table__header-link.sort{border-bottom:1px solid inherit}.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.table .table__label a{color:#BCBCBC}.table .table__label a:hover{color:#dd4814}.table .table__label.active a{color:#dd4814}.table .table__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.table .table__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.table .table__tags .table__tag{display:inline-block;margin-right:5px}.table .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.table .table__input.invalid{border-color:transparent}.table .table__input.invalid:focus{border-color:#D90000}.table .table__input[disabled]{border-color:transparent;color:#333}.table .table__input:focus{background-color:#FFF;border-color:#D2D2D2}.table label{font-size:13px;color:#BCBCBC}.table input,.table select{margin:0 0 0 -14px}.table input[type="radio"]{margin-left:0}.table ul li{margin:0;margin-top:14px}.table ul li:first-of-type{margin-top:0}.table .table__dropdown{width:100%;max-height:0;overflow-y:hidden}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative;max-height:0;transition:max-height 0.10s ease-out;overflow:hidden}.table .table__dropdown .table__dropdown-row.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown .table__dropdown-row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head{border-bottom:0}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head .table__header{color:#BCBCBC;font-size:13px}.table .table__dropdown .table__dropdown-row.no-border{border:0}.table .table__dropdown .table__dropdown-row.no-border:before{border:0}.table .table__dropdown .table__dropdown-row .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__dropdown--info{width:100%;max-height:0;background-color:transparent}.table .table__dropdown--info .table__dropdown-row--info{border-bottom:0;position:relative;max-height:0;transition:max-height 0.10s ease-out;overflow:hidden}.table .table__dropdown--info .table__dropdown-row--info.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown--info .table__dropdown-row--info .table__data{color:#BCBCBC}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}h4{font-size:20px;font-weight:300}pre{border:0;background-color:#FFF;border-radius:2px}pre code{counter-reset:line-numbering}pre code .line{float:left}pre code .line::before{content:counter(line-numbering);counter-increment:line-numbering;padding-right:1em;width:1.5em;text-align:right;opacity:0.5;pointer-events:none;user-select:none}.yui3-node-add-widget{width:65.9292%;margin-right:2.21238%}@media screen and (max-width: 768px){.yui3-node-add-widget{width:100%;margin:0}}.yui3-node-add-widget .buttons{margin-top:30px}.yui3-node-add-widget .add-link img.icon{margin-right:6px}.yui3-overlay{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#fff;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.5);box-shadow:0 0 10px 0 rgba(0,0,0,0.5)}.yui3-overlay ul{padding:5px 0}.yui3-overlay li{float:none}.yui3-overlay li:last-child a{border-bottom:none}.yui3-overlay a{display:block;padding:6px 20px;color:#dd4814 !important;border-bottom:1px solid #e5e2e0}.yui3-overlay a:focus,.yui3-overlay a:hover{background-color:#f2f2f2}.yui3-overlay-hidden{display:none}.yui3-widget-mask{background-color:#000;opacity:0.3}.yui3-panel{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#FFF;padding:50px 80px 50px 80px;-webkit-box-shadow:0 0 15px 0 #000;box-shadow:0 0 15px 0 #000}.yui3-panel .yui3-button{float:right}.yui3-panel .yui3-button.link-button{float:left;padding-left:0;padding-right:0;color:#dd4814;border:none;background:none;-webkit-box-shadow:none;box-shadow:none;font-size:13px}.yui3-widget-hd{margin-bottom:30px;font-size:24px}.yui3-widget-ft{margin-top:50px}.yui3-widget-button-wrapper{width:100%}.icon{margin-left:5px;width:16px;height:16px;display:inline-block;text-indent:999em;background-repeat:no-repeat;background-size:16px 16px;vertical-align:middle}.icon.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.icon.edit{background-image:url("../img/icons/edit.png");background-image:url("../img/icons/edit.svg"),none}.icon.delete{background-image:url("../img/icons/delete.png");background-image:url("../img/icons/delete.svg"),none}.icon.remove{background-image:url("../img/icons/filter-remove.svg"),none}.icon.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.icon.debug{background-image:url("../img/icons/debug.png");background-image:url("../img/icons/debug.svg"),none}.icon.success,.icon.tick{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.icon.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}.icon.partition{background-image:url("../img/icons/partition.svg")}.icon.add{background-image:url("../img/icons/add.svg")}.icon.tags{background-image:url("../img/icons/tags.svg")}.icon.mount{background-image:url("../img/icons/mount.svg")}.icon.unmount{background-image:url("../img/icons/unmount.svg")}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.right{float:right !important}.left{float:left !important}.border{border-top:1px dotted #B2B2B2}.border.bottom{border-bottom:1px dotted #B2B2B2}.border.solid{border-style:solid}.vertical-align{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.margin-top{margin-top:20px}.margin-top--five{margin-top:5px}.margin-top--ten{margin-top:10px}.margin-right{margin-right:20px !important}.margin-right--ten{margin-right:10px !important}.margin-bottom{margin-bottom:20px}.margin-left{margin-left:20px !important}.margin-left--ten{margin-left:10px !important}.margin-left--thirty{margin-left:30px !important}.padding-top{padding-top:20px}.padding-top--ten{padding-top:10px !important}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px !important}.padding-bottom--ten{padding-bottom:10px !important}.padding-left{padding-left:20px !important}.padding-left--30,.padding-left--thirty{padding-left:30px !important}.padding-left--35{padding-left:35px !important}.padding-left--45{padding-left:45px !important}.padding-left--50{padding-left:50px !important}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-margin{margin:0}.no-margin-top{margin-top:0 !important}.no-padding{padding:0}.no-padding-top{padding-top:0 !important}.no-padding-left{padding-left:0}.no-padding-bottom{padding-bottom:0 !important}.no-margin-bottom{margin-bottom:0}.width--auto{width:auto}.width--half{width:50%}.width--full{width:100%}.tooltip{position:relative}.tooltip::before{content:attr(data-tooltip);font-size:13px;font-weight:400;position:absolute;z-index:999;white-space:nowrap;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);background:#333;color:#FFF;padding:10px;text-indent:0;opacity:0;transition:opacity 0.4s ease-out;border-radius:5px;box-shadow:0px 1px 3px 0 rgba(51,51,51,0.2);top:-9999em}.tooltip::after{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;z-index:1000;transition:opacity 0.4s ease-out;border-top:5px solid #333;opacity:0;top:-9999em}.tooltip:hover::before{opacity:1 !important;top:-47px}.tooltip:hover::after{opacity:1 !important;top:-10px}.link-cta-ubuntu.tooltip:hover::before,.cta-ubuntu.tooltip:hover::before{top:-50px}.footer-wrapper{border-top:1px dotted #b2b2b2}.footer-wrapper footer.global{background-color:transparent;padding-top:0px;padding-right:20px;padding-left:20px;background-image:url("../img/logos/logo-ubuntu-orange.png");background-image:url("../img/logos/logo-ubuntu-orange.svg"),none;background-size:107px 25px;background-position:top 20px right 20px;background-repeat:no-repeat;max-width:1480px}.footer-wrapper footer.global p{font-size:0.875em}.footer-wrapper footer.global a{margin:0 5px;color:#dd4814}.footer-wrapper footer.global .version{font-weight:500;margin-right:5px}.footer-wrapper footer.global .copy{margin-top:10px}.footer-wrapper footer.global .legal{max-width:1440px}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto -112px;position:relative;background:rgba(255,255,255,0.6);padding-top:172px}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../img/backgrounds/image-background-paper.png");height:100%;width:100%;z-index:-1}.inner-wrapper{max-width:1480px;padding:0px 20px;margin:0 auto;position:relative}.push,.footer-wrapper{height:112px}.row{background-color:transparent;border-bottom:1px dotted #CCC}.row:last-child{border-bottom:none}header.banner{overflow:visible;z-index:20;position:fixed;top:0}header.banner .logo{padding-left:15px}header.banner nav.nav-primary{border-bottom:none}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:100px 30px;-webkit-background-size:100px 30px;-o-background-size:100px 30px;background-size:100px 30px;background-position:5px 9px;background-image:url("../img/logos/logo.png");background-image:url("../img/logos/logo.svg"),none}header.banner .nav-primary li:hover ul:after{display:none}@media screen and (max-width: 768px){header.banner .nav-primary ul{border-right:none}}header.banner #right-nav{float:right;margin-right:20px}@media screen and (max-width: 768px){header.banner #right-nav{margin-right:0}}header.banner #user-link{position:relative}@media screen and (max-width: 768px){header.banner #user-link{border-top:1px solid #d4d7d4;width:100%}}header.banner #user-link>a{padding-bottom:12px}@media screen and (max-width: 768px){header.banner #user-link>a{display:none}}header.banner #user-link .normal,header.banner #user-link .hover{margin-right:7px}@media screen and (max-width: 768px){header.banner #user-link .normal,header.banner #user-link .hover{display:none}}header.banner #user-link .hover{display:none}header.banner #user-link .nav{-webkit-border-radius:0px 0px 4px 4px;-moz-border-radius:0px 0px 4px 4px;border-radius:0px 0px 4px 4px;background-color:#FFF;border:none;display:none;position:absolute;right:0;top:48px;box-shadow:0px 2px 4px rgba(0,0,0,0.15)}@media screen and (min-width: 769px){header.banner #user-link .nav a.active{background:none;border:none}}header.banner #user-link .nav a:hover{background-color:transparent}@media screen and (max-width: 768px){header.banner #user-link .nav a:hover{background-color:#F8F8F8;color:#333}}@media screen and (max-width: 768px){header.banner #user-link .nav{background:none;position:relative;top:inherit;width:100%;box-shadow:none;float:left;padding:0}header.banner #user-link .nav li{border-bottom:1px solid #d4d7d4;width:100%;float:left}header.banner #user-link .nav li a{padding:10px 14px;width:100%}}@media screen and (max-width: 768px){header.banner #user-link:hover>a{background-color:transparent}}header.banner #user-link:hover .normal{display:none}header.banner #user-link:hover .hover{display:inline-block}@media screen and (max-width: 768px){header.banner #user-link:hover .hover{display:none}}header.banner #user-link:hover .nav{display:block}header.banner .nav-toggle{background-image:url("../img/icons/navigation-menu-plain.png");background-image:url("../img/icons/navigation-menu-plain.svg"),none;top:0}@media screen and (max-width: 768px){header.banner .nav-toggles .open{display:block}header.banner .nav-toggles .close{display:none}header.banner #canonlist:target ul{display:block}header.banner #canonlist:target+.nav-toggles .open{display:none}header.banner #canonlist:target+.nav-toggles .close{display:block}}.page-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;float:left;position:fixed;z-index:10;top:48px}.page-header .page-header__nav{position:absolute;top:10px;z-index:1000}.page-header .page-header__nav a{font-weight:300}.page-header .page-header__title{font-size:2em;width:auto;padding:31px 0;margin:0;float:left;font-size:32px}.page-header .page-header__title [contenteditable="true"]{display:inline-block;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-10px 0 -10px -10px;border-radius:2px;color:#333;cursor:default;font-size:32px}.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#FFF;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#d90000}.page-header .page-header__title [contenteditable="true"] br{display:none}.page-header .page-header__title .icon{vertical-align:3px;margin-right:10px}.page-header .page-header__title .page-header__title--identicator{font-size:0.6em;width:auto;display:inline-block;position:relative;top:0px;padding-left:20px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator a{color:#888}.page-header .page-header__title .page-header__title--identicator a:hover{text-decoration:none;border-bottom:3px solid #888}.page-header .page-header__title .page-header__title--identicator a:focus,.page-header .page-header__title .page-header__title--identicator a:active{text-decoration:none}.page-header .page-header__title .page-header__title--identicator a.active{color:#333;border-bottom:3px solid #dd4814}.page-header .page-header__title .page-header__title--identicator a.active:hover{text-decoration:none;cursor:default}.page-header .page-header__title .page-header__title--identicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore{font-size:14px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore:hover{border:0;text-decoration:underline}.page-header .page-header__title .link-cta-ubuntu,.page-header .page-header__title .alt{font-size:16px;margin-left:20px;position:relative;vertical-align:middle;margin-top:-5px}.page-header .page-header__actions{float:right;padding:34px 0;margin-bottom:0}.page-header .page-header__actions .page-header__cta{float:right;position:relative;height:auto;max-height:36px}.page-header .page-header__actions .page-header__cta .cta-group{float:right}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback{display:inline-block;position:relative;line-height:36px;text-align:right;color:#dd4814;margin-right:20px;cursor:pointer}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback:hover{text-decoration:underline}.page-header .page-header__dropdown{float:left;width:100%;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;border-color:#888 !important}.page-header .page-header__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out;border-top:none}.page-header .page-header__dropdown .page-header__feedback{border-top:1px dotted #888;display:inline-block;width:100%;padding:20px 0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;background-position:top 3px left 0px;background-repeat:no-repeat;padding:6px 0 5px 25px;width:auto;display:inline-block;position:relative}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none;background-position:0px 9px}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info.progress,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error.progress{width:100%}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress{padding-left:0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress .loader{position:relative;top:1px}.title .title__indicator .title__link{color:#888;font-size:20px}.title .title__indicator .title__link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.title .title__indicator .title__link:focus,.title .title__indicator .title__link:active{text-decoration:none}.title .title__indicator .title__link.active{color:#333;border-bottom:1px #dd4814 solid}.title .title__indicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:7px;right:7px}form.page-title-form{margin-bottom:30px}form.page-title-form input{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid transparent;background-color:transparent;font-size:36px;line-height:26px;color:#333;margin:6px 10px;padding:4px;height:auto;box-shadow:none}form.page-title-form input:hover{outline:none;background:#FFF;border-color:#D2D2D2;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}form.page-title-form input:focus{border:1px solid #dd4814;background-color:#fff;outline:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}#loader{width:10px;margin:16px auto 0 auto}#importing{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;position:relative}#importing .spinner{position:absolute;left:15px}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.selector{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:20px;background:#FFF;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;width:100%;float:left}.selector h2{font-size:1em;font-weight:300}.selector h2 img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;background:url("../img/icons/help.svg") no-repeat;width:16px;height:16px;padding-left:16px;margin-left:5px}.selector .selector-available,.selector .selector-chosen{width:46%;float:left;margin:0;text-align:left}@media screen and (max-width: 768px){.selector .selector-available,.selector .selector-chosen{width:100%}}.selector .selector-available h2,.selector .selector-chosen h2{background:none;border:none}.selector .selector-available select,.selector .selector-chosen select{margin-bottom:10px}.selector ul.selector-chooser{width:8%;float:left;margin:20% 0 0}@media screen and (max-width: 768px){.selector ul.selector-chooser{width:100%;margin:0 0 10px;text-align:center}}.selector ul.selector-chooser li{width:100%;text-align:center}@media screen and (max-width: 768px){.selector ul.selector-chooser li{width:auto;display:inline-block;height:16px;width:16px;margin:0 20px}}.selector ul.selector-chooser li a{display:block;text-indent:999em;width:16px;height:16px;overflow:hidden;margin:0 auto}.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_right.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_down.svg")}}.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_left.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_up.svg")}}.selector .selector-filter img{display:none}.selector .selector-filter input{background-image:url("../img/search-orange.png");background-repeat:no-repeat;background-position:top 7px right 8px}.selector select#id_mac_addresses_to.filtered{height:269px !important}.nodes{position:relative}.nodes .search{position:absolute;right:0}.nodes .search input[type='submit']{position:absolute;top:8px;right:12px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0}.nodes .search input[type='submit']:hover{color:transparent;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat}@media screen and (max-width: 768px){.nodes .search{position:relative}}@media screen and (max-width: 768px){.nodes .actions select{width:100%;margin-bottom:20px}.nodes .actions input{position:absolute;right:0;top:0}}.powerstates{width:14px;height:15px;display:inline-block}.powerstates.power-on{background:transparent url("../img/icons/power-on.svg") left top no-repeat}.powerstates.power-off{background:transparent url("../img/icons/power-off.svg") left top no-repeat}.powerstates.power-unknown{background:none}.powerstates.power-error{background:transparent url("../img/icons/power-error.svg") left top no-repeat}.powerstates.power-check-ok{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#33CC00}.powerstates.power-check-error{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#FF0000}.node-actions .link-cta-ubuntu,.node-actions .cta-ubuntu{margin-bottom:10px;float:left;font-size:16px}.buttons{margin-top:30px}#network-interfaces li{list-style-type:none}#content-discovery-data{padding-top:20px;margin-top:20px;border-top:1px dotted #B2B2B2}#content-discovery-data .slider{height:0;overflow:hidden}.slider{padding-top:0 !important}.slider .content{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#FFF;border:1px solid #EEE;border-top:none;padding:20px}.slider .content pre{margin:0}.slider .tabs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;padding:8px 20px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;border:1px solid #EEE}.add-machine__list{padding:13px 0 20px;border-top:1px dotted #888;margin-bottom:0}.add-machine__list .add-machine__details{background:transparent url("../img/icons/accordion-open.svg") top 12px right 10px no-repeat}.add-machine__list .add-machine__details>div{margin-bottom:0}.add-machine__list .add-machine__details .add-machine__details-form{display:none}.add-machine__list .add-machine__details.active{background-image:url("../img/icons/accordion-close.svg")}.add-machine__list .add-machine__details.active .add-machine__details-form{display:block}.power-status{display:inline-block;font-size:100%;padding-left:0}.power-status--power{display:inline-block;margin-left:20px;position:relative;font-size:100%}.power-status--power.checking{color:#2AB7EC;background:url("../img/status_in_progress.svg");padding-left:20px}.power-status--power.on{padding-left:20px;color:#38B44A;background:transparent url("../img/icons/power-on.svg") left top 4px no-repeat}.power-status--power.off{padding-left:20px;color:#D2D2D2;background:transparent url("../img/icons/power-off.svg") left top 4px no-repeat}.power-status--power.error{padding-left:20px;color:#DB3832;background:transparent url("../img/icons/power-error.svg") left top 4px no-repeat}.power-status--power .power-check{font-size:0.75em;color:#D2D2D2;display:inline-block;padding:0}.power-status--power .power-check .power-check__link{color:#888;text-decoration:none;margin-left:5px}.power-status--power .power-check .power-check__link:hover{border-bottom:0 !important;text-decoration:underline !important}.loading,.loader{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0;display:inline-block}.details__used{color:#BCBCBC}.details .details__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.details .details__label a{color:#BCBCBC}.details .details__label a:hover{color:#dd4814}.details .details__label.active a{color:#dd4814}.details .details__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.details .details__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.details .table-row .details__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.details .table-row .details__text{line-height:37px}.details .table-row:hover .details__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.details .table-row:hover .details__controls{z-index:1;opacity:1}.details .table-row:hover .details__controls--secondary{z-index:1;opacity:1}.details .table-row.active:hover .details__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.details .table-row.active:hover .details__controls{opacity:0;z-index:-1000;pointer-events:none}.details .table-row.active:hover .details__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.details .table-row label{font-size:13px;color:#BCBCBC}.details .table-row input,.details .table-row select{margin:0 0 0 -14px}.details .table-row input[type="radio"]{margin-left:0}.details .details__dropdown .details__row{border-bottom:0;position:relative}.details .details__dropdown .details__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:relative;height:1px;content:''}.details .details__dropdown .details__row.details__row--head{border-bottom:0}.details .details__dropdown .details__row.details__row--head .table-cell{color:#BCBCBC;font-size:13px}.details .details__dropdown .details__row.no-border{border:0}.details .details__dropdown .details__row.no-border:before{border:0}.details .details__dropdown--info .table-row{border-bottom:0}.details .details__dropdown--info .table-cell{color:#BCBCBC} |
2289 | 3 | ======= | ||
2290 | 4 | .fake{display:none}body{font-size:14px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;clear:none;display:inline-block;float:none;margin-right:2.12766%;margin-bottom:20px;position:relative;width:100%}.twelve-col .one-col,.twelve-col .two-col,.twelve-col .three-col,.twelve-col .four-col,.twelve-col .five-col,.twelve-col .six-col,.twelve-col .seven-col,.twelve-col .eight-col,.twelve-col .nine-col,.twelve-col .ten-col,.twelve-col .eleven-col{width:100%}.last-col,.last{margin-right:0}.clearfix:after,.container:after{clear:both;content:"\0020";display:block;height:0;overflow:hidden;visibility:hidden}.clear{clear:both}.clearfix{display:block}@media only screen and (min-width: 768px){body{font-size:15px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col{width:48.8938%;margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}@media only screen and (min-width: 984px){body{font-size:16px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.three-col:nth-child(1):nth-last-child(4),.three-col:nth-child(2):nth-last-child(3),.three-col:nth-child(3):nth-last-child(2),.three-col:nth-child(4):nth-last-child(1){width:23.36%}.three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col:nth-child(1):nth-last-child(4),.twelve-col .three-col:nth-child(2):nth-last-child(3),.twelve-col .three-col:nth-child(3):nth-last-child(2),.twelve-col .three-col:nth-child(4):nth-last-child(1){width:23.3407%}.twelve-col .three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot");src:url("../fonts/ubuntu-l-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#ubuntulight") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:local("Ubuntu");src:url("../fonts/ubuntu-r-webfont.eot");src:url("../fonts/ubuntu-r-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#ubunturegular") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot");src:local("Ubuntu Medium"),local("Ubuntu-Medium"),url("../fonts/ubuntu-m-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#ubuntumedium") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot");src:local("Ubuntu Bold"),local("Ubuntu-Bold"),url("../fonts/ubuntu-b-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#ubuntubold") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot");src:local("Ubuntu Light Italic"),local("Ubuntu-LightItalic"),url("../fonts/ubuntu-li-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#ubuntulight_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:local("Ubuntu Italic"),local("Ubuntu-Italic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot");src:local("Ubuntu Medium Italic"),local("Ubuntu-MediumItalic"),url("../fonts/ubuntu-mi-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#ubuntumedium_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:local("Ubuntu Bold Italic"),local("Ubuntu-BoldItalic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}html{font-size:100%}body{color:#333;font-family:Ubuntu, Arial, "libra sans", sans-serif;font-weight:300}blockquote,q{quotes:none}blockquote{margin:28px 20px}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}legend{border:0;*margin-left:-7px}figure{margin:0}abbr,acronym{cursor:help}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a:link,a:visited{color:#dd4814;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}a.link-arrow:after{content:"\0000a0›"}nav ul li h2 a:after{content:"\0000a0›"}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:""}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img.left{margin-right:20px}img.right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}h1,h2,h3,h4,h5,h6{font-weight:300;line-height:1.3}h1{font-size:1.625em;margin-bottom:.5em}h2{font-size:1.438em;margin-bottom:.5em}h3{font-size:1.219em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.723em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}h2 span,h1 span{display:block}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:0.78261em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.39286em}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}li{margin-bottom:.4em}li:last-of-type{margin-bottom:0}ins{background:#fffbeb;text-decoration:none}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}dfn{font-style:italic}mark{background:#ff0;color:#000}code,pre{font-family:"Ubuntu Mono", "Consolas", "Monaco", "Lucida Console", "Courier New", Courier, monospace}pre{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdf6f2;padding:0.6em 1em;white-space:pre-wrap;word-wrap:break-word}blockquote{margin:0}blockquote>p{font-size:0.92857em;margin-bottom:0.92308em;font-weight:100;margin:0 0 0.4em 0}blockquote small{font-size:.813em;line-height:1.4}button,input,select,textarea{font-family:Ubuntu,Arial,"libra sans",sans-serif;margin:0;vertical-align:baseline;*vertical-align:middle}select{font-size:1em;font-weight:300}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-box-sizing:content-box;-webkit-appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-weight:300;outline:none;padding:0.69565em 0.86957em}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}form fieldset{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-repeat:no-repeat;background-color:#EFEEEC;background-position:-15px -15px;border:0;margin-bottom:8px;padding:15px 20px}form fieldset h3{border-bottom:1px dotted #dfdcd9;margin-bottom:9px;padding-bottom:10px}form fieldset li:first-child{margin-top:0}form input[type="text"],form input[type="email"],form input[type="tel"],form textarea{-webkit-appearance:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;border:1px solid #999;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0.69565em 0.86957em}form input:focus,form textarea:focus{border:1px solid #dd4814}form textarea[readonly='readonly']{color:#999}form input[type="checkbox"],form input[type="radio"]{margin:0;width:auto}form input[type="checkbox"]+label,form input[type="radio"]+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}form input[type="submit"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#dd4814;background-image:-moz-linear-gradient(#f26120, #dd4814);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#f26120), to(#dd4814));background-image:-webkit-linear-gradient(#f26120, #dd4814);background-image:-o-linear-gradient(#f26120, #dd4814);-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border:0;color:#fff;display:block;padding:10px 14px;text-shadow:none;width:auto;margin-bottom:0}form input[type="submit"]:hover{background:#dd4814}form label{cursor:pointer;display:block;margin-bottom:4px}form label span{color:#df382c}form ul{margin-left:0}form li{list-style:none outside none;margin-top:14px}form button[type="submit"]{border:0;display:inline-block;font-family:Ubuntu, Arial, "libra sans", sans-serif;text-decoration:none;font-weight:300}form input[type="reset"]{display:none}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.85714em 0;width:100%}table th,table td{padding:15px 10px;background:#f0edea;border:1px dotted #888888}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333333;font-weight:normal}table tbody th{text-align:left;font-weight:normal;font-weight:300}table th[scope="col"]{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}@media only screen and (min-width: 984px){form fieldset{padding:15px 20px}img{max-width:none}}.audience-consumer{color:#333333}.audience-consumer .row-box,.audience-consumer .main-content{color:#333333}.audience-consumer .inner-wrapper{background:#fff}.audience-consumer .quote-right-top{padding:60px 60px 0 40px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat;height:287px;position:absolute;right:-40px;text-align:left;top:-90px;width:31.91489%}.audience-consumer .quote-right-top p{font-size:1.14286em;margin-bottom:0.75em;margin:0.769em;padding-bottom:0;color:#fff}.audience-consumer .quote-right-top p cite{font-size:0.85714em;margin-bottom:1em;color:#fff;padding:0}.audience-consumer .quote-right-top p a,.audience-consumer .quote-right p a{color:#fff}.audience-consumer .quote-right{font-size:1.28571em;margin-bottom:0.66667em;color:#fff;padding:50px 100px 0 50px;text-indent:-6px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;min-height:287px;position:absolute;right:-20px;text-align:left;top:-90px;width:21.2006% em}.audience-consumer .quote-right cite{font-style:normal;margin-left:6px}.audience-consumer .quote-right-alt{background:url(/sites/ubuntu/latest/u/img/patterns/quote-white-br-360x360.png) 0 -100px no-repeat;color:#dd4814;padding:50px 50px 0 50px}.audience-consumer .quote-right-right{background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat}.audience-enterprise h1{margin:0 0 18px 0}.audience-enterprise td{background:#fff}.audience-enterprise th,.audience-enterprise td{padding:6px 10px;background:#fff}.audience-enterprise th[scope="col"]{background:#E2D4DC;color:#772953}.audience-enterprise tbody th[rowspan]{background:#F7F2F6}.audience-enterprise tfoot th[rowspan]{background:#dfdcd9}.audience-enterprise tfoot td,.audience-enterprise tfoot th{font-weight:normal;background:#dfdcd9}.audience-enterprise .inner-wrapper{background:#2c001e;color:#fff}.audience-enterprise .row-box{background:#fff;color:#333333}.row-enterprise{background:#772953;color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-enterprise .box,.row-enterprise div{background:#772953;color:#fff}.row-enterprise a{color:#fff}.enterprise-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/enterprise-dot-pattern.png")}.developer-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/developer-dot-pattern.png")}.wrapper,header.banner .nav-primary,nav div.footer-a div,.inline-lists ul,.legal{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:auto}.inner-wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;clear:both;display:block;float:left;width:100%;margin:0;padding-bottom:20px;position:relative;z-index:1}@media only screen and (min-width: 768px){.med-six-col .three-col{width:48%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}@media only screen and (min-width: 769px){.inner-wrapper{border-radius:4px;padding-bottom:20px}}@media only screen and (min-width: 984px){.wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin:0 auto;position:relative;text-align:left;width:984px}.inner-wrapper{-moz-box-shadow:0 0 3px #c9c9c9;-webkit-box-shadow:0 0 3px #c9c9c9;box-shadow:0 0 3px #c9c9c9;margin:10px 0 30px}.three-col,.med-six-col .three-col{width:23.30%}.three-col.last-col:nth-of-type(2n){margin-right:0}.med-six-col .three-col:nth-of-type(2n){margin-right:20px}.med-six-col .three-col.last-col{margin-right:0}}.left{float:left}.right{float:right}.caps{text-transform:uppercase}img{border:0 none;height:auto;max-width:100%}img.left{margin-right:0}img.touch-border{margin-bottom:-3px}.accessibility-aid,.off-left{position:absolute;left:-999em}a.external{-moz-background-size:0.7em 0.7em;-webkit-background-size:0.7em 0.7em;-o-background-size:0.7em 0.7em;background-size:0.7em 0.7em;padding-right:.9em;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.svg");background-position:right 1px;background-repeat:no-repeat}.opera-mini a.external,.no-svg a.external{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.png")}.text-center,.align-center{text-align:center}.no-margin{margin:0}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-left-20{margin-left:-20px}.pull-right-20{margin-right:-20px}.pull-left-40{margin-left:-40px}.pull-right-40{margin-right:-41px}.no-border{border:0}.link-top{font-size:1em;margin-bottom:0.85714em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-17px;padding:5px;float:right}.pull-bottom-right{position:absolute;right:0;bottom:0;left:auto}.box .pull-bottom-right{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}.pull-bottom-left{margin-left:-20px;margin-bottom:-21px}.pull-top-right{margin-left:-20px;margin-top:-21px}div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:absolute;left:-999em}.priority-0,.not-for-small{position:absolute;left:-999em}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+h3,.video-container+.video-title{margin-top:20px}@media only screen and (max-width: 768px){.pull-right-40{margin-right:-30px}.pull-bottom-right,.pull-bottom-left{position:static}img.pull-bottom-left{margin-bottom:0;margin-left:0}}@media only screen and (min-width: 768px){div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:relative;left:auto}.priority-0,.not-for-small{position:relative;left:auto}.for-mobile,.for-small{position:absolute;left:-999em}.pull-right{float:right;margin-right:-30px}img.pull-left{margin-left:-30px}img.touch-border{float:left;margin-bottom:-30px}}@media only screen and (min-width: 769px){img.left{margin-right:20px}}@media only screen and (min-width: 984px){img.touch-border{float:left;margin-bottom:-40px}img.pull-left{margin-left:-40px}.pull-right{float:right;margin-right:-40px}.for-tablet,.for-medium{display:none}.no-border{border:0}}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}p.intro{font-size:1.14286em;margin-bottom:0.75em;line-height:1.4}.row div p:last-child,.row div ul:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888888;font-size:.813em}@media only screen and (min-width: 768px){p.intro{font-size:1.13333em}}@media only screen and (min-width: 984px){h1{font-size:2.8125em}h2{font-size:2em;margin-bottom:.375em}h3{font-size:1.438em;margin-bottom:.522em}h4{font-size:1em;margin-bottom:.75em}h5{font-size:1em}p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}p.intro{font-size:1.25em}}header.banner{border-top:0;min-width:100%;width:auto;background:#dd4814;display:block;position:relative;z-index:2}header.banner .nav-primary{border:0;margin:0 auto;overflow:hidden}header.banner .nav-primary ul{border-right:1px solid #ed6637;float:left;margin:0;position:relative}header.banner .nav-primary ul li{border-left:1px solid #c64012;float:left;list-style-image:none;margin:0;text-indent:0;vertical-align:bottom}header.banner .nav-primary ul li:last-child{border-right:1px solid #c64012}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited{font-size:14px;border-left:1px solid #ec5b29;color:#fff;display:block;margin-bottom:0;padding:14px 14px 13px;position:relative;text-align:center;text-decoration:none;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased}header.banner .nav-primary ul a.active{background:#B83A10;border-left:1px solid #ec5b29}header.banner .nav-primary ul li a:hover{background:#e1662f;border-top:0;-moz-box-shadow:inset 0 2px 2px -2px #777;-webkit-box-shadow:inset 0 2px 2px -2px #777;box-shadow:inset 0 2px 2px -2px #777}#main-navigation-link{display:none}header.banner .nav-toggle{position:absolute;right:0;display:block;width:48px;height:48px;text-indent:-99999px;background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg);-moz-background-size:25px auto;-webkit-background-size:25px auto;-o-background-size:25px auto;background-size:25px auto;background-repeat:no-repeat;background-position:center center;cursor:pointer}header.banner .no-script{display:none}.opera-mini header.banner .nav-toggle,.no-svg header.banner .nav-toggle{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png)}header.banner nav ul{background-color:#f0f0f0;display:none;float:left}header.banner .nav-primary.active{-moz-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);padding:0;border-bottom:1px solid #d4d7d4}header nav ul.active{display:block}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{display:block;padding:0;margin:0;border:none}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:#d0d0d0}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner .nav-primary ul li{border-bottom:1px solid #F2F2F4;font-size:16px}header.banner .nav-primary ul li:last-child{border:0}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:14px 14px 13px;text-align:left}header.banner nav.nav-primary ul.active li ul{display:none}#menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.svg);background-repeat:no-repeat;background-position:50% 26px;content:"";display:block;height:23px;margin-left:0;padding-bottom:17px;position:relative;top:-3px;width:48px;z-index:999}html.no-svg #menu.active:after,.opera-mini #menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.png)}.nav-secondary{border-bottom:1px solid #dfdcd9;margin-bottom:0}.nav-secondary ul{float:left;margin-bottom:10px;margin-left:2px}.nav-secondary ul li{float:left;margin-top:16px;font-size:14px;margin-right:15px}.nav-secondary ul li a:link,.nav-secondary ul li a:visited{color:#333;font-size:14px;float:left}.nav-secondary ul li a:hover,.nav-secondary ul li a:active{color:#dd4814;text-decoration:none}.nav-secondary ul li,.nav-secondary ul li.active a:link,.nav-secondary ul li.active a:visited{color:#dd4814;text-decoration:none}.nav-secondary ul.breadcrumb{margin-left:20px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{color:#888888;margin-right:8px}.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#dd4814}header.banner h2{font-size:1.78571em;margin-bottom:0.48em;display:block;left:4px;margin-bottom:0;position:relative;text-transform:lowercase;top:14px}header.banner h2 a:link,header.banner h2 a:visited,header.banner a{color:#fff;float:left;text-decoration:none}header.banner .logo{border-left:0;float:left;height:48px;overflow:hidden}header.banner .logo-ubuntu{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/ubuntu-logo.png") no-repeat scroll 0 10px transparent;font-size:18px;margin-bottom:0;position:relative;text-transform:lowercase;float:left;margin:0;display:inline-block;height:32px;min-width:128px;margin-right:-20px;margin-left:10px;padding:7px 14px 9px 0}header.banner .logo-ubuntu img{margin-right:8px;position:absolute;left:-999em}header.banner .logo-ubuntu span{float:left;font-size:23px;font-weight:300;padding-left:122px;padding-right:20px;position:relative;top:5px}header.banner .nav-primary.nav-left .logo-ubuntu{float:right}header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.svg");background-size:107px 25px;float:left}html.no-svg header.banner .nav-primary.nav-right .logo-ubuntu,.opera-mini header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.png")}@media only screen and (max-width: 295px){header.banner .nav-primary.nav-right .logo-ubuntu,header.banner .logo-ubuntu{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.svg") 0 50% no-repeat;min-width:0;width:38px}header.banner .logo-ubuntu span{padding-left:38px}}html.no-svg header.banner .logo-ubuntu,.opera-mini header.banner .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.png")}@media only screen and (max-width: 768px){header.banner .nav-primary{-moz-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);box-shadow:0 1px 2px 1px rgba(0,0,0,0.2)}header.banner .nav-primary.active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;padding:0}header nav ul.active{float:left}header nav ul.active li:last-child a:link,header nav ul.active li:last-child a:visited{border-bottom:0}header.banner .nav-primary ul{position:relative;width:100%}header.banner .nav-primary ul li.active a:link,header.banner .nav-primary ul li.active a:visited{color:#333;font-weight:700}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;display:block;font-weight:300;margin:0;padding:0;width:100%}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{background-color:#f0f0f0;border-bottom:1px solid #d4d7d4;color:#333333;font-size:1em}header.banner .nav-primary ul li:nth-last-child(-n+2) a:link,header.banner .nav-primary ul li:nth-last-child(-n+2) a:visited{border:0}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:#f8f8f8}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:8px 10px;text-align:left}header.banner .nav-primary ul li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border-bottom:0;border-right:1px solid #d4d7d4;float:left;width:50%}.nav-secondary{background:#fff}.nav-secondary ul.second-level-nav{border-top:1px solid #d4d7d4;display:none;margin-bottom:0;margin-left:0;padding-bottom:10px;padding-top:10px;width:100%}.nav-secondary ul.second-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left}.nav-secondary ul.second-level-nav li a,.nav-secondary ul.second-level-nav li a:link,.nav-secondary ul.second-level-nav li a:visited{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;height:100%;padding:10px 10px 10px 20px;width:100%}.nav-secondary ul.second-level-nav li.active a,.nav-secondary ul.second-level-nav li.active a:link,.nav-secondary ul.second-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav{display:none;margin-bottom:0;width:100%;padding-bottom:20px}.nav-secondary ul.third-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left;padding-left:30px}.nav-secondary ul.third-level-nav li a,.nav-secondary ul.third-level-nav li a:link,.nav-secondary ul.third-level-nav li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px 10px 10px 0;display:block;width:100%;height:100%}.nav-secondary ul.third-level-nav li.active a,.nav-secondary ul.third-level-nav li.active a:link,.nav-secondary ul.third-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav li.single-link{width:100%}.nav-secondary ul.third-level-nav li:only-child{width:100%}.nav-secondary ul.breadcrumb{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:0;margin-bottom:0}.nav-secondary ul.breadcrumb li:first-of-type{border-bottom:1px solid #d4d7d4;margin-bottom:-1px}.nav-secondary ul.breadcrumb li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#fff;width:100%;display:block;height:40px;margin:0}.nav-secondary ul.breadcrumb li a,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;width:100%;color:#333333;display:block;margin-right:0;text-decoration:none;padding:8px 10px 0 10px}.nav-secondary ul.breadcrumb li.active{margin-top:12px}.nav-secondary ul.breadcrumb li.active a,.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.breadcrumb li:nth-of-type(2n){margin-top:12px}.nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.svg);background-position:center center;background-repeat:no-repeat;background-size:18px;float:right;height:18px;margin-right:-5px;margin-top:-6px;padding:10px;position:relative;right:0;top:0;width:18px}.nav-secondary ul.breadcrumb li+li{display:none}.nav-secondary ul.breadcrumb li+li a:link,.nav-secondary ul.breadcrumb li+li a:active,.nav-secondary ul.breadcrumb li+li a:visited{padding-left:20px}.nav-secondary ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li a:after,.nav-secondary.open ul.breadcrumb li a:link:after,.nav-secondary.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg)}.nav-secondary.open ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg);margin-top:-7px}.nav-secondary.open ul.second-level-nav,.nav-secondary.open ul.third-level-nav,.nav-secondary.open ul.breadcrumb li+li{display:block}.no-js .nav-secondary ul.second-level-nav{display:block}.no-js #main-navigation-link{position:absolute;right:10px;top:12px;width:20px;height:28px;z-index:999;text-indent:-999em;display:block}.no-js #main-navigation-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;display:block;width:28px;height:28px;position:absolute}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}html.no-svg header.banner .nav-toggle,.opera-mini header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png")}}@media only screen and (min-width: 768px){header.banner .nav-primary ul li{border-bottom:0}}@media only screen and (min-width: 769px){header.banner{-moz-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;-webkit-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF}header.banner nav.nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border-bottom:0}header.banner .nav-toggle{display:none}header.banner nav ul{background-color:transparent;display:block}header.banner .nav-primary ul li{border-left:1px solid #C64012}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:1px solid #EC5B29}header.banner .nav-primary ul li:last-child{border-right:1px solid #C64012;border-left:1px solid #C64012}header.banner .nav-primary ul li a.active{background-color:#B83A10}header.banner .nav-primary ul li a:hover{background-color:#E1662F}.nav-secondary ul:last-child li:last-child{padding-bottom:10px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.second-level-nav li,.nav-secondary ul.third-level-nav li{margin-right:15px}.nav-secondary ul.breadcrumb{float:left}.nav-secondary ul.breadcrumb li{margin-bottom:10px}.nav-secondary ul{float:none;margin-bottom:0}.nav-secondary ul li{margin-bottom:5px}}@media only screen and (min-width: 984px){header.banner{margin-bottom:20px}header.banner nav.nav-primary ul{display:block}header.banner .nav-primary,#nav-global .nav-global-wrapper{width:984px}header.banner .nav-primary.nav-right .logo-ubuntu{margin-left:0}}header.banner .nav-primary ul{position:static}header.banner .nav-primary li ul{-moz-box-shadow:0 2px 2px -1px #777777;-webkit-box-shadow:0 2px 2px -1px #777777;box-shadow:0 2px 2px -1px #777777;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:#f7f7f7;border:1px solid #d5d5d5;display:none;float:none;margin:0;padding:5px 0;position:absolute;top:51px;width:200px}header.banner .nav-primary li:hover ul:after{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up-smaller.png") no-repeat;content:'';display:block;height:8px;left:20px;position:relative;top:-13px;width:200px;z-index:999}.no-generatedcontent header.banner .nav-primary li ul{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;top:48px}header.banner .nav-primary li ul .arrow-up{display:none}header.banner .nav-primary li ul li{border:0;float:none}header.banner .nav-primary li ul li a:link,header.banner .nav-primary li ul li a:visited{border:0;color:#333333;padding:0 0 11px 14px;text-align:left;width:170px}header.banner .nav-primary li ul li a:hover{background:none repeat scroll 0 0 transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#DD4814}header.banner .nav-primary li ul li.first a:link,header.banner .nav-primary li ul li.first a:visited,header.banner .nav-primary li ul li:first-of-type a:link{padding:10px 14px}header.banner .nav-primary li ul li.active a:link,header.banner .nav-primary li ul li.active a:visited{background:none repeat scroll 0 0 transparent !important}header.banner .nav-primary li ul .promo{border-top:1px solid #D5D5D5;float:left;margin-top:5px;padding:15px 0 0}header.banner .nav-primary li ul .promo a:link,header.banner .nav-primary li ul .promo a:visited{background:none repeat scroll 0 0 transparent;border-left:0 none;color:#333333;height:auto;padding:0;text-align:left}header.banner .nav-primary li ul .promo p{margin:0 10px}header.banner .nav-primary li ul .promo a:hover{box-shadow:none;color:#DD4814}header.banner .nav-primary li ul .promo img{margin-top:14px;margin-bottom:-6px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;position:relative;top:1px}header.banner .nav-primary li ul .promo .category{color:#888888;font-size:11px;margin:0 10px;text-transform:uppercase}header.banner .nav-primary li:hover ul{display:block}html.lt-ie8 header.banner .nav-primary li:hover ul{display:none}.header-search,#box-search{padding:7px 0 7px 14px;overflow:hidden}.header-search input[type="search"],.header-search input[type="text"],#box-search input[type="search"],#box-search input[type="text"]{-webkit-appearance:none;-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;background-color:#be3d00;border:none;color:#fff;display:block;float:left;font-size:16px;height:2.1em;margin-bottom:0;padding:0.5em 2.5em 0.5em 0.5em;width:100%}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-moz-placeholder,#box-search ::-moz-placeholder{color:white;opacity:0.4}.header-search :-ms-input-placeholder,#box-search :-ms-input-placeholder{color:white;opacity:0.4}.header-search input:-moz-placeholder,#box-search input:-moz-placeholder{color:white;opacity:0.4}.header-search ::placeholder,#box-search ::placeholder{color:white;opacity:0.4}.header-search input[type="search"]:focus,#box-search input[type="search"]:focus{background-color:#a63603}.header-search button[type=submit],#box-search button[type=submit]{padding:3px 2px;line-height:0;float:left;margin-left:-40px;display:block;background:none;overflow:visible}.header-search button[type=submit]:hover,#box-search button[type=submit]:hover{background:none}.header-search button[type=submit] img,#box-search button[type=submit] img{height:28px;width:28px}header.banner .search-toggle{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search_icon_white_64.png");background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search.svg");background-position:center center;background-repeat:no-repeat;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:58px;text-indent:-999em;top:0;width:24px}.search-toggle:link,.search-toggle:active{outline:none}#box-search,.header-search{background:#f0f0f0;border:0;display:none;float:left;margin-bottom:0;position:relative;margin:0 0 -1px 0;padding:0;width:100%;z-index:3}#box-search.active,.header-search.active,.header-search.open{display:block}#box-search div,.header-search div{-moz-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#f0f0f0;margin:10px;position:relative;z-index:1}#box-search form input[type="search"],.header-search form input[type="search"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;border:0;color:#333;font-size:16px;height:auto;margin:0;float:left;padding:9px 10px;width:100%}.yes-js .header-inner #box-search,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner #box-search form,.yes-js .header-inner .header-search form{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;margin-right:0;overflow:hidden;padding:10px;top:0;z-index:999;position:relative;width:100%}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}html.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.png")}}@media only screen and (min-width: 768px){header.banner .search-toggle{display:none}}@media only screen and (min-width: 960px){#box-search,.header-search{background:none;overflow:hidden;padding:7px 0 7px 14px;border-right:0 none;float:right;margin-bottom:0;padding-bottom:5px;padding-right:0;padding-top:7px;max-width:220px}#box-search form input[type="text"],#box-search form input[type="search"],.header-search form input[type="text"],.header-search form input[type="search"]{-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-search.png") no-repeat scroll 5px center,none repeat scroll 0 0 #BE3D00;border:6px solid #DE6532;border-width:0 0 1px;color:#fff;font-size:0.813em;height:24px;margin-bottom:0;padding:4px 4px 4px 30px;transition:all 0.5s ease 0s;width:86px}}@media only screen and (max-width: 960px){header.banner nav.nav-primary .header-search{padding:0;position:relative;top:0;width:100%}header.banner nav.nav-primary .header-search input[type="search"]{border-radius:0;background:#f7f7f7;color:#333}header.banner nav.nav-primary .header-search button[type="submit"]{width:32px;height:38px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.svg") no-repeat scroll center center transparent;background-size:28px 28px}header.banner nav.nav-primary .header-search button[type="submit"] img{max-width:none;display:none}header.banner nav.nav-primary .header-search.open{display:block}header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;right:0;display:block;height:48px;position:absolute;text-indent:-99999px;width:48px}html.no-svg header.banner .search-toggle,.opera-mini header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/img/search-white.png")}.opera-mini x:-o-prefocus,.opera-mini header.banner .search-toggle{-o-background-size:25px auto;background-size:25px auto}}@media only screen and (min-width: 984px){#box-search,.header-search{display:block;margin-right:0}#box-search form input[type="text"]:focus,.header-search form input[type="text"]:focus{width:160px}}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}}body.ubuntu-search .nav-secondary,body.search-results .nav-secondary,body.search-no-results .nav-secondary{display:none}body.ubuntu-search section>h1,body.ubuntu-search section article h1,body.search-results section>h1,body.search-results section article h1,body.search-no-results section>h1,body.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}body.ubuntu-search section>h1,body.search-results section>h1,body.search-no-results section>h1{border-bottom:1px dotted #dfdcd9}body.ubuntu-search .main-search,body.search-results .main-search,body.search-no-results .main-search{padding:20px 0;margin:0 0 20px 0;background-color:transparent}body.ubuntu-search .main-search input[type="search"],body.search-results .main-search input[type="search"],body.search-no-results .main-search input[type="search"]{float:left;width:100%;font-size:2em;border:1px solid #999;-moz-box-sizing:border-box;box-sizing:border-box;padding:0.2em 65px 0.2em 0.2em}body.ubuntu-search .main-search button[type=submit],body.search-results .main-search button[type=submit],body.search-no-results .main-search button[type=submit]{padding:4px;line-height:0;float:left;margin-left:-53px;display:block;background:none;overflow:visible;width:auto;margin-top:-4px}body.ubuntu-search .main-search button[type=submit]:hover,body.search-results .main-search button[type=submit]:hover,body.search-no-results .main-search button[type=submit]:hover{background:none}body.ubuntu-search .main-search button[type=submit] img,body.search-results .main-search button[type=submit] img,body.search-no-results .main-search button[type=submit] img{height:45px;width:45px}body.ubuntu-search .search-result h1 .title-main,body.search-results .search-result h1 .title-main,body.search-no-results .search-result h1 .title-main{margin-right:20px}body.ubuntu-search .search-result h1 .result-url,body.search-results .search-result h1 .result-url,body.search-no-results .search-result h1 .result-url{color:#999;overflow:hidden;text-overflow:ellipsis;display:block;vertical-align:bottom;padding-bottom:2px}body.ubuntu-search .search-result h1 .result-url a,body.search-results .search-result h1 .result-url a,body.search-no-results .search-result h1 .result-url a{color:#999}body.ubuntu-search .search-result p,body.search-results .search-result p,body.search-no-results .search-result p{margin-bottom:0}body.ubuntu-search .num-results,body.search-results .num-results,body.search-no-results .num-results{display:inline-block;margin-left:20px}body.ubuntu-search .bottom-results-total,body.search-results .bottom-results-total,body.search-no-results .bottom-results-total{text-align:center;width:100%;overflow:visible;padding-top:20px;margin:0}body.ubuntu-search .bottom-nav,body.search-results .bottom-nav,body.search-no-results .bottom-nav{overflow:hidden;margin-top:-26px}body.ubuntu-search .bottom-nav ul,body.search-results .bottom-nav ul,body.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;padding:0;overflow:hidden}body.ubuntu-search .bottom-nav li,body.search-results .bottom-nav li,body.search-no-results .bottom-nav li{float:left;margin-left:15px}body.ubuntu-search .bottom-nav li:first-child,body.search-results .bottom-nav li:first-child,body.search-no-results .bottom-nav li:first-child{margin-left:0}body.ubuntu-search .nav-back,body.search-results .nav-back,body.search-no-results .nav-back{float:left}body.ubuntu-search .nav-back li:before,body.search-results .nav-back li:before,body.search-no-results .nav-back li:before{content:"\2039";color:#dd4814;margin-right:5px}body.ubuntu-search .nav-back li.item-extreme:before,body.search-results .nav-back li.item-extreme:before,body.search-no-results .nav-back li.item-extreme:before{content:"\2039\2039"}body.ubuntu-search .nav-forward,body.search-results .nav-forward,body.search-no-results .nav-forward{float:right}body.ubuntu-search .nav-forward li:after,body.search-results .nav-forward li:after,body.search-no-results .nav-forward li:after{content:"\203A";color:#dd4814;margin-left:5px}body.ubuntu-search .nav-forward li.item-extreme:after,body.search-results .nav-forward li.item-extreme:after,body.search-no-results .nav-forward li.item-extreme:after{content:"\203A\203A"}body.ubuntu-search .error-notification,body.search-results .error-notification,body.search-no-results .error-notification{background-color:#fdffdc;color:#333;padding:20px;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:20px;display:block}body.ubuntu-search .result-line,body.search-results .result-line,body.search-no-results .result-line{color:#ada69e}body.ubuntu-search .results-top,body.search-results .results-top,body.search-no-results .results-top{border-bottom:1px dotted #dfdcd9;padding-bottom:0.5em}body.ubuntu-search .search-container,body.search-results .search-container,body.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 768px){.ubuntu-search .main-search button[type=submit]{margin-left:-60px;margin-top:0}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 2px 2px -1px #d3d3d3;-webkit-box-shadow:inset 0 2px 2px -1px #d3d3d3;box-shadow:inset 0 2px 2px -1px #d3d3d3;background:none;border-top:0;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{margin:0 auto;width:100%}footer.global .legal{background-image:none;position:relative;clear:both;min-height:40px}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:0.75em;line-height:1.4;margin-bottom:0;padding-bottom:0.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333333;font-weight:normal}footer.global nav ul li h2 a:after{content:""}footer.global ul{margin:0}footer.global nav ul li.two-col{display:inline-block;min-height:10em;vertical-align:top}footer.global nav ul li li{font-size:0.85714em;margin-bottom:1em;font-size:0.75em;margin-bottom:0}footer.global ul li li a:link,footer.global ul li li a:visited{color:#333333;margin-bottom:0}footer.global ul li li a:hover,footer.global ul li li a:active,footer.global h2 a:hover,footer.global h2 a:active{color:#dd4814}footer.global .inline li{display:inline}footer.global p,footer.global ul.inline li a{color:#333333;font-size:12px;margin-bottom:0}footer.global ul.inline li a:hover{color:#dd4814}footer.global ul.inline li:after{color:#888888;content:"\00b7";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:120px}footer.global ul.inline li:last-child:after{content:""}footer.global .inline li{float:none;margin-bottom:0}footer.global .top-link{-moz-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;background:none repeat scroll 0 0 transparent;border:0 none;float:left;font-size:0.75em;letter-spacing:0.05em;margin:0 0 0 -10px;padding-right:20px;text-transform:uppercase;width:100%}footer.global .top-link a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.svg");background-position:10px center;background-repeat:no-repeat;background-size:14px 14px;border-bottom:0 none;color:#888888;display:block;float:none;font-weight:400;padding:12px 0 12px 28px}html.no-svg footer.global .top-link a,.opera-mini footer.global .top-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.png")}@media only screen and (max-width: 768px){footer.no-global .legal{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;box-shadow:0 2px 2px -1px #D3D3D3 inset;padding-top:10px;margin-left:-10px;padding-left:10px;padding-right:10px}#livechat-eye-catcher{display:block}}@media only screen and (min-width: 768px){footer.global .inline li{display:inline;float:left}}@media only screen and (min-width: 769px){footer.global .top-link{display:none}footer.global .footer-b h2 a i{font-style:normal;display:inline}}@media only screen and (min-width: 984px){footer.global .legal{width:984px}footer.global{padding:30px 0 20px}footer.global .legal{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png") 100% 0 no-repeat}footer.global .footer-a{display:block}}#context-footer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1em;margin-bottom:0.85714em;border-bottom:0;clear:both;padding-bottom:1px;padding-top:0;position:relative;margin-bottom:0;margin-left:0;margin-right:0;width:100%}#context-footer hr{-moz-box-shadow:inset 0 2px 2px -2px #333;-webkit-box-shadow:inset 0 2px 2px -2px #333;box-shadow:inset 0 2px 2px -2px #333;background:#dd4814;height:14px;margin:0 0 10px;border:0;clear:both}#context-footer div.twelve-col{display:table;float:none;margin-bottom:7px}#context-footer div div{display:block;padding-left:0;margin-bottom:20px}#context-footer div div div{display:block;padding-left:0;margin-bottom:0}#context-footer div div.feature-one{padding-left:0}#context-footer div div.feature-four{margin-bottom:0;margin-right:0}#context-footer>div{padding-left:10px;padding-right:10px}#context-footer ul{margin-bottom:5px}#context-footer li.active{display:none}#context-footer h3{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}#context-footer .list a:after,#context-footer a.link-arrow:after,#context-footer nav ul li h2 a:after{content:' \203A'}@media only screen and (min-width: 768px){#context-footer{margin-bottom:12px;padding-left:30px;padding-right:30px}#context-footer div+div{width:31%}#context-footer div div.feature-four{padding-bottom:20px}#context-footer hr{margin:0 -30px 40px}#context-footer>div{padding-left:0;padding-right:0}}@media only screen and (min-width: 984px){#context-footer{padding:0 40px 10px}#context-footer div div{display:table-cell;float:none;padding-left:20px;margin-bottom:0}#context-footer hr{margin:0 -40px 40px}}a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#dd4814;color:#fff;text-decoration:none;display:inline-block;margin:0;font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased;padding:8px 14px;width:100%;text-align:center}a.cta-large,button.cta-large{font-size:1.28571em;margin-bottom:0.66667em;padding:10px 20px}a.link-cta-canonical,button.cta-canonical,form button.cta-canonical[type="submit"],form input.cta-canonical[type="submit"]{background:#772953;color:#fff}a.link-cta-inverted,button.cta-inverted{background:#fff;color:#333333}.row-enterprise a.link-cta-canonical,.row-enterprise button.link-cta-canonical{background:#fff;color:#772953}a.link-cta-ubuntu:hover,a.link-cta-ubuntu:hover,button.cta-ubuntu:hover,form button[type="submit"]:hover,form input[type="submit"]:hover{background:#c03f11;text-decoration:none}a.link-cta-canonical:hover,button.cta-canonical:hover{background:#5f2143;text-decoration:none}a.link-cta-inverted:hover,.row-enterprise a.link-cta-canonical:hover,button.cta-inverted:hover,.row-enterprise button.cta-canonical:hover{background:#fff;text-decoration:underline}a.cta-deactivated,a.cta-deactivated:hover,button.cta-deactivated,button.cta-deactivated:hover{background:#efefef;color:#fff;cursor:not-allowed}@media only screen and (min-width: 768px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}@media only screen and (min-width: 984px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}form input,form select,form textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}form .fieldset-submit ul{margin-bottom:0}form fieldset .mktError,form fieldset .errMsg,form fieldset .reqMark{color:#df382c}form fieldset .mktFormMsg{clear:both;display:block}.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-bottom:1px dotted #888888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0 !important}.row-grey{background:#f7f7f7}.no-border{border:0}#main-content .row-hero{margin-top:20px;padding-top:0}.row-background{color:#fff;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/image-background-wallpaper.jpg") no-repeat scroll 50% 50% #4b1827}.row-background a.alternate{color:#fff;text-decoration:underline}.row-background a.alternate:hover{color:rgba(255,255,255,0.6)}@media only screen and (min-width: 768px){.row-background{background-position:center 50%;background-size:100% auto}}.strip{width:100%;display:block}.strip-dark{background-color:#2c001e;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/background-grid.png");background-repeat:repeat;color:#fff}.strip-dark .list-ubuntu li{border:0}.strip-dark .resource{color:#333;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.strip-dark .resource:before{border-right-color:#2c001e}#main-content .strip-dark .resource:before{border-bottom-width:29px;right:-2px;top:-1px}#main-content .strip-dark .resource:hover:before{border-bottom-width:34px}#main-content .strip-dark .resource h2{padding-right:20px}.row-aux{background-color:rgba(255,255,255,0.6);text-align:center}.row-aux h2,.row-aux p{text-align:left}.row-aux a p{color:#333;margin-bottom:30px}.row-step h2{position:relative;top:5px}.row-step .step{position:relative;top:-5px;height:32px;width:32px;border-radius:50%;border:3px solid #dd4814;color:#dd4814;line-height:32px;text-align:center;background-color:#fff;font-size:23px;font-weight:400}@media only screen and (min-width: 768px){.row{padding:30px}#main-content .row-hero{margin-top:40px}}@media only screen and (min-width: 769px){.row-step .step{height:42px;width:42px;line-height:42px}.row br{display:block}}@media only screen and (min-width: 984px){.row br{display:block}.row{padding:60px 40px 40px}.no-border{border:0}}.box,.box-grey{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1.333em 20px}.box{background:#fff;border:1px solid #dfdcd9}.box-grey{background:#f7f7f7;color:#333333}.box-orange{background:#dd4814;color:#fff}.box-highlight{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;border:1px solid #f7f7f7}.box-textured{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg");border:0}.box-padded{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#efefef;border:0;margin-bottom:20px;padding:6px 5px}.box-padded h3{font-size:1.39286em;margin-bottom:0.61538em;margin-left:5px;margin-top:5px}.box-padded li h3{font-size:1.39286em;margin-bottom:0.61538em;margin:0}.box-padded div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:8px 8px 2px}.box-padded-feature{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/soft-centre-bkg.gif") repeat scroll 0 0 #a09f9f;border:0;margin-bottom:20px;padding:11px 5px 6px}.box-padded-feature h3{color:#fff;margin-left:5px;font-size:1.39286em;margin-bottom:0.61538em}.box-padded-feature h4{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}.box-padded-feature>div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:20px 8px}.box-padded-feature div div{margin-bottom:0}.box-padded-feature .inline-icons{display:table;width:100%;margin:0;text-align:center}.box-padded-feature .inline-icons li{display:table-cell;text-align:left;float:none}.box-padded-feature .one-col{width:48px;float:left}.resource{cursor:pointer;padding-bottom:40px;position:relative;-moz-transition:background 0.2s ease-out;-webkit-transition:background 0.2s ease-out;transition:background 0.2s ease-out}.resource h2{padding-right:20px}.resource.five-col h2 a:link,.resource.five-col h2 a:visited,.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:inherit !important}.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:1.125em}.resource.twelve-col h2 a:link,.resource.twelve-col h2 a:visited{font-size:1.40625em}.resource:hover{background-color:#fafafa}.resource:after{-moz-box-shadow:0 -1px 2px 0 #ddd;-webkit-box-shadow:0 -1px 2px 0 #ddd;box-shadow:0 -1px 2px 0 #ddd;content:'';height:1px;position:absolute;right:-6px;top:14px;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-moz-transition:all 0.2s ease-out;-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out;width:41px;z-index:2}.resource:hover:after{right:-9px;top:18px;width:48px}.resource:before{content:'';position:absolute;-moz-transition:border-width 0.2s ease-out;-webkit-transition:border-width 0.2s ease-out;transition:border-width 0.2s ease-out;top:-2px;right:-3px;width:0;height:0;border-bottom:30px solid #fdfdfd;border-right:30px solid #fff;-webkit-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);-moz-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);box-shadow:-2px 2px 2px rgba(176,176,176,0.4);z-index:2;-webkit-border-radius:0 0 0 0;-moz-border-radius:0 0 0 0;border-radius:0 0 0 0}.resource:hover:before{border-bottom-width:35px;border-right-width:35px}.resource:last-of-type{margin-bottom:30px}.resource .content-cat{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-icon-document.png") left center no-repeat;color:#aea79f;font-size:14px;letter-spacing:1px;margin:0;padding-left:20px;padding:0;position:absolute;text-transform:uppercase}.resource .content-cat-webinar{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-webinar.png") left center no-repeat}.resource.box-image-centered div+span img{margin-top:40px}html.yui3-js-enabled .resource:hover a{text-decoration:underline}.row-grey .resource:before{border-right-color:#f7f7f7}@media only screen and (max-width: 768px){.box-padded-feature .inline-icons li{float:left;display:block}.box-padded-feature .one-col{width:48px;float:left}}.arrow-up,.arrow-down,.arrow-right,.arrow-left{height:11px;position:absolute;width:18px}.arrow-up{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up.png") 0 0 no-repeat;left:20px;top:-11px}.arrow-down{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-down.png") 0 0 no-repeat;bottom:-11px;right:20px}.arrow-right{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-right.png") 0 0 no-repeat;height:18px;right:-11px;top:20px;width:11px}.arrow-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-left.png") 0 0 no-repeat;bottom:20px;height:18px;left:-11px;width:11px}div>.arrow-left{left:-10px}@media only screen and (min-width: 769px){html.yui3-js-enabled .arrow{visibility:visible}}.list,.list-ubuntu,.list-canonical{list-style:none;margin-left:0}.list li,.list-ubuntu li,.list-canonical li{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list li:last-of-type,.list li.last-item,.list-ubuntu li:last-of-type,.list-ubuntu li.last-item,.list-canonical li:last-of-type,.list-canonical li.last-item{border:0;padding-bottom:0}.list article{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list-spaced article,.list-spaced li{padding:30px 0}nav .list a{display:block}.list-ubuntu li,.list-canonical li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.svg")}.list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.svg")}.list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.svg")}.list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.svg")}.vertical-divider .list-canonical li,.vertical-divider .list-ubuntu li{padding-left:25px}html.no-svg .list-ubuntu li,.opera-mini .list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.png")}html.no-svg .list-canonical li,.opera-mini .list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.png")}html.no-svg .list-warm li,.opera-mini .list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.png")}html.no-svg .list-dark li,.opera-mini .list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.png")}.no-bullets{list-style:none;margin-left:0}.row .combined-list ul,.row .combined-list div{margin-bottom:0}.row .combined-list li.last-item{border-bottom:1px dotted #888888;padding-bottom:10px}.row .combined-list div.last-col,.row .combined-list ul.last-col{margin-bottom:20px}.row .combined-list div.last-col li.last-item,.row .combined-list ul.last-col li.last-item{border-bottom:0;padding-bottom:0}.inline{margin-left:0}.inline li{display:inline;list-style:none;margin-left:0;float:left}@media only screen and (min-width: 768px){.row .combined-list ul,.row .combined-list div{margin-bottom:20px}.row .combined-list li.last-item{border-bottom:0;padding-bottom:0}}ul.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}ul.inline-logos li{clear:none;display:inline-block;float:none;margin:10px 20px;padding:0}ul.inline-logos li.clear-row{clear:left}ul.inline-logos li.last-item{border:0}ul.inline-logos img{-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;vertical-align:middle;max-width:115px;max-height:32px}.inline-icons{margin:0 0 20px}.inline-icons li{margin-right:20px;margin-bottom:20px;text-align:left;display:inline-block}.inline-icons li.last-item{margin-right:0}.inline-icons.no-margin-bottom li{margin-bottom:0}.inline-icons img{vertical-align:middle;max-width:115px;max-height:32px}@media only screen and (max-width: 768px){ul.inline-logos img{max-width:172px;max-height:48px}}@media only screen and (min-width: 769px){ul.inline-logos li{clear:none;display:inline-block;height:auto;margin:20px 0;line-height:60px;padding:0 40px}ul.inline-logos li img{float:none;vertical-align:middle;max-width:200px;max-height:45px}}@media only screen and (min-width: 984px){.inline-icons{text-align:left;margin-bottom:20px}}blockquote.pull-quote{text-indent:0}blockquote.pull-quote p{color:#333333;padding-left:10px;padding-right:10px;font-size:1.77379em;margin-bottom:0.48323em;text-indent:-.4em;margin-left:.4em;line-height:1.3}blockquote.pull-quote p span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}blockquote.pull-quote p span+span{left:5px}blockquote.pull-quote p cite{margin:10px 0 0;font-weight:300;display:block;font-size:.75em;text-indent:0}blockquote.pull-quote.js{padding-left:60px;display:table-cell}blockquote.quote-canonical,blockquote.quote-canonical-white{font-size:1.14286em;margin-bottom:0.75em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-white-360x360.png") no-repeat 20px -130px;color:#772953;float:right;font-size:1em;height:215px;margin-top:0;padding:20px 60px 0;position:relative;width:236px}blockquote.quote-canonical-white{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-aubergine-345x345.png") no-repeat 0 0;color:#fff;padding:80px 60px 0;height:265px}blockquote.quote p:first-child{font-size:1.28571em;margin-bottom:0.66667em;line-height:1.3;text-indent:-7px}blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.svg");background-repeat:no-repeat;background-size:287px 286px;color:#fff;height:167px;padding:60px 40px;position:static;right:-40px;top:-90px;width:207px}blockquote.quote-right-bottom p{color:#fff}blockquote.quote-grey{font-size:2.57143em;margin-bottom:0.33333em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-grey-br-211x211.png") no-repeat scroll 0 0 transparent;color:#fff;height:152px;line-height:40px;margin-left:20px;padding:60px 0 0;text-align:center;width:211px}blockquote.quote-bottom-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;color:#fff;height:167px;padding:55px 40px 70px 45px;width:225px}html.no-svg blockquote.quote-right-bottom,.opera-mini blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.png")}.row-quote{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-quote blockquote{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0;padding:0}.row-quote blockquote p{margin-bottom:.75em;line-height:1.3;color:#333333;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333333;font-style:normal;margin-bottom:0;font-size:.75em;text-indent:-14px;text-indent:0}.row-quote .quote-twitter{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-115x139.png") 20px bottom no-repeat;padding:20px 20px 20px 23.40425%}.row-quote .quote-twitter-small{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-54x63.png") 99% bottom no-repeat;padding:20px 20px 20px 80px}.row-quote .quote-twitter-small p{margin:0;padding:0}blockquote.quote-canonical,blockquote.quote-canonical-white{background:none;color:#333333;width:auto;height:auto;padding:0 30px;margin-top:20px}@media only screen and (min-width: 768px){.row-quote blockquote{text-indent:-7px}.pull-quote{text-indent:-.4em}.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em}blockquote.pull-quote p,.row-quote blockquote p{padding-left:0;padding-right:0;text-indent:-.7em}blockquote.pull-quote p span,.row-quote blockquote p span{font-size:1.391304348em}blockquote.pull-quote p cite,.row-quote blockquote p cite{margin-left:0;text-indent:0}blockquote.pull-quote p span,.row-quote blockquote p span{top:5px}}@media only screen and (min-width: 769px){.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em;text-indent:-.4em}}@media only screen and (min-width: 984px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}blockquote.pull-quote p span,.row-quote blockquote p span{top:10px}}html.js .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:auto;padding-bottom:.6em;padding-right:20px}html.yui3-js-enabled .tabbed-menu{display:none;padding-bottom:20px;padding-top:20px}html.yui3-js-enabled .arrow{display:none;position:absolute;visibility:hidden}html.yui3-js-enabled .tabbed-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:8px 8px 0;background:#f7f7f7;margin-bottom:8px}html.yui3-js-enabled .tabbed-content.hide{display:block;opacity:1 !important}html.yui3-js-enabled .tabbed-content .title{display:none}html.yui3-js-enabled .tabbed-content div{display:none}html.yui3-js-enabled .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-down.svg") no-repeat scroll right 3px #f7f7f7;color:#333333;display:block;font-size:16px;padding-bottom:.6em;padding-right:20px;width:100%}html.yui3-js-enabled .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.svg");margin-bottom:10px}html.yui3-js-enabled .tabbed-content.open div{display:block}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-right.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content.open .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content .accordion-button{background-image:none;margin-bottom:10px}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content div{display:block}@media only screen and (min-width: 768px){html.yui3-js-enabled .tabbed-menu{display:block}html.yui3-js-enabled .tabbed-content{margin-bottom:20px;padding:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0 !important}html.yui3-js-enabled .tabbed-content .title{display:block}html.yui3-js-enabled .tabbed-content div{display:block}html.yui3-js-enabled .tabbed-content .vertical-divider div{display:table-cell}html.yui3-js-enabled .tabbed-content .accordion-button{display:none}}html.yui3-js-enabled .accordion-button.active{background-color:transparent}@media only screen and (min-width: 768px){.tabbed-menu{-moz-box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-shadow:0 -1px 10px #cfcfcf inset;box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background:none repeat scroll 0 0 #f7f7f7;padding-bottom:20px;padding-top:20px;position:relative}.tabbed-menu ul{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;margin-bottom:0;padding:0;position:relative;table-layout:fixed;width:100%}.tabbed-menu li{text-align:center;display:table-cell}.tabbed-menu a{color:#666;display:block;outline:none}.tabbed-menu a .active{color:#772953;text-decoration:none}.tabbed-menu a:hover{text-decoration:none}.tabbed-menu .arrow{bottom:0;position:absolute}.tabbed-content{*zoom:1;padding:20px 40px 0}.tabbed-content:before,.tabbed-content:after{content:"";display:table}.tabbed-content:after{clear:both}.tabbed-content .row{padding-left:0;padding-right:0}.tabbed-content .main-content{padding-bottom:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0}.tabbed-content-bg{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin-left:20px;margin-right:20px}.tabbed-content-bg .row-box{padding-left:0;padding-right:0}html.yui3-js-enabled .arrow{visibility:visible}}.row.vertical-divider{padding-bottom:40px}.vertical-divider div,.vertical-divider li{border-right:0;display:block;padding-left:0;padding-right:0}.vertical-divider-full{padding-bottom:0}.vertical-divider-full>div{padding-bottom:40px}.row.vertical-divider-full{padding-bottom:0}@media only screen and (max-width: 767px){.vertical-divider>div,.vertical-divider>li{border-bottom:1px dotted #888888;padding-bottom:20px}.vertical-divider div:last-of-type,.vertical-divider li:last-of-type,.inline-icons li:last-of-type{border-bottom:0;padding-bottom:5px}.row.vertical-divider{padding-bottom:0}.equal-height div,.equal-height li{height:auto !important}}@media only screen and (min-width: 984px){.row.vertical-divider{padding-bottom:60px}.vertical-divider>div,.vertical-divider>li{border-right:1px dotted #888888;display:table-cell;float:none;margin-right:0;padding-left:20px;padding-right:20px;vertical-align:top}.vertical-divider>div:last-child,.vertical-divider>li:last-child,.vertical-divider>div.last-col,.vertical-divider>li.last-col,.vertical-divider>div:last-of-type,.vertical-divider>li:last-of-type{border-right:0;padding-right:0}.vertical-divider>div:first-child,.vertical-divider>li:first-child,.vertical-divider>div.first-col,.vertical-divider>li.first-col,.vertical-divider>div:first-of-type,.vertical-divider>li:first-of-type{padding-left:0}}.slider{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#f7f7f7;padding-top:40px}.slider .slide-window{overflow:hidden;position:relative;height:450px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s}.slider .slide-container{position:absolute;width:2800 px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s;left:0}.slider .slider-dots ul{position:absolute;top:550px;left:220px;z-index:5}.slider .slider-dots li{background-position:0 -8px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/sprite-pager.png") no-repeat;float:left;height:7px;list-style-type:none;margin-right:.75em;text-indent:-9999em;width:7px}.slider .slider-dots li.active{background-position:0 0}.slider .slider-dots a{display:block;outline:0}.slider .slide{float:right;width:700px}.slider .slide h3{margin-top:65px;display:inline-block}.slider .slide p{width:350px}.slider .arrow-prev,.slider .arrow-next{font-size:5em;margin-top:150px;display:block;color:#888888;outline:0}.slider .arrow-prev:hover,.slider .arrow-next:hover{text-decoration:none;color:#333333}.slider .arrow-prev:active,.slider .arrow-next:active{padding-top:1px;text-decoration:none}.slider .arrow-prev:focus,.slider .arrow-next:focus{text-decoration:none}.yui3-tooltip-hidden{display:none}.yui3-tooltip-content{-moz-box-shadow:0 2px 8px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.2);box-shadow:0 2px 8px rgba(0,0,0,0.2);background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg") repeat scroll 0 0 transparent;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #e3e3e3;color:#333333;margin-top:-30px;max-width:520px;position:relative}.yui3-tooltip .yui3-widget-bd{padding:20px;width:320px}.yui3-tooltip .yui3-widget-bd *{max-width:100%}.yui3-tooltip .yui3-widget-bd h5{margin-bottom:10px;font-size:22px;font-weight:300}.yui3-tooltip .yui3-widget-bd img{float:left;margin-right:10px}.yui3-tooltip .yui3-widget-bd q{border-bottom:1px dotted #888888;border-top:1px dotted #888888;display:block;font-size:16px;font-style:italic;margin-bottom:0;margin-top:20px;padding:10px 0}.yui3-tooltip .yui3-widget-bd p:last-child{margin-bottom:0}.yui3-tooltip .yui3-widget-ft,.yui3-tooltip .yui3-widget-ft div{position:absolute;width:0;height:0;border-style:solid;line-height:0;font-size:0}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft,.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:-10px;left:50%;margin:0 0 0 -10px;border-width:0 10px 10px;border-color:#efefef transparent}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:0;border-color:#efefef transparent}.tooltip-label{-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.3);box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;border:1px solid #dfdcd9;display:none;font-size:13px;line-height:1;margin:0;padding:6px 5px;position:absolute;top:-20px;white-space:nowrap;z-index:1000}body,a:link,a:visited{-webkit-font-smoothing:antialiased}code,pre,p{line-height:1.5}body{font-size:16px}@media only screen and (min-width: 768px){code,pre,p{line-height:1.6}body{font-size:16px}}@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi){body{font-size:18px}}.not-for-medium{display:none}@media only screen and (min-width: 985px){.not-for-medium{display:block}}header.banner{background:#000000;-moz-box-shadow:inset 0 2px 2px -2px #000;-webkit-box-shadow:inset 0 2px 2px -2px #000;box-shadow:inset 0 2px 2px -2px #000;margin-bottom:0}header.banner .nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;*zoom:1}header.banner .nav-primary:before,header.banner .nav-primary:after{content:"";display:table}header.banner .nav-primary:after{clear:both}header.banner nav.nav-primary{border-bottom:1px solid #262626;overflow:visible}header.banner nav.nav-primary .user-nav{float:right;margin-right:20px}header.banner nav.nav-primary .user-dropdown:hover ul:after{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img{margin-right:10px}header.banner nav.nav-primary .user-dropdown .menu-link img.hover{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img.normal{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.hover,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.hover{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.normal,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.normal{display:none}header.banner nav.nav-primary .user-dropdown ul{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin-top:-2px;background-color:#fff;border-width:0}header.banner nav.nav-primary .user-dropdown ul a:hover{background-color:transparent}header.banner nav.nav-primary #user-dropdown .dropdown ul{width:auto}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:73px 30px;-webkit-background-size:73px 30px;-o-background-size:73px 30px;background-size:73px 30px;background-image:url(../img/logos/logo.svg);background-position:20px;background-repeat:no-repeat;min-width:120px;padding-top:6px;margin-left:0}body.no-svg header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url(../img/logos/logo.png)}input[type=text]::-ms-reveal,input[type=text]::-ms-clear{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}.contextual-bar{overflow:hidden;background-color:#ffffff;border-bottom:1px solid #d4d4d4}form.search-form{overflow:hidden;float:right;width:100%;position:relative}form.search-form input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;border-left:0;margin:0;width:100%;height:50px;float:left;font-size:1em;padding-top:0;padding-bottom:0;padding-right:30px;background-color:transparent;-webkit-appearance:none}form.search-form input:focus{border-color:#dd4814}form.search-form button[type=submit],form.search-form button[type=submit]:hover{position:absolute;top:10px;right:10px;display:block;height:30px;width:30px;padding:0;line-height:0;-webkit-appearance:none;background:transparent}form.search-form button img{height:16px}.contextual-nav{border:0;display:block;margin:0;padding-left:10px;background-color:transparent;overflow:hidden;float:left}.contextual-nav li,.contextual-nav li:last-child{font-size:0.875em;float:left;list-style-type:none;margin:0;margin-left:5px}.contextual-nav li a:link,.contextual-nav li a:visited,.contextual-nav .contextual-nav__label{display:block;color:#333333;font-weight:300;text-align:center;padding:16px 10px 10px 10px;border-bottom:3px solid transparent}.contextual-nav .contextual-nav__label{color:#cdcdcd}.contextual-nav li a:hover{border-bottom-color:#dd4814;text-decoration:none;color:#dd4814}.contextual-nav li a.active{border-bottom:3px solid #dd4814}.opera-mini header.banner .logo-ubuntu,.no-svg header.banner .logo-ubuntu{background-image:url(../img/logos/logo.png)}@media only screen and (min-width: 769px){header.banner .nav-primary ul li,header.banner .nav-primary ul li:last-child{border-bottom:0;width:auto}header.banner nav.nav-primary li a:link,header.banner nav.nav-primary li a:visited{border-left:1px solid #262626;font-weight:400}header.banner nav.nav-primary ul li a.active{padding-bottom:10px;background-color:#0e0c0b;border-bottom:3px solid #dd4814;border-left:1px solid #262626}header.banner nav.nav-primary ul li{border-left:1px solid #262626}header.banner nav.nav-primary ul li a:hover{background-color:#dd4814}header.banner nav.nav-primary ul{background-color:transparent;border-right:1px solid #262626;display:block}header.banner nav.nav-primary ul li:last-child{border-left:1px solid #262626;border-right:0}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:0}header.banner .nav-primary ul li a.external:hover{background-image:url("../img/icons/external-link-grey.png")}form.search-form{width:325px}form.search-form input{border-left:1px solid #d4d4d4;margin:0 20px;width:250px;font-size:0.875em}}@media only screen and (min-width: 1030px){header.banner{height:48px;overflow:hidden}header.banner .nav-primary{width:100%}}body{background-repeat:repeat}.row{border:0;background-color:rgba(255,255,255,0.6)}@media only screen and (min-width: 769px){.append-one{margin-right:10.6%}.row{padding:50px 40px 30px}}.inner-wrapper{*zoom:1;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:transparent;background-image:none;margin:0 auto;padding-bottom:0;float:none}.inner-wrapper:before,.inner-wrapper:after{content:"";display:table}.inner-wrapper:after{clear:both}.wrapper{position:static;background:transparent;width:100%;overflow:hidden}img.touch-border{margin-bottom:-50px}.inner-wrapper,footer.global .legal{max-width:1030px;width:auto;padding-left:0;padding-right:0}.touch-top{margin-top:-50px}@media only screen and (max-width: 1030px){.inner-wrapper,footer.global .legal{padding-left:8px;padding-right:8px;width:auto}}.footer-cta{background:#fff;padding-bottom:20px}.footer-wrapper.strip-light{background-color:#fff}.solutions-cta{height:60px;background-color:#dd4814;line-height:60px;text-align:center}.solutions-cta a{color:#fff;font-size:1.25em}footer.global{background-color:white;box-shadow:none;padding-top:0}footer.global .row{padding:10px 0 0}footer.global .two-col{width:46%;float:left;display:inline-block;min-height:200px}footer.global h2{padding-bottom:0;color:#888888;font-size:16px}footer.global nav .canonlist ul li,footer.global nav .additional-info ul li{min-height:0;width:48%;float:left}footer.global ul.bullets li:after{line-height:1;color:#888888;content:"•";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:auto}footer.global a.external{background-image:url("../img/icons/external-link-dark.png")}footer.global .top-link{margin-bottom:10px}footer.global a{color:#333333}footer.global a:hover{color:#dd4814}footer.global .legal{background-image:none}footer.global .legal.has-cookie{padding-bottom:70px}footer.global .inner-wrapper{overflow:visible}footer.global a.link-cta-positive,footer.global a.link-cta-negative{width:auto;margin-top:10px;padding-left:20px;padding-right:20px;color:#fff;font-size:14px}footer.global .section__title{background:none;cursor:default}.legal-inner{clear:both;overflow:hidden;float:left;width:100%;padding:20px 10px 0;margin:-3px -10px 0}.social,.social--right{margin-left:0}.social .social__item,.social--right .social__item{display:inline;float:left;padding-right:1em}.social .social__google,.social .social__facebook,.social .social__twitter,.social--right .social__google,.social--right .social__facebook,.social--right .social__twitter{background-image:url("../img/icons/icon-social.png");display:block;width:45px;height:44px}.social .social__google.social__twitter:hover,.social .social__facebook.social__twitter:hover,.social .social__twitter.social__twitter:hover,.social--right .social__google.social__twitter:hover,.social--right .social__facebook.social__twitter:hover,.social--right .social__twitter.social__twitter:hover{background-position:0 -45px}.social .social__google.social__facebook,.social .social__facebook.social__facebook,.social .social__twitter.social__facebook,.social--right .social__google.social__facebook,.social--right .social__facebook.social__facebook,.social--right .social__twitter.social__facebook{background-position:90px 0}.social .social__google.social__facebook:hover,.social .social__facebook.social__facebook:hover,.social .social__twitter.social__facebook:hover,.social--right .social__google.social__facebook:hover,.social--right .social__facebook.social__facebook:hover,.social--right .social__twitter.social__facebook:hover{background-position:90px -45px}.social .social__google.social__google,.social .social__facebook.social__google,.social .social__twitter.social__google,.social--right .social__google.social__google,.social--right .social__facebook.social__google,.social--right .social__twitter.social__google{background-position:135px 0}.social .social__google.social__google:hover,.social .social__facebook.social__google:hover,.social .social__twitter.social__google:hover,.social--right .social__google.social__google:hover,.social--right .social__facebook.social__google:hover,.social--right .social__twitter.social__google:hover{background-position:135px -45px}@media only screen and (min-width: 768px){.social--right{float:right}}#additional-info{border-bottom:0}#additional-info h2:before{background-image:url("../img/icons/external-link-grey.svg"),none;background-repeat:no-repeat;background-size:14px 14px;content:"";display:inline-block;height:15px;margin-right:3px;position:relative;top:3px;width:15px}#additional-info div li{border-left:1px solid #d4d7d4;box-sizing:border-box;display:block;float:left;margin:0;padding:0;width:50%}#additional-info div li a{border-bottom:1px solid #d4d7d4;box-sizing:border-box;color:#333333;display:block;float:left;margin:0;overflow:hidden;padding:8px 10px;text-align:left;white-space:normal;width:100%}#additional-info .section__title{border-bottom:1px solid #d4d7d4;background-position:100% 0.1em}html.opera-mini footer #nav-global h2:before,html.opera-mini footer #additional-info h2:before,html.no-svg footer #nav-global h2:before,html.no-svg footer #additional-info h2:before{background-image:url("../img/icons/external-link-grey.png")}@media only screen and (min-width: 769px){.footer-wrapper.strip-light{white-space:nowrap}footer.global{padding-top:40px;padding-bottom:40px}footer.global .two-col{width:14.89361%;display:inline-block;min-height:0}footer.global .section{min-height:160px;margin-right:40px;padding-bottom:0;border-right:1px dotted #aaa;border-bottom:0}footer.global .section:last-child{margin-right:0;border-right:0}footer.global li{display:inline;float:left}footer.global ul.no-bullets li{border-right:1px dotted #aaa;padding-right:15px;padding-left:15px}footer.global ul.no-bullets li a{font-size:16px}footer.global ul.no-bullets li a:hover{color:#dd4814}footer.global ul.no-bullets li:last-child{border-right:none}footer.global ul.no-bullets li:first-child{padding-left:0px}#additional-info .section__title{border-bottom:0}#additional-info div li,#additional-info div a:link{width:100%;border:0}}.actions .actions__social-item--twitter,.actions .actions__social-item--google-plus{text-indent:-99999px;background-image:url("../img/icons/icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:block}.actions .actions__social-item--twitter{background-position:0 0}.actions .actions__social-item--twitter:hover{background-position:0 -45px}.actions .actions__social-item--google-plus{background-position:-45px 0}.actions .actions__social-item--google-plus:hover{background-position:-45px -45px}.anchor{display:inline-block;margin-left:3px;opacity:.0;position:relative;top:1px;width:1em;height:1em;background:url("../img/icons/anchor_16.svg") 0 80% no-repeat;background-size:16px;-moz-transition:opacity 0.1s;-webkit-transition:opacity 0.1s;transition:opacity 0.1s}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,dt:hover .anchor,li:hover .anchor{opacity:1}.box{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;display:block;margin-bottom:0;border-top:0;border-left:0;border-right:0;padding-left:0;padding-right:0}.box-dim{background-color:#fafafa}@media only screen and (min-width: 768px){.box{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);-webkit-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);display:inline-block;margin-bottom:20px;padding-left:20px;padding-right:20px;border:0}}a.indent{-moz-box-shadow:inset 0 1px 2px 0 #333;-webkit-box-shadow:inset 0 1px 2px 0 #333;box-shadow:inset 0 1px 2px 0 #333;background:rgba(0,0,0,0.1);padding:10px 30px;text-weight:normal}a.indent:hover{background:rgba(0,0,0,0.2)}a.link-cta-positive,a.link-cta-negative{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#dd4814;color:#fff;display:inline-block;font-size:1.14286em;font-weight:300;text-decoration:none;margin:0;padding:8px 14px;text-align:center;-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;width:100%}a.link-cta-positive:hover,a.link-cta-negative:hover{background-color:#ae3910}a.link-cta-positive .external,a.link-cta-negative .external{padding-right:1em;background-image:url("../img/icons/external-link-white.svg");background-repeat:no-repeat;background-size:11px;background-position:right top}@media only screen and (min-width: 769px){a.link-cta-positive .external,a.link-cta-negative .external{padding-right:.7em}}a.link-cta-negative{background-color:#b2b2b2}a.link-cta-negative:hover{background-color:#888888}.charms__list{list-style:none;margin-bottom:1em;margin-left:0;border-bottom:1px dotted #d4d4d4}.charms__list .charms__list--config{display:none}.charms__list .charms__list--toggle{display:block}.charms__list .charms__list--toggle.is-open+.charms__list--config{display:block}.charms__list .charms__list--config-name{border-top:0}.charms__list--item{font-size:1em;border-top:1px dotted #d4d4d4;padding:10px 0 0 10px;margin-bottom:10px}.charms__list--item:last-of-type{margin-bottom:10px}.charms__list--icon{margin-right:.4em;width:25px;height:25px}.charms__list--toggle{background:url("../img/shared/icon-arrow-down.svg") no-repeat center center;width:16px;height:100%;float:right;text-indent:-99999px;margin-right:20px}.charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.svg");background-size:14px}.charms__list--config{padding-left:35px;padding-bottom:20px}.charms__list--config-name{font-size:1em;margin-top:15px;padding-top:15px;font-weight:400;border-top:1px dotted #d4d4d4}.charms__list--config-name:first-of-type{border-top:0}.charms__list--config-type{font-weight:400}.charms__list--config-description,.charms__list--config-setting{margin-left:30px;margin-top:8px}.charms__list--config-setting{font-size:0.875em;color:#888888;font-family:"Ubuntu Mono","Consolas","Monaco","Lucida Console","Courier New",Courier,monospace}body.no-svg .charms__list .charms__list--toggle{background-image:url("../img/shared/icon-arrow-down.png")}body.no-svg .charms__list .charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.png")}pre{background:transparent;border:1px solid #888888;margin:0 0 1.5em 0}pre:not(:first-child){margin-top:1.5em}code.language-bash .comment{color:#888888}.cookie-policy{-moz-box-shadow:0 -1px 2px rgba(0,0,0,0.2);-webkit-box-shadow:0 -1px 2px rgba(0,0,0,0.2);box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;bottom:0;position:fixed;width:100%;z-index:100}.cookie-policy p{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:13px;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url(../img/icons/close-orange.svg);background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}html.no-svg .cookie-policy .link-cta,html.opera-mini .cookie-policy .link-cta{background-image:url(../img/icons/close-orange.png)}html.opera-mini .cookie-policy{position:relative;top:0}.deploy-command{margin-bottom:10px;position:relative}.deploy-command .deploy-command__field{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);background-image:url("../img/icons/code-snippet_16.svg");background-repeat:no-repeat;background-position:5px center;background-color:#fff;background-size:1.142857143em;width:100%;height:37px;border:1px solid #c1c1c1;padding:.6em;color:#888888;padding-left:2em;font-size:0.875em;white-space:nowrap;overflow:hidden;cursor:text}.deploy-command .command2clipboard__clip{cursor:pointer;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;line-height:1;position:absolute;right:1px;top:1px;background-color:#ffffff;padding:9px 8px 7px;border-left:1px solid #b2b2b2;display:none}.deploy-command .command2clipboard__clip.zeroclipboard-is-hover{background-color:#eeeeee}@media only screen and (min-width: 1030px){.deploy-command .command2clipboard__clip{display:inline-block}}.dropdown-menu{position:relative;display:block}.dropdown-menu.open .menu-link{background-color:#000000}.dropdown-menu.open .dropdown{display:block}.dropdown-menu .menu-link .border-box{display:block;color:#f2f2f4}.dropdown-menu .dropdown{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;display:none;position:absolute;z-index:1000;top:0;left:0;right:0;width:auto;background-color:#ffffff;box-shadow:0 1px 5px rgba(0,0,0,0.2)}.dropdown-menu .dropdown.right{left:auto;right:0;text-align:right}.dropdown-menu .dropdown.narrow{min-width:140px;width:auto}.dropdown-menu .dropdown a,.dropdown-menu .dropdown p,.dropdown-menu .dropdown li{color:#333333}.dropdown-menu .dropdown p{padding:11px 20px}.dropdown-menu .dropdown header,.dropdown-menu .dropdown footer{background-color:#ffffff}.dropdown-menu .dropdown header{padding:11px 20px;color:#f2f2f4;font-size:16px;font-weight:300}.dropdown-menu .dropdown footer{padding:20px}.dropdown-menu .dropdown ul{width:auto;left:0;right:0}.dropdown-menu .dropdown ul li a{width:auto;display:block;padding:15px 20px}.files .files__list{list-style:none;margin-bottom:1em;border-left:1px solid #cbcbcb;margin-left:1em}@media only screen and (min-width: 768px){.files .files__list{margin-left:0}}.files .files__list li{position:relative}.files .files__list li a:link,.files .files__list li a:visited{color:#333;text-decoration:none}.files .files__list li:before{content:'';width:12px;height:1px;background:#d4d4d4;display:inline-block;position:relative;top:-4px;margin-right:5px}.files .files__list li:last-child:after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;top:.85em;background:#fff}.files .files__list ul:last-child>li a:after{content:'';width:4px;height:3em;position:absolute;display:block;left:-1.8em;top:-1.45em;background:white;cursor:default}.files .files__list .files__list{margin-left:1.3em}.files .files__list .files__list--item,.files .files__list .files__list--item-folder{font-size:0.875em;margin-bottom:0.75em}.files .files__list .files__list--item-folder{background-position:center right;background-size:12px;cursor:pointer}.files .files__list .files__list--item-folder:after{font-size:14px;display:block;content:"-";position:absolute;left:-7px;top:4px;padding:0 4px;line-height:0.9em;background:#ffffff;border:1px solid #888888}.files .files__list .files__list--item-folder.is-closed+ul{display:none}.files .files__list .files__list--item-folder.is-closed:after{content:"+";padding:0 2px}.files .files__actions--launchpad{background:url("../img/icons/icon-launchpad.svg") no-repeat;padding-left:1.4em}#main-content .row-hero{padding-top:20px;margin-top:0}#main-content .row-hero .intro{font-size:16px}@media only screen and (min-width: 769px){#main-content .row-hero{padding-top:60px}#main-content .row-hero .intro{font-size:1.4375em;margin-bottom:40px}}.how-to div div img{float:left;margin:0 20px 20px 0}header.banner a.external,header.banner a.external:hover{background-image:url("../img/icons/external-link-grey.png")}a.external,a.external:hover,header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-repeat:no-repeat}a.external,a.external:hover header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-position:right 14px top 14px;padding-right:35px;background-size:auto}@media only screen and (max-width: 769px){header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background:none}header.banner nav.nav-primary ul li a.external:after{display:inline-block;width:11px;height:11px;margin-left:0.25em;background-image:url("../img/icons/external-link-dark.png");vertical-align:text-top}}.list__icons{margin-left:0;margin-bottom:5px}.list__icons li{list-style:none;float:left;padding:8px 8px 0 0;margin-bottom:0}.list__icons li img{width:24px;height:24px;vertical-align:top}.list__tick{list-style-image:url("../img/icons/tick.png")}.list__middot{margin-left:0;list-style:none}.list__middot li{display:inline}.list__middot li:after{content:"•";color:#888;margin:0 5px 0 8px;vertical-align:middle}.list__middot li.files__actions--last:after{content:""}.combined-list .list li{border-bottom:1px dotted #888;padding:10px 0}@media only screen and (max-width: 767px){.combined-list .last-col .list li:last-of-type{border-bottom:0;padding-bottom:0}}@media only screen and (min-width: 768px){.combined-list .list li:last-of-type{border-bottom:0;padding-bottom:0}}.events-list li{position:relative;padding-bottom:20px}.events-list dd{margin-left:0;background-position:0 center;background-repeat:no-repeat;background-size:20px 20px;padding:6px 20px 6px 24px}.events-list .event-map{display:none}.events-list .event-date{background-image:url("../img/icons/calendar.svg")}.events-list .location{background-image:url("../img/icons/location.svg")}@media only screen and (min-width: 769px){.events-list .event-details-wrapper{padding-left:120px}.events-list .event-map{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;position:absolute;left:0;top:0;height:100px;width:100px;float:left;margin-right:10px;margin-top:5px;overflow:hidden;display:block}}body.no-svg .events-list .event-date{background-image:url("../img/icons/calendar.png")}body.no-svg .events-list .location{background-image:url("../img/icons/location.png")}.maintainers .maintainer__email{display:block}.ratings ul{margin-left:2px;margin-bottom:0}.ratings ul li{margin-bottom:0}.ratings ul li img{vertical-align:text-top}.ratings ul li:first-of-type{margin-left:0}.revisions__list{list-style:none;margin-left:0}.revisions__list .revisions__list-item{margin-bottom:1em}.revisions__list .revisions__list_meta{color:#888;margin-bottom:.2em}.revisions__list .revisions__list_meta_date{float:right}.section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;padding-bottom:20px;padding-top:20px}.section .section__title{background:url(../img/shared/icon-arrow-up.svg) no-repeat center right;cursor:pointer;margin-bottom:1em}.section.is-closed{height:60px}.section.is-closed .section__title{background-image:url(../img/shared/icon-arrow-down.svg)}.no-svg .row.section .section__title{background:url(../img/shared/icon-arrow-up.png)}.no-svg .row.section.is-closed .section__title{background:url(../img/shared/icon-arrow-down.png)}footer .section{margin-bottom:1em;padding-bottom:1em}footer .section.is-closed{height:auto;padding-bottom:0}footer .section.is-closed ul{display:none}@media only screen and (min-width: 769px){.row .section .section__title{background-image:none;cursor:auto}.row .section.is-closed{height:auto}}.list--concealed .list-item{display:none}.list--concealed .list-item:first-of-type{display:list-item}.list--concealed.list--visible-6 .list-item:nth-child(-n+6){display:list-item}.list--concealed.list--visible-4 .list-item:nth-child(-n+4){display:list-item}.list--concealed.list--visible-2 .list-item:nth-child(-n+2){display:list-item}.list--concealed a.btn__see--less{display:none}.list--concealed a.btn__see--more{display:inline}.list--revealed .list__controls,.list--concealed .list__controls{display:block;margin-top:2em}.list--revealed .list--item{display:list-item}.list--revealed a.btn__see--less{display:inline}.list--revealed a.btn__see--more{display:none}a.btn__see--more,a.btn__see--less{-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#333;border-radius:2px;border:1px solid #b2b2b2;background:#fff;padding:0.38462em 1.15385em}a.btn__see--more:hover,a.btn__see--less:hover{background:#eee;text-decoration:none}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}.tag-list{list-style:none;margin:0}.tag-list--item{display:inline-block;text-transform:lowercase}.tag-list--item a:link,.tag-list--item a:visited{color:#333}.tag-list--item a:after{content:','}.tag-list--item:last-child a:after{content:''}#twitter-feed,#blog-feed{margin:35px 0}#twitter-feed>ul,#blog-feed>ul{list-style:none;margin-left:0}#twitter-feed>ul li,#blog-feed>ul li{position:relative;margin-bottom:30px}#twitter-feed .user,#blog-feed .user{font-size:0.875em;margin-bottom:0.5em}#twitter-feed .user img,#blog-feed .user img{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:24px;height:24px;vertical-align:middle;margin-right:5px}#twitter-feed .user a:link,#twitter-feed .user a:visited,#twitter-feed .user a:hover,#blog-feed .user a:link,#blog-feed .user a:visited,#blog-feed .user a:hover{text-decoration:none}#twitter-feed .user span[data-scribe="element:name"],#blog-feed .user span[data-scribe="element:name"]{color:#333}#twitter-feed .tweet,#blog-feed .tweet{padding-left:33px;margin-bottom:.3em}#twitter-feed .timePosted,#blog-feed .timePosted{padding-left:33px;font-size:0.875em}#twitter-feed .interact,#blog-feed .interact{padding-left:33px}#twitter-feed .interact a:link,#twitter-feed .interact a:visited,#blog-feed .interact a:link,#blog-feed .interact a:visited{margin-right:20px}@media only screen and (min-width: 769px){#twitter-feed .timePosted{position:absolute;top:0;right:0;padding-left:0}}.spaced-segment{margin-bottom:50px}.spaced-segment h3{margin-bottom:1.3em}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}@media only screen and (min-width: 769px){.tip,.command2clipboard__clip{position:relative;display:inline-block}.tip .tip-content,.command2clipboard__clip .tip-content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tip:hover .tip-content:after,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tip:hover .tip-content:before,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}.fake{display:block}*{-webkit-backface-visibility:hidden;margin:0}html{height:100%}body{height:100%;font-size:1.0em;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-weight:300}hr{border:none;background:#B2B2B2;width:100%;height:1px;display:block;width:100%;float:left;margin-bottom:20px}ul,ol{margin-left:0}a.alt{color:#333}a.alt:hover{color:#dd4814}a:active,a:focus{outline:none}::selection{color:#FFF;background:#dd4814}::-moz-selection{color:#FFF;background:#dd4814}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot?") format("eot"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot?") format("eot"),url("../fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:400;src:url("../fonts/ubuntu-r-webfont.eot?") format("eot"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot?") format("eot"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot?") format("eot"),url("../fonts/ubuntu-mi-webfont.woff2") format("woff2"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot?") format("eot"),url("../fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}.accordion{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.disabled .accordion{opacity:.5;pointer-events:none}.accordion .accordion__title{border-bottom:1px dotted #B2B2B2;padding:13px 20px 12px;margin:0;font-size:1.3em}.accordion .accordion__tab{border-bottom:1px dotted #B2B2B2}.accordion .accordion__tab:last-of-type{border:none}.accordion .accordion__tab .accordion__tab-title{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../img/icons/accordion-open.svg") top 20px right 20px no-repeat}.accordion .accordion__tab .accordion__tab-title.active{background-image:url("../img/icons/accordion-close.svg")}.accordion .accordion__tab .accordion__tab-title.active+.accordion__tab-content{max-height:3000px;transition:max-height 0.5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height 0.5s ease-out;overflow:hidden}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:0.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active{font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active .accordion__tab-link{background:transparent url("../img/icons/cross.svg") top 7px right 0px no-repeat}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover{color:#dd4814}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover .accordion__tab-link{color:#dd4814;background-image:url("../img/icons/cross-orange.svg")}.cta-group .cta-group__link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px 0px 0px 3px;-moz-border-radius:3px 0px 0px 3px;border-radius:3px 0px 0px 3px;display:inline-block;padding:10px 14px;text-align:center;color:#ffffff;background-color:#dd4814}.cta-group .cta-group__link:hover{cursor:pointer;text-decoration:none;background-color:#c03f11}.cta-group.secondary .cta-group__link{color:#dd4814;border:1px solid #b2b2b2;background-color:#FFF;line-height:1}.cta-group.secondary .cta-group__link:hover{cursor:pointer;background-color:#F2F2F2}a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{font-size:1em;border:none;max-height:37px}a.link-cta-ubuntu[disabled],a.link-cta-ubuntu.disabled,button.cta-ubuntu[disabled],button.cta-ubuntu.disabled,input[type='submit'][disabled],input[type='submit'].disabled,form button[type='submit'][disabled],form button[type='submit'].disabled,form input[type='submit'][disabled],form input[type='submit'].disabled{cursor:default;opacity:.5}a.link-cta-ubuntu.clear,button.cta-ubuntu.clear,input[type='submit'].clear,form button[type='submit'].clear,form input[type='submit'].clear{background:none;color:#333}a.link-cta-ubuntu.secondary,button.cta-ubuntu.secondary,input[type='submit'].secondary,form button[type='submit'].secondary,form input[type='submit'].secondary{color:#dd4814;border:1px solid #b2b2b2;background:#FFF}a.link-cta-ubuntu.secondary.external,button.cta-ubuntu.secondary.external,input[type='submit'].secondary.external,form button[type='submit'].secondary.external,form input[type='submit'].secondary.external{background-image:url("../img/external-link-black.svg");background-size:16px 16px;background-repeat:no-repeat;background-position:top 8px right 8px}a.link-cta-ubuntu.secondary:hover,button.cta-ubuntu.secondary:hover,input[type='submit'].secondary:hover,form button[type='submit'].secondary:hover,form input[type='submit'].secondary:hover{background-color:#F2F2F2;cursor:pointer}a.link-cta-ubuntu.secondary[disabled],a.link-cta-ubuntu.secondary.disabled,button.cta-ubuntu.secondary[disabled],button.cta-ubuntu.secondary.disabled,input[type='submit'].secondary[disabled],input[type='submit'].secondary.disabled,form button[type='submit'].secondary[disabled],form button[type='submit'].secondary.disabled,form input[type='submit'].secondary[disabled],form input[type='submit'].secondary.disabled{cursor:default;color:#f5ae95;border:1px solid #ddd;background:#FFF;opacity:1}a.link-cta-ubuntu.secondary[disabled]:hover,a.link-cta-ubuntu.secondary.disabled:hover,button.cta-ubuntu.secondary[disabled]:hover,button.cta-ubuntu.secondary.disabled:hover,input[type='submit'].secondary[disabled]:hover,input[type='submit'].secondary.disabled:hover,form button[type='submit'].secondary[disabled]:hover,form button[type='submit'].secondary.disabled:hover,form input[type='submit'].secondary[disabled]:hover,form input[type='submit'].secondary.disabled:hover{background:#FFF}a.link-cta-ubuntu.text-button,button.cta-ubuntu.text-button,input[type='submit'].text-button,form button[type='submit'].text-button,form input[type='submit'].text-button{background-color:transparent;color:#333}a.link-cta-ubuntu.text-button:hover,button.cta-ubuntu.text-button:hover,input[type='submit'].text-button:hover,form button[type='submit'].text-button:hover,form input[type='submit'].text-button:hover{text-decoration:underline}a.link-cta-ubuntu.full,button.cta-ubuntu.full,input[type='submit'].full,form button[type='submit'].full,form input[type='submit'].full{display:block;width:100%}@media screen and (max-width: 768px){a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{margin-bottom:20px}}a.link-cta-ubuntu{line-height:20px}.cta-group{float:left;width:auto;clear:both;position:relative;overflow:hidden}.cta-group .cta-group__link{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;max-height:36px;padding-right:49px;width:100%;line-height:1.2;position:relative;margin:0;text-align:left}.cta-group .cta-group__link:after{-webkit-border-radius:0px 3px 3px 0px;-moz-border-radius:0px 3px 3px 0px;border-radius:0px 3px 3px 0px;content:'';display:block;height:36px;width:34px;background:red;position:absolute;top:0;right:0;background-image:url("../img/chevron-white.svg");background-color:#dd4814;background-repeat:no-repeat;background-position:center}.cta-group .cta-group__link:hover{background-color:#dd4814}.cta-group .cta-group__link:hover:after{background-color:#c03f11}.cta-group .cta-group__dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;right:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;position:relative;clear:both}.cta-group .cta-group__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out}.cta-group .cta-group__dropdown .cta-group__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;clear:both;padding:5px 10px;margin:0}.cta-group .cta-group__dropdown .cta-group__item a{color:#333;cursor:pointer;width:100%;float:left;margin:0}.cta-group .cta-group__dropdown .cta-group__item a:hover{color:#dd4814;text-decoration:none}.cta-group.secondary .cta-group__link{float:left;max-height:36px;width:100%}.cta-group.secondary .cta-group__link:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-color:#fff;border:1px solid #b2b2b2;border-left:none;top:-1px;right:-1px}.cta-group.secondary .cta-group__link:hover{background-color:#FFF}.cta-group.secondary .cta-group__link:hover:after{background-color:#F2F2F2}.flash-messages{margin:0px auto;padding:0;max-width:1440px}@media screen and (max-width: 1030px){.flash-messages{margin:0px 10px 20px}}.flash-messages .flash-messages__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.flash-messages .flash-messages__item.success{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.flash-messages .flash-messages__item.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.flash-messages .flash-messages__item.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url'],form textarea,form select,tags-input .tags .input,.accounts .api li input[type='text']{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;background:#FFF;color:#333;border:1px solid #D2D2D2;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0px 13px}form input[type='text']:active,form input[type='number']:active,form input[type='search']:active,form input[type='password']:active,form input[type='email']:active,form input[type='url']:active,form textarea:active,form select:active,tags-input .tags .input:active,.accounts .api li input[type='text']:active{border-color:#B2B2B2;outline:none}form input[type='text']:focus,form input[type='number']:focus,form input[type='search']:focus,form input[type='password']:focus,form input[type='email']:focus,form input[type='url']:focus,form textarea:focus,form select:focus,tags-input .tags .input:focus,.accounts .api li input[type='text']:focus{border-color:#B2B2B2;outline:none}form input.invalid[type='text'],form input.invalid[type='number'],form input.invalid[type='search'],form input.invalid[type='password'],form input.invalid[type='email'],form input.invalid[type='url'],form textarea.invalid,form select.invalid,tags-input .tags .invalid.input,.accounts .api li input.invalid[type='text'],form input.ng-invalid[type='text'],form input.ng-invalid[type='number'],form input.ng-invalid[type='search'],form input.ng-invalid[type='password'],form input.ng-invalid[type='email'],form input.ng-invalid[type='url'],form textarea.ng-invalid,form select.ng-invalid,tags-input .tags .ng-invalid.input,.accounts .api li input.ng-invalid[type='text']{border-color:#d90000}form input[disabled="disabled"][type='text'],form input[disabled="disabled"][type='number'],form input[disabled="disabled"][type='search'],form input[disabled="disabled"][type='password'],form input[disabled="disabled"][type='email'],form input[disabled="disabled"][type='url'],form textarea[disabled="disabled"],form select[disabled="disabled"],tags-input .tags [disabled="disabled"].input,.accounts .api li input[disabled="disabled"][type='text']{-webkit-text-fill-color:#333;border-color:#D2D2D2;background-color:transparent}label{position:relative}.disabled label{cursor:default}form li.help-msg{margin-bottom:1em}form li.help-msg .help{color:#888;font-size:0.875em}form label span{color:#333}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url']{padding:7px 10px}form input[type='text']::-webkit-input-placeholder,form input[type='number']::-webkit-input-placeholder,form input[type='search']::-webkit-input-placeholder,form input[type='password']::-webkit-input-placeholder,form input[type='email']::-webkit-input-placeholder,form input[type='url']::-webkit-input-placeholder{color:#888}form input[type='text']:-moz-placeholder,form input[type='number']:-moz-placeholder,form input[type='search']:-moz-placeholder,form input[type='password']:-moz-placeholder,form input[type='email']:-moz-placeholder,form input[type='url']:-moz-placeholder{color:#888}form input[type='text']::-moz-placeholder,form input[type='number']::-moz-placeholder,form input[type='search']::-moz-placeholder,form input[type='password']::-moz-placeholder,form input[type='email']::-moz-placeholder,form input[type='url']::-moz-placeholder{color:#888}form input[type='text']:-ms-input-placeholder,form input[type='number']:-ms-input-placeholder,form input[type='search']:-ms-input-placeholder,form input[type='password']:-ms-input-placeholder,form input[type='email']:-ms-input-placeholder,form input[type='url']:-ms-input-placeholder{color:#888}form input[type='number']{padding-right:15px}form input[type='search']{-webkit-appearance:textfield}form input[type='search']::-webkit-search-decoration,form input[type='search']::-webkit-search-cancel-button{-webkit-appearance:none}form input[type='radio'],form input[type='image']{display:inline-block;margin-right:10px}form textarea{overflow:auto;height:auto;min-height:175px;padding:7px 10px;vertical-align:top}form select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-position:top 16px right 10px;padding:6px 30px 6px 10px;-moz-appearance:none;text-indent:0.01px;text-overflow:''}form select[multiple],form select[size]{height:auto;background-image:none;padding-top:10px}form select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}form select[disabled]{color:#888;background-image:none}form select::-ms-expand{display:none}form fieldset{background:none;margin-left:0;padding:0}.checkbox{visibility:hidden;width:0;height:0;margin-right:0;position:absolute}.checkbox+.checkbox-label{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:20px;position:relative}.checkbox+.checkbox-label:before{content:"";display:inline-block;width:20px;height:20px;position:absolute;top:0;left:0;background:url("../img/checkbox.svg") no-repeat;background-size:13px 13px;background-position:0px 3px}.checkbox:checked+.checkbox-label:before{background:url("../img/checkbox-checked.svg") no-repeat;background-position:0px 3px}.checkbox[disabled="disabled"]+.checkbox-label:before{cursor:default;opacity:0.5}.field-error,.errors{color:#DF382C}.field-error .errorlist,.errors .errorlist{margin:0}.field-error .errorlist li,.errors .errorlist li{margin:0 0 14px 0}.inline{display:inline-block;width:100%;font-size:0;margin-bottom:10px}.inline.error{background-color:#fdf5f5;box-shadow:0px 0px 0px 5px #fdf5f5}.inline.error .ng-invalid{border-color:#D2D2D2}.inline:last-of-type{margin-bottom:0}.inline label{display:inline-block;float:none;font-size:16px;margin:0}.inline input[type='submit'],.inline input[type='text'],.inline input[type='number'],.inline input[type='search'],.inline input[type='password'],.inline input[type='email'],.inline input[type='checkbox'],.inline select{display:inline-block;clear:none;margin:0;float:none;font-size:16px}.inline input[type='submit']:invalid,.inline input[type='text']:invalid,.inline input[type='number']:invalid,.inline input[type='search']:invalid,.inline input[type='password']:invalid,.inline input[type='email']:invalid,.inline input[type='checkbox']:invalid,.inline select:invalid{-moz-box-shadow:none}.inline input[type='submit']:-moz-submit-invalid,.inline input[type='text']:-moz-submit-invalid,.inline input[type='number']:-moz-submit-invalid,.inline input[type='search']:-moz-submit-invalid,.inline input[type='password']:-moz-submit-invalid,.inline input[type='email']:-moz-submit-invalid,.inline input[type='checkbox']:-moz-submit-invalid,.inline select:-moz-submit-invalid{box-shadow:none}.inline input[type='submit']:-moz-ui-invalid,.inline input[type='text']:-moz-ui-invalid,.inline input[type='number']:-moz-ui-invalid,.inline input[type='search']:-moz-ui-invalid,.inline input[type='password']:-moz-ui-invalid,.inline input[type='email']:-moz-ui-invalid,.inline input[type='checkbox']:-moz-ui-invalid,.inline select:-moz-ui-invalid{box-shadow:none}.inline div{float:none;margin:0}.inline input.cta-ubuntu,.inline a.link-cta-ubuntu,.inline button.cta-ubuntu{font-size:16px}.inline .icon{position:absolute;top:11px;right:10px;cursor:pointer}.inline .error-message{font-size:12px;color:#e85232;margin-top:10px;margin-bottom:10px;font-weight:normal}.form-inline label,.form-inline button,.form-inline input[type='submit'],.form-inline input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{display:inline-block;width:auto;vertical-align:middle;margin-bottom:0}.form-inline input,.form-inline input[type='submit'] input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{margin-left:20px}.form-inline fieldset{width:auto;display:inline-block;margin:0 40px 0 0}.controls{position:absolute;top:0;right:20px}.controls a,.controls button{margin-left:20px}.icon{background-size:16px 16px;width:16px;height:16px;padding:0;display:inline-block}.icon.icon__loading{background:url("../img/in_progress.png") no-repeat;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear}a.icon{cursor:pointer}dl dt{clear:left}dl dd{color:#888;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:37px;margin-bottom:10px !important}tags-input{outline:none}tags-input .host:focus{outline:none}tags-input .tags:focus,tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:4px 0 0;padding:0;list-style-type:none;width:100%;float:left}tags-input .tags .tag-item{display:inline-block;float:left;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;height:30px;line-height:30px;cursor:default;color:#000;padding-right:15px;position:relative;margin:0 11px 0 0}tags-input .tags .tag-item .remove-button{display:inline-block;width:12px;height:12px;text-indent:-999em;background:url("../img/icons/cross.svg") no-repeat;background-size:12px 12px;position:absolute;right:0;top:9px;cursor:pointer}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags .input{padding:7px 10px;width:100% !important;float:left;position:relative !important;left:0}tags-input .tags .input::-ms-clear{display:none}tags-input .autocomplete{float:left;width:100%}tags-input .autocomplete .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px}tags-input .autocomplete .suggestion-list li:hover{background:#EEE;cursor:pointer}tags-input[disabled] .host:focus{outline:none}tags-input[disabled] .tags{cursor:default}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .input{cursor:default}.tag-link{margin-right:10px}.tag-link:last-of-type:after{content:''}.table__data tags-input .tags{margin-top:-10px}.table__data tags-input .tags input{margin-left:0;width:50% !important;float:left}.pagination{margin:10px 0;text-align:center}.pagination .inactive{color:#AEA79F}.pagination a,.pagination span{margin:0 5px}.search{position:relative;padding-bottom:20px}.search input[type='search']{-webkit-appearance:textfield}.search .search__input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:none;padding:13px 20px;font-size:1.25em}.search .search__input::-webkit-input-placeholder{color:#000 !important}.search .search__input:-moz-placeholder{color:#000 !important}.search .search__input::-moz-placeholder{color:#000 !important}.search .search__input:-ms-input-placeholder{color:#000 !important}.search .search__input[disabled="disabled"]{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input[disabled="disabled"]+.search__submit.close{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:25px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0;border:none}.search .search__submit:hover{background-color:transparent;background-image:url("../img/search-icon.svg")}.search .search__submit.close{background-image:url("../img/icons/cross.svg");background-size:21px;margin-top:2px}.search .search__submit.close:hover{background-image:url("../img/icons/cross.svg")}.spinner-col{width:10px}.spinner{float:left;margin:0 auto;text-indent:-9999em}.spinner.spin{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}table{text-align:left;width:100%;margin-bottom:40px;border-collapse:separate;border-spacing:0;font-size:16px}table th,table td{background:transparent;text-align:left;padding:13px 10px}table th .checkbox+.checkbox-label::before,table td .checkbox+.checkbox-label::before{top:-2px}table thead th{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}table tbody tr:hover .icon-controls a{opacity:1}table tbody td{border:none;border-bottom:1px dotted #B2B2B2;position:relative}table tbody td.icon-controls{text-align:right}table tbody td.icon-controls a{opacity:0}table tbody td input[type="text"]{position:absolute;left:10px;top:6px;width:80%}.table-listing{text-align:left;width:100%;margin:0 0 40px 0;border-collapse:separate;border-spacing:0}.table-listing .table-listing__row:hover .table-listing__cell{background-color:#FFF}.table-listing .table-listing__row.error{background-color:#F3E3E2}.table-listing .table-listing__row.error .status{color:#DD3832}.table-listing .table-listing__row.progress{background-color:rgba(25,182,238,0.1)}.table-listing .table-listing__row.selected{background-color:#FFF}.table-listing .table-listing__header{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}.table-listing .table-listing__header .table-listing__header-link{background-repeat:no-repeat;background-position:top 8px right 0;color:#888}.table-listing .table-listing__header .table-listing__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table-listing .table-listing__header .table-listing__header-link:focus,.table-listing .table-listing__header .table-listing__header-link:active,.table-listing .table-listing__header .table-listing__header-link:visited{text-decoration:none}.table-listing .table-listing__header .table-listing__header-link.active{color:#333}.table-listing .table-listing__header .table-listing__header-link.sort{border-bottom:1px solid #333}.table-listing .table-listing__header .divide{width:1px;display:inline-block;background:#D2D2D2 none repeat scroll 0% 0%;height:10px;padding:0px;margin:0px 5px}.table-listing .table-listing__cell{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-bottom:1px dotted #B2B2B2;position:relative}.table-listing .table-listing__cell.icon-controls{text-align:right;opacity:0}.table-listing .table-listing__cell input,.table-listing .table-listing__cell select{position:absolute;left:10px;top:5px;width:80%}.table-listing .fixed{max-width:200px;min-width:200px;width:200px;padding-left:0}.table-listing__header .table-listing .fixed{padding-left:0}.table-listing.no-hover .table-listing__row:hover .table-listing__cell,.table-listing.no-hover .table-listing__row:hover td{background-color:transparent}.t1{width:1%}.t2{width:2%}.t3{width:3%}.t4{width:4%}.t5{width:5%}.t6{width:6%}.t7{width:7%}.t8{width:8%}.t9{width:9%}.t10{width:10%}.t11{width:11%}.t12{width:12%}.t13{width:13%}.t14{width:14%}.t15{width:15%}.t16{width:16%}.t17{width:17%}.t18{width:18%}.t19{width:19%}.t20{width:20%}.t21{width:21%}.t22{width:22%}.t23{width:23%}.t24{width:24%}.t25{width:25%}.t26{width:26%}.t27{width:27%}.t28{width:28%}.t29{width:29%}.t30{width:30%}.t31{width:31%}.t32{width:32%}.t33{width:33%}.t34{width:34%}.t35{width:35%}.t36{width:36%}.t37{width:37%}.t38{width:38%}.t39{width:39%}.t40{width:40%}.t41{width:41%}.t42{width:42%}.t43{width:43%}.t44{width:44%}.t45{width:45%}.t46{width:46%}.t47{width:47%}.t48{width:48%}.t49{width:49%}.t50{width:50%}.t51{width:51%}.t52{width:52%}.t53{width:53%}.t54{width:54%}.t55{width:55%}.t56{width:56%}.t57{width:57%}.t58{width:58%}.t59{width:59%}.t60{width:60%}.t61{width:61%}.t62{width:62%}.t63{width:63%}.t64{width:64%}.t65{width:65%}.t66{width:66%}.t67{width:67%}.t68{width:68%}.t69{width:69%}.t70{width:70%}.t71{width:71%}.t72{width:72%}.t73{width:73%}.t74{width:74%}.t75{width:75%}.t76{width:76%}.t77{width:77%}.t78{width:78%}.t79{width:79%}.t80{width:80%}.t81{width:81%}.t82{width:82%}.t83{width:83%}.t84{width:84%}.t85{width:85%}.t86{width:86%}.t87{width:87%}.t88{width:88%}.t89{width:89%}.t90{width:90%}.t91{width:91%}.t92{width:92%}.t93{width:93%}.t94{width:94%}.t95{width:95%}.t96{width:96%}.t97{width:97%}.t98{width:98%}.t99{width:99%}.t100{width:100%}.table__column--1{width:1%}.table__column--2{width:2%}.table__column--3{width:3%}.table__column--4{width:4%}.table__column--5{width:5%}.table__column--6{width:6%}.table__column--7{width:7%}.table__column--8{width:8%}.table__column--9{width:9%}.table__column--10{width:10%}.table__column--11{width:11%}.table__column--12{width:12%}.table__column--13{width:13%}.table__column--14{width:14%}.table__column--15{width:15%}.table__column--16{width:16%}.table__column--17{width:17%}.table__column--18{width:18%}.table__column--19{width:19%}.table__column--20{width:20%}.table__column--21{width:21%}.table__column--22{width:22%}.table__column--23{width:23%}.table__column--24{width:24%}.table__column--25{width:25%}.table__column--26{width:26%}.table__column--27{width:27%}.table__column--28{width:28%}.table__column--29{width:29%}.table__column--30{width:30%}.table__column--31{width:31%}.table__column--32{width:32%}.table__column--33{width:33%}.table__column--34{width:34%}.table__column--35{width:35%}.table__column--36{width:36%}.table__column--37{width:37%}.table__column--38{width:38%}.table__column--39{width:39%}.table__column--40{width:40%}.table__column--41{width:41%}.table__column--42{width:42%}.table__column--43{width:43%}.table__column--44{width:44%}.table__column--45{width:45%}.table__column--46{width:46%}.table__column--47{width:47%}.table__column--48{width:48%}.table__column--49{width:49%}.table__column--50{width:50%}.table__column--51{width:51%}.table__column--52{width:52%}.table__column--53{width:53%}.table__column--54{width:54%}.table__column--55{width:55%}.table__column--56{width:56%}.table__column--57{width:57%}.table__column--58{width:58%}.table__column--59{width:59%}.table__column--60{width:60%}.table__column--61{width:61%}.table__column--62{width:62%}.table__column--63{width:63%}.table__column--64{width:64%}.table__column--65{width:65%}.table__column--66{width:66%}.table__column--67{width:67%}.table__column--68{width:68%}.table__column--69{width:69%}.table__column--70{width:70%}.table__column--71{width:71%}.table__column--72{width:72%}.table__column--73{width:73%}.table__column--74{width:74%}.table__column--75{width:75%}.table__column--76{width:76%}.table__column--77{width:77%}.table__column--78{width:78%}.table__column--79{width:79%}.table__column--80{width:80%}.table__column--81{width:81%}.table__column--82{width:82%}.table__column--83{width:83%}.table__column--84{width:84%}.table__column--85{width:85%}.table__column--86{width:86%}.table__column--87{width:87%}.table__column--88{width:88%}.table__column--89{width:89%}.table__column--90{width:90%}.table__column--91{width:91%}.table__column--92{width:92%}.table__column--93{width:93%}.table__column--94{width:94%}.table__column--95{width:95%}.table__column--96{width:96%}.table__column--97{width:97%}.table__column--98{width:98%}.table__column--99{width:99%}.table__column--100{width:100%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}.table{display:table;border-color:#B2B2B2;border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}.table .table__row{float:left;width:100%;display:table-row;border-bottom:1px dotted #B2B2B2}.table .table__row:hover{background-color:#FFF}.table .table__row:hover .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row:hover .table__input.invalid{border-color:#D90000}.table .table__row:hover .table__input[disabled]{border-color:transparent;color:#333}.table .table__row:hover .table__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.table__row--no-hover:hover{background-color:transparent}.table .table__row.active{background-color:#FFF}.table .table__row.active .table__dropdown .table__data,.table .table__row.active .table__dropdown .table__input{color:#333}.table .table__row.active:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.active:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.active:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input[disabled]{border-color:transparent;color:#333}.table .table__row.active .table__dropdown{max-height:3000px}.table .table__row.selected .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.selected:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.selected:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.selected:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.disabled>.table__data{color:#888;pointer-events:none}.table .table__row.disabled>.table__data>.table__input{color:#888;pointer-events:none}.table .table__row.disabled .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.disabled:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.noEdit .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.noEdit:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;height:100%;background:none;border:0;text-align:left;float:left}.table .table__header a,.table .table__data a{color:#dd4814}.table .table__header a:hover,.table .table__data a:hover{cursor:pointer}.table .table__head{display:table-head;width:100%;box-sizing:border-box}.table .table__head .table__row{border-bottom:1px solid #B2B2B2}.table .table__head .table__row:hover{background-color:transparent}.table .table__head .table__header{font-size:13px;background:none;color:#888}.table .table__head a,.table .table__head .table__header-link{color:#888}.table .table__head a:hover,.table .table__head .table__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table .table__head a.active,.table .table__head .table__header-link.active{color:#333;text-decoration:none}.table .table__head a.sort,.table .table__head .table__header-link.sort{border-bottom:1px solid inherit}.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.table .table__label a{color:#BCBCBC}.table .table__label a:hover{color:#dd4814}.table .table__label.active a{color:#dd4814}.table .table__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.table .table__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.table .table__tags .table__tag{display:inline-block;margin-right:5px}.table .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.table .table__input.invalid{border-color:transparent}.table .table__input.invalid:focus{border-color:#D90000}.table .table__input[disabled]{border-color:transparent;color:#333}.table .table__input:focus{background-color:#FFF;border-color:#D2D2D2}.table label{font-size:13px;color:#BCBCBC}.table input,.table select{margin:0 0 0 -14px}.table input[type="radio"]{margin-left:0}.table ul li{margin:0;margin-top:14px}.table ul li:first-of-type{margin-top:0}.table .table__dropdown{width:100%;max-height:0;overflow-y:hidden}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative;max-height:0;transition:max-height 0.1s ease-out;overflow:hidden}.table .table__dropdown .table__dropdown-row.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown .table__dropdown-row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head{border-bottom:0}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head .table__header{color:#BCBCBC;font-size:13px}.table .table__dropdown .table__dropdown-row.no-border{border:0}.table .table__dropdown .table__dropdown-row.no-border:before{border:0}.table .table__dropdown .table__dropdown-row .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__dropdown--info{width:100%;max-height:0;background-color:transparent}.table .table__dropdown--info .table__dropdown-row--info{border-bottom:0;position:relative;max-height:0;transition:max-height 0.1s ease-out;overflow:hidden}.table .table__dropdown--info .table__dropdown-row--info.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown--info .table__dropdown-row--info .table__data{color:#BCBCBC}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}h4{font-size:20px;font-weight:300}pre{border:0;background-color:#FFF;border-radius:2px}pre code{counter-reset:line-numbering}pre code .line{float:left}pre code .line::before{content:counter(line-numbering);counter-increment:line-numbering;padding-right:1em;width:1.5em;text-align:right;opacity:0.5;pointer-events:none;user-select:none}.yui3-node-add-widget{width:65.9292%;margin-right:2.21238%}@media screen and (max-width: 768px){.yui3-node-add-widget{width:100%;margin:0}}.yui3-node-add-widget .buttons{margin-top:30px}.yui3-node-add-widget .add-link img.icon{margin-right:6px}.yui3-overlay{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#fff;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.5);box-shadow:0 0 10px 0 rgba(0,0,0,0.5)}.yui3-overlay ul{padding:5px 0}.yui3-overlay li{float:none}.yui3-overlay li:last-child a{border-bottom:none}.yui3-overlay a{display:block;padding:6px 20px;color:#dd4814 !important;border-bottom:1px solid #e5e2e0}.yui3-overlay a:focus,.yui3-overlay a:hover{background-color:#f2f2f2}.yui3-overlay-hidden{display:none}.yui3-widget-mask{background-color:#000;opacity:0.3}.yui3-panel{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#FFF;padding:50px 80px 50px 80px;-webkit-box-shadow:0 0 15px 0 #000;box-shadow:0 0 15px 0 #000}.yui3-panel .yui3-button{float:right}.yui3-panel .yui3-button.link-button{float:left;padding-left:0;padding-right:0;color:#dd4814;border:none;background:none;-webkit-box-shadow:none;box-shadow:none;font-size:13px}.yui3-widget-hd{margin-bottom:30px;font-size:24px}.yui3-widget-ft{margin-top:50px}.yui3-widget-button-wrapper{width:100%}.icon{margin-left:5px;width:16px;height:16px;display:inline-block;text-indent:999em;background-repeat:no-repeat;background-size:16px 16px;vertical-align:middle}.icon.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.icon.edit{background-image:url("../img/icons/edit.png");background-image:url("../img/icons/edit.svg"),none}.icon.delete{background-image:url("../img/icons/delete.png");background-image:url("../img/icons/delete.svg"),none}.icon.remove{background-image:url("../img/icons/filter-remove.svg"),none}.icon.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.icon.debug{background-image:url("../img/icons/debug.png");background-image:url("../img/icons/debug.svg"),none}.icon.success,.icon.tick{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.icon.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}.icon.partition{background-image:url("../img/icons/partition.svg")}.icon.add{background-image:url("../img/icons/add.svg")}.icon.tags{background-image:url("../img/icons/tags.svg")}.icon.mount{background-image:url("../img/icons/mount.svg")}.icon.unmount{background-image:url("../img/icons/unmount.svg")}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.right{float:right !important}.left{float:left !important}.border{border-top:1px dotted #B2B2B2}.border.bottom{border-bottom:1px dotted #B2B2B2}.border.solid{border-style:solid}.vertical-align{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.margin-top{margin-top:20px}.margin-top--five{margin-top:5px}.margin-top--ten{margin-top:10px}.margin-right{margin-right:20px !important}.margin-right--ten{margin-right:10px !important}.margin-bottom{margin-bottom:20px}.margin-left{margin-left:20px !important}.margin-left--ten{margin-left:10px !important}.margin-left--thirty{margin-left:30px !important}.padding-top{padding-top:20px}.padding-top--ten{padding-top:10px !important}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px !important}.padding-bottom--ten{padding-bottom:10px !important}.padding-left{padding-left:20px !important}.padding-left--30,.padding-left--thirty{padding-left:30px !important}.padding-left--35{padding-left:35px !important}.padding-left--45{padding-left:45px !important}.padding-left--50{padding-left:50px !important}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-margin{margin:0}.no-margin-top{margin-top:0 !important}.no-padding{padding:0}.no-padding-top{padding-top:0 !important}.no-padding-left{padding-left:0}.no-padding-bottom{padding-bottom:0 !important}.no-margin-bottom{margin-bottom:0}.width--auto{width:auto}.width--half{width:50%}.width--full{width:100%}.tooltip{position:relative}.tooltip::before{content:attr(data-tooltip);font-size:13px;font-weight:400;position:absolute;z-index:999;white-space:nowrap;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);background:#333;color:#FFF;padding:10px;text-indent:0;opacity:0;transition:opacity 0.4s ease-out;border-radius:5px;box-shadow:0px 1px 3px 0 rgba(51,51,51,0.2);top:-9999em}.tooltip::after{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;z-index:1000;transition:opacity 0.4s ease-out;border-top:5px solid #333;opacity:0;top:-9999em}.tooltip:hover::before{opacity:1 !important;top:-47px}.tooltip:hover::after{opacity:1 !important;top:-10px}.link-cta-ubuntu.tooltip:hover::before,.cta-ubuntu.tooltip:hover::before{top:-50px}.footer-wrapper{border-top:1px dotted #b2b2b2}.footer-wrapper footer.global{background-color:transparent;padding-top:0px;padding-right:20px;padding-left:20px;background-image:url("../img/logos/logo-ubuntu-orange.png");background-image:url("../img/logos/logo-ubuntu-orange.svg"),none;background-size:107px 25px;background-position:top 20px right 20px;background-repeat:no-repeat;max-width:1480px}.footer-wrapper footer.global p{font-size:0.875em}.footer-wrapper footer.global a{margin:0 5px;color:#dd4814}.footer-wrapper footer.global .version{font-weight:500;margin-right:5px}.footer-wrapper footer.global .copy{margin-top:10px}.footer-wrapper footer.global .legal{max-width:1440px}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto -112px;position:relative;background:rgba(255,255,255,0.6);padding-top:172px}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../img/backgrounds/image-background-paper.png");height:100%;width:100%;z-index:-1}.inner-wrapper{max-width:1480px;padding:0px 20px;margin:0 auto;position:relative}.push,.footer-wrapper{height:112px}.row{background-color:transparent;border-bottom:1px dotted #CCC}.row:last-child{border-bottom:none}header.banner{overflow:visible;z-index:20;position:fixed;top:0}header.banner .logo{padding-left:15px}header.banner nav.nav-primary{border-bottom:none}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:100px 30px;-webkit-background-size:100px 30px;-o-background-size:100px 30px;background-size:100px 30px;background-position:5px 9px;background-image:url("../img/logos/logo.png");background-image:url("../img/logos/logo.svg"),none}header.banner .nav-primary li:hover ul:after{display:none}@media screen and (max-width: 768px){header.banner .nav-primary ul{border-right:none}}header.banner #right-nav{float:right;margin-right:20px}@media screen and (max-width: 768px){header.banner #right-nav{margin-right:0}}header.banner #user-link{position:relative}@media screen and (max-width: 768px){header.banner #user-link{border-top:1px solid #d4d7d4;width:100%}}header.banner #user-link>a{padding-bottom:12px}@media screen and (max-width: 768px){header.banner #user-link>a{display:none}}header.banner #user-link .normal,header.banner #user-link .hover{margin-right:7px}@media screen and (max-width: 768px){header.banner #user-link .normal,header.banner #user-link .hover{display:none}}header.banner #user-link .hover{display:none}header.banner #user-link .nav{-webkit-border-radius:0px 0px 4px 4px;-moz-border-radius:0px 0px 4px 4px;border-radius:0px 0px 4px 4px;background-color:#FFF;border:none;display:none;position:absolute;right:0;top:48px;box-shadow:0px 2px 4px rgba(0,0,0,0.15)}@media screen and (min-width: 769px){header.banner #user-link .nav a.active{background:none;border:none}}header.banner #user-link .nav a:hover{background-color:transparent}@media screen and (max-width: 768px){header.banner #user-link .nav a:hover{background-color:#F8F8F8;color:#333}}@media screen and (max-width: 768px){header.banner #user-link .nav{background:none;position:relative;top:inherit;width:100%;box-shadow:none;float:left;padding:0}header.banner #user-link .nav li{border-bottom:1px solid #d4d7d4;width:100%;float:left}header.banner #user-link .nav li a{padding:10px 14px;width:100%}}@media screen and (max-width: 768px){header.banner #user-link:hover>a{background-color:transparent}}header.banner #user-link:hover .normal{display:none}header.banner #user-link:hover .hover{display:inline-block}@media screen and (max-width: 768px){header.banner #user-link:hover .hover{display:none}}header.banner #user-link:hover .nav{display:block}header.banner .nav-toggle{background-image:url("../img/icons/navigation-menu-plain.png");background-image:url("../img/icons/navigation-menu-plain.svg"),none;top:0}@media screen and (max-width: 768px){header.banner .nav-toggles .open{display:block}header.banner .nav-toggles .close{display:none}header.banner #canonlist:target ul{display:block}header.banner #canonlist:target+.nav-toggles .open{display:none}header.banner #canonlist:target+.nav-toggles .close{display:block}}.page-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;float:left;position:fixed;z-index:10;top:48px}.page-header .page-header__nav{position:absolute;top:10px;z-index:1000}.page-header .page-header__nav a{font-weight:300}.page-header .page-header__title{font-size:2em;width:auto;padding:31px 0;margin:0;float:left;font-size:32px}.page-header .page-header__title [contenteditable="true"]{display:inline-block;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-10px 0 -10px -10px;border-radius:2px;color:#333;cursor:default;font-size:32px}.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#FFF;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#d90000}.page-header .page-header__title [contenteditable="true"] br{display:none}.page-header .page-header__title .icon{vertical-align:3px;margin-right:10px}.page-header .page-header__title .page-header__title--identicator{font-size:0.6em;width:auto;display:inline-block;position:relative;top:0px;padding-left:20px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator a{color:#888}.page-header .page-header__title .page-header__title--identicator a:hover{text-decoration:none;border-bottom:3px solid #888}.page-header .page-header__title .page-header__title--identicator a:focus,.page-header .page-header__title .page-header__title--identicator a:active{text-decoration:none}.page-header .page-header__title .page-header__title--identicator a.active{color:#333;border-bottom:3px solid #dd4814}.page-header .page-header__title .page-header__title--identicator a.active:hover{text-decoration:none;cursor:default}.page-header .page-header__title .page-header__title--identicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore{font-size:14px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore:hover{border:0;text-decoration:underline}.page-header .page-header__title .link-cta-ubuntu,.page-header .page-header__title .alt{font-size:16px;margin-left:20px;position:relative;vertical-align:middle;margin-top:-5px}.page-header .page-header__actions{float:right;padding:34px 0;margin-bottom:0}.page-header .page-header__actions .page-header__cta{float:right;position:relative;height:auto;max-height:36px}.page-header .page-header__actions .page-header__cta .cta-group{float:right}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback{display:inline-block;position:relative;line-height:36px;text-align:right;color:#dd4814;margin-right:20px;cursor:pointer}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback:hover{text-decoration:underline}.page-header .page-header__dropdown{float:left;width:100%;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;border-color:#888 !important}.page-header .page-header__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out;border-top:none}.page-header .page-header__dropdown .page-header__feedback{border-top:1px dotted #888;display:inline-block;width:100%;padding:20px 0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;background-position:top 3px left 0px;background-repeat:no-repeat;padding:6px 0 5px 25px;width:auto;display:inline-block;position:relative}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none;background-position:0px 9px}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info.progress,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error.progress{width:100%}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress{padding-left:0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress .loader{position:relative;top:1px}.title .title__indicator .title__link{color:#888;font-size:20px}.title .title__indicator .title__link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.title .title__indicator .title__link:focus,.title .title__indicator .title__link:active{text-decoration:none}.title .title__indicator .title__link.active{color:#333;border-bottom:1px #dd4814 solid}.title .title__indicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:7px;right:7px}form.page-title-form{margin-bottom:30px}form.page-title-form input{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid transparent;background-color:transparent;font-size:36px;line-height:26px;color:#333;margin:6px 10px;padding:4px;height:auto;box-shadow:none}form.page-title-form input:hover{outline:none;background:#FFF;border-color:#D2D2D2;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}form.page-title-form input:focus{border:1px solid #dd4814;background-color:#fff;outline:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}#loader{width:10px;margin:16px auto 0 auto}#importing{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;position:relative}#importing .spinner{position:absolute;left:15px}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.selector{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:20px;background:#FFF;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;width:100%;float:left}.selector h2{font-size:1em;font-weight:300}.selector h2 img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;background:url("../img/icons/help.svg") no-repeat;width:16px;height:16px;padding-left:16px;margin-left:5px}.selector .selector-available,.selector .selector-chosen{width:46%;float:left;margin:0;text-align:left}@media screen and (max-width: 768px){.selector .selector-available,.selector .selector-chosen{width:100%}}.selector .selector-available h2,.selector .selector-chosen h2{background:none;border:none}.selector .selector-available select,.selector .selector-chosen select{margin-bottom:10px}.selector ul.selector-chooser{width:8%;float:left;margin:20% 0 0}@media screen and (max-width: 768px){.selector ul.selector-chooser{width:100%;margin:0 0 10px;text-align:center}}.selector ul.selector-chooser li{width:100%;text-align:center}@media screen and (max-width: 768px){.selector ul.selector-chooser li{width:auto;display:inline-block;height:16px;width:16px;margin:0 20px}}.selector ul.selector-chooser li a{display:block;text-indent:999em;width:16px;height:16px;overflow:hidden;margin:0 auto}.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_right.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_down.svg")}}.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_left.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_up.svg")}}.selector .selector-filter img{display:none}.selector .selector-filter input{background-image:url("../img/search-orange.png");background-repeat:no-repeat;background-position:top 7px right 8px}.selector select#id_mac_addresses_to.filtered{height:269px !important}.nodes{position:relative}.nodes .search{position:absolute;right:0}.nodes .search input[type='submit']{position:absolute;top:8px;right:12px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0}.nodes .search input[type='submit']:hover{color:transparent;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat}@media screen and (max-width: 768px){.nodes .search{position:relative}}@media screen and (max-width: 768px){.nodes .actions select{width:100%;margin-bottom:20px}.nodes .actions input{position:absolute;right:0;top:0}}.powerstates{width:14px;height:15px;display:inline-block}.powerstates.power-on{background:transparent url("../img/icons/power-on.svg") left top no-repeat}.powerstates.power-off{background:transparent url("../img/icons/power-off.svg") left top no-repeat}.powerstates.power-unknown{background:none}.powerstates.power-error{background:transparent url("../img/icons/power-error.svg") left top no-repeat}.powerstates.power-check-ok{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#33CC00}.powerstates.power-check-error{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#FF0000}.node-actions .link-cta-ubuntu,.node-actions .cta-ubuntu{margin-bottom:10px;float:left;font-size:16px}.buttons{margin-top:30px}#network-interfaces li{list-style-type:none}#content-discovery-data{padding-top:20px;margin-top:20px;border-top:1px dotted #B2B2B2}#content-discovery-data .slider{height:0;overflow:hidden}.slider{padding-top:0 !important}.slider .content{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#FFF;border:1px solid #EEE;border-top:none;padding:20px}.slider .content pre{margin:0}.slider .tabs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;padding:8px 20px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;border:1px solid #EEE}.add-machine__list{padding:13px 0 20px;border-top:1px dotted #888;margin-bottom:0}.add-machine__list .add-machine__details{background:transparent url("../img/icons/accordion-open.svg") top 12px right 10px no-repeat}.add-machine__list .add-machine__details>div{margin-bottom:0}.add-machine__list .add-machine__details .add-machine__details-form{display:none}.add-machine__list .add-machine__details.active{background-image:url("../img/icons/accordion-close.svg")}.add-machine__list .add-machine__details.active .add-machine__details-form{display:block}.power-status{display:inline-block;font-size:100%;padding-left:0}.power-status--power{display:inline-block;margin-left:20px;position:relative;font-size:100%}.power-status--power.checking{color:#2AB7EC;background:url("../img/status_in_progress.svg");padding-left:20px}.power-status--power.on{padding-left:20px;color:#38B44A;background:transparent url("../img/icons/power-on.svg") left top 4px no-repeat}.power-status--power.off{padding-left:20px;color:#D2D2D2;background:transparent url("../img/icons/power-off.svg") left top 4px no-repeat}.power-status--power.error{padding-left:20px;color:#DB3832;background:transparent url("../img/icons/power-error.svg") left top 4px no-repeat}.power-status--power .power-check{font-size:0.75em;color:#D2D2D2;display:inline-block;padding:0}.power-status--power .power-check .power-check__link{color:#888;text-decoration:none;margin-left:5px}.power-status--power .power-check .power-check__link:hover{border-bottom:0 !important;text-decoration:underline !important}.loading,.loader{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0;display:inline-block}.details__used{color:#BCBCBC}.details .details__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.details .details__label a{color:#BCBCBC}.details .details__label a:hover{color:#dd4814}.details .details__label.active a{color:#dd4814}.details .details__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.details .details__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.details .table-row .details__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.details .table-row .details__text{line-height:37px}.details .table-row:hover .details__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.details .table-row:hover .details__controls{z-index:1;opacity:1}.details .table-row:hover .details__controls--secondary{z-index:1;opacity:1}.details .table-row.active:hover .details__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.details .table-row.active:hover .details__controls{opacity:0;z-index:-1000;pointer-events:none}.details .table-row.active:hover .details__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.details .table-row label{font-size:13px;color:#BCBCBC}.details .table-row input,.details .table-row select{margin:0 0 0 -14px}.details .table-row input[type="radio"]{margin-left:0}.details .details__dropdown .details__row{border-bottom:0;position:relative}.details .details__dropdown .details__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:relative;height:1px;content:''}.details .details__dropdown .details__row.details__row--head{border-bottom:0}.details .details__dropdown .details__row.details__row--head .table-cell{color:#BCBCBC;font-size:13px}.details .details__dropdown .details__row.no-border{border:0}.details .details__dropdown .details__row.no-border:before{border:0}.details .details__dropdown--info .table-row{border-bottom:0}.details .details__dropdown--info .table-cell{color:#BCBCBC} | ||
2291 | 5 | >>>>>>> MERGE-SOURCE | ||
2292 | 2 | 6 | ||
2293 | === modified file 'src/maasserver/testing/factory.py' | |||
2294 | --- src/maasserver/testing/factory.py 2016-01-08 05:09:21 +0000 | |||
2295 | +++ src/maasserver/testing/factory.py 2016-01-10 08:29:39 +0000 | |||
2296 | @@ -343,11 +343,19 @@ | |||
2297 | 343 | if interface: | 343 | if interface: |
2298 | 344 | self.make_Interface( | 344 | self.make_Interface( |
2299 | 345 | INTERFACE_TYPE.PHYSICAL, node=node, vlan=vlan, fabric=fabric) | 345 | INTERFACE_TYPE.PHYSICAL, node=node, vlan=vlan, fabric=fabric) |
2300 | 346 | <<<<<<< TREE | ||
2301 | 346 | if node_type == NODE_TYPE.MACHINE and with_boot_disk: | 347 | if node_type == NODE_TYPE.MACHINE and with_boot_disk: |
2302 | 347 | root_partition = self.make_Partition(node=node) | 348 | root_partition = self.make_Partition(node=node) |
2303 | 348 | acquired = node.status in ALLOCATED_NODE_STATUSES | 349 | acquired = node.status in ALLOCATED_NODE_STATUSES |
2304 | 349 | self.make_Filesystem( | 350 | self.make_Filesystem( |
2305 | 350 | partition=root_partition, mount_point='/', acquired=acquired) | 351 | partition=root_partition, mount_point='/', acquired=acquired) |
2306 | 352 | ======= | ||
2307 | 353 | if installable and with_boot_disk: | ||
2308 | 354 | root_partition = self.make_Partition(node=node) | ||
2309 | 355 | acquired = node.status in ALLOCATED_NODE_STATUSES | ||
2310 | 356 | self.make_Filesystem( | ||
2311 | 357 | partition=root_partition, mount_point='/', acquired=acquired) | ||
2312 | 358 | >>>>>>> MERGE-SOURCE | ||
2313 | 351 | 359 | ||
2314 | 352 | # Update the 'updated'/'created' fields with a call to 'update' | 360 | # Update the 'updated'/'created' fields with a call to 'update' |
2315 | 353 | # preventing a call to save() from overriding the values. | 361 | # preventing a call to save() from overriding the values. |
2316 | 354 | 362 | ||
2317 | === modified file 'src/maasserver/tests/test_auth.py' | |||
2318 | --- src/maasserver/tests/test_auth.py 2015-12-10 01:04:27 +0000 | |||
2319 | +++ src/maasserver/tests/test_auth.py 2016-01-10 08:29:39 +0000 | |||
2320 | @@ -223,6 +223,7 @@ | |||
2321 | 223 | user, NODE_PERMISSION.ADMIN, factory.make_FilesystemGroup())) | 223 | user, NODE_PERMISSION.ADMIN, factory.make_FilesystemGroup())) |
2322 | 224 | 224 | ||
2323 | 225 | 225 | ||
2324 | 226 | <<<<<<< TREE | ||
2325 | 226 | class TestMAASAuthorizationBackendForDeviceInterface(MAASServerTestCase): | 227 | class TestMAASAuthorizationBackendForDeviceInterface(MAASServerTestCase): |
2326 | 227 | 228 | ||
2327 | 228 | def test_owner_can_edit_device_interface(self): | 229 | def test_owner_can_edit_device_interface(self): |
2328 | @@ -251,6 +252,36 @@ | |||
2329 | 251 | user, NODE_PERMISSION.EDIT, interface)) | 252 | user, NODE_PERMISSION.EDIT, interface)) |
2330 | 252 | 253 | ||
2331 | 253 | 254 | ||
2332 | 255 | ======= | ||
2333 | 256 | class TestMAASAuthorizationBackendForDeviceInterface(MAASServerTestCase): | ||
2334 | 257 | |||
2335 | 258 | def test_owner_can_edit_device_interface(self): | ||
2336 | 259 | backend = MAASAuthorizationBackend() | ||
2337 | 260 | user = factory.make_User() | ||
2338 | 261 | parent = factory.make_Node() | ||
2339 | 262 | device = factory.make_Node( | ||
2340 | 263 | owner=user, installable=False, parent=parent) | ||
2341 | 264 | interface = factory.make_Interface( | ||
2342 | 265 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
2343 | 266 | self.assertTrue( | ||
2344 | 267 | backend.has_perm( | ||
2345 | 268 | user, NODE_PERMISSION.EDIT, interface)) | ||
2346 | 269 | |||
2347 | 270 | def test_non_owner_cannot_edit_device_interface(self): | ||
2348 | 271 | backend = MAASAuthorizationBackend() | ||
2349 | 272 | user = factory.make_User() | ||
2350 | 273 | owner = factory.make_User() | ||
2351 | 274 | parent = factory.make_Node() | ||
2352 | 275 | device = factory.make_Node( | ||
2353 | 276 | owner=owner, installable=False, parent=parent) | ||
2354 | 277 | interface = factory.make_Interface( | ||
2355 | 278 | INTERFACE_TYPE.PHYSICAL, node=device) | ||
2356 | 279 | self.assertFalse( | ||
2357 | 280 | backend.has_perm( | ||
2358 | 281 | user, NODE_PERMISSION.EDIT, interface)) | ||
2359 | 282 | |||
2360 | 283 | |||
2361 | 284 | >>>>>>> MERGE-SOURCE | ||
2362 | 254 | class TestMAASAuthorizationBackendForNetworking(MAASServerTestCase): | 285 | class TestMAASAuthorizationBackendForNetworking(MAASServerTestCase): |
2363 | 255 | 286 | ||
2364 | 256 | scenarios = ( | 287 | scenarios = ( |
2365 | 257 | 288 | ||
2366 | === modified file 'src/maasserver/tests/test_forms_blockdevice.py' | |||
2367 | === modified file 'src/maasserver/tests/test_forms_partition.py' | |||
2368 | === modified file 'src/maasserver/tests/test_forms_raid.py' | |||
2369 | === modified file 'src/maasserver/tests/test_forms_subnet.py' | |||
2370 | === modified file 'src/maasserver/tests/test_forms_volume_group.py' | |||
2371 | === modified file 'src/maasserver/tests/test_node_constraint_filter_forms.py' | |||
2372 | --- src/maasserver/tests/test_node_constraint_filter_forms.py 2016-01-05 21:07:22 +0000 | |||
2373 | +++ src/maasserver/tests/test_node_constraint_filter_forms.py 2016-01-10 08:29:39 +0000 | |||
2374 | @@ -974,6 +974,7 @@ | |||
2375 | 974 | fabric=fabric2, vlan=vlan2) | 974 | fabric=fabric2, vlan=vlan2) |
2376 | 975 | 975 | ||
2377 | 976 | form = AcquireNodeForm({ | 976 | form = AcquireNodeForm({ |
2378 | 977 | <<<<<<< TREE | ||
2379 | 977 | 'interfaces': 'fabric:fabric_class=1g;vlan:vid=1'}) | 978 | 'interfaces': 'fabric:fabric_class=1g;vlan:vid=1'}) |
2380 | 978 | self.assertTrue(form.is_valid(), dict(form.errors)) | 979 | self.assertTrue(form.is_valid(), dict(form.errors)) |
2381 | 979 | filtered_nodes, _, _ = form.filter_nodes(Machine.objects) | 980 | filtered_nodes, _, _ = form.filter_nodes(Machine.objects) |
2382 | @@ -1032,6 +1033,66 @@ | |||
2383 | 1032 | self.assertTrue(form.is_valid(), dict(form.errors)) | 1033 | self.assertTrue(form.is_valid(), dict(form.errors)) |
2384 | 1033 | filtered_nodes, _, _ = form.filter_nodes(Machine.objects) | 1034 | filtered_nodes, _, _ = form.filter_nodes(Machine.objects) |
2385 | 1034 | self.assertItemsEqual([node1, node2], filtered_nodes) | 1035 | self.assertItemsEqual([node1, node2], filtered_nodes) |
2386 | 1036 | ======= | ||
2387 | 1037 | u'interfaces': u'fabric:fabric_class=1g;vlan:vid=1'}) | ||
2388 | 1038 | self.assertTrue(form.is_valid(), dict(form.errors)) | ||
2389 | 1039 | filtered_nodes, _, _ = form.filter_nodes(Node.nodes) | ||
2390 | 1040 | self.assertItemsEqual([node1], filtered_nodes) | ||
2391 | 1041 | |||
2392 | 1042 | form = AcquireNodeForm({ | ||
2393 | 1043 | u'interfaces': u'label:fabric_class=10g;vlan:vid=2'}) | ||
2394 | 1044 | self.assertTrue(form.is_valid(), dict(form.errors)) | ||
2395 | 1045 | filtered_nodes, _, _ = form.filter_nodes(Node.nodes) | ||
2396 | 1046 | self.assertItemsEqual([node2], filtered_nodes) | ||
2397 | 1047 | |||
2398 | 1048 | def test_interfaces_filters_same_key_treated_as_OR_operation(self): | ||
2399 | 1049 | fabric1 = factory.make_Fabric(class_type="1g") | ||
2400 | 1050 | fabric2 = factory.make_Fabric(class_type="10g") | ||
2401 | 1051 | vlan1 = factory.make_VLAN(vid=1, fabric=fabric1) | ||
2402 | 1052 | vlan2 = factory.make_VLAN(vid=2, fabric=fabric2) | ||
2403 | 1053 | node1 = factory.make_Node_with_Interface_on_Subnet( | ||
2404 | 1054 | fabric=fabric1, vlan=vlan1) | ||
2405 | 1055 | node2 = factory.make_Node_with_Interface_on_Subnet( | ||
2406 | 1056 | fabric=fabric2, vlan=vlan2) | ||
2407 | 1057 | |||
2408 | 1058 | form = AcquireNodeForm({ | ||
2409 | 1059 | u'interfaces': | ||
2410 | 1060 | u'fabric:fabric_class=1g,fabric_class=10g;vlan:vid=1'}) | ||
2411 | 1061 | self.assertTrue(form.is_valid(), dict(form.errors)) | ||
2412 | 1062 | filtered_nodes, _, _ = form.filter_nodes(Node.nodes) | ||
2413 | 1063 | self.assertItemsEqual([node1], filtered_nodes) | ||
2414 | 1064 | |||
2415 | 1065 | form = AcquireNodeForm({ | ||
2416 | 1066 | u'interfaces': | ||
2417 | 1067 | u'label:fabric_class=10g,fabric_class=1g;vlan:vid=2'}) | ||
2418 | 1068 | self.assertTrue(form.is_valid(), dict(form.errors)) | ||
2419 | 1069 | filtered_nodes, _, _ = form.filter_nodes(Node.nodes) | ||
2420 | 1070 | self.assertItemsEqual([node2], filtered_nodes) | ||
2421 | 1071 | >>>>>>> MERGE-SOURCE | ||
2422 | 1072 | |||
2423 | 1073 | def test_interfaces_filters_different_key_treated_as_AND_operation(self): | ||
2424 | 1074 | fabric1 = factory.make_Fabric(class_type="1g") | ||
2425 | 1075 | fabric2 = factory.make_Fabric(class_type="10g") | ||
2426 | 1076 | vlan1 = factory.make_VLAN(vid=1, fabric=fabric1) | ||
2427 | 1077 | vlan2 = factory.make_VLAN(vid=2, fabric=fabric2) | ||
2428 | 1078 | node1 = factory.make_Node_with_Interface_on_Subnet( | ||
2429 | 1079 | fabric=fabric1, vlan=vlan1) | ||
2430 | 1080 | node2 = factory.make_Node_with_Interface_on_Subnet( | ||
2431 | 1081 | fabric=fabric2, vlan=vlan2) | ||
2432 | 1082 | |||
2433 | 1083 | form = AcquireNodeForm({ | ||
2434 | 1084 | u'interfaces': | ||
2435 | 1085 | u'none:fabric_class=1g,vid=2'}) | ||
2436 | 1086 | self.assertTrue(form.is_valid(), dict(form.errors)) | ||
2437 | 1087 | filtered_nodes, _, _ = form.filter_nodes(Node.nodes) | ||
2438 | 1088 | self.assertItemsEqual([], filtered_nodes) | ||
2439 | 1089 | |||
2440 | 1090 | form = AcquireNodeForm({ | ||
2441 | 1091 | u'interfaces': | ||
2442 | 1092 | u'any:fabric_class=10g,fabric_class=1g,vid=1,vid=2'}) | ||
2443 | 1093 | self.assertTrue(form.is_valid(), dict(form.errors)) | ||
2444 | 1094 | filtered_nodes, _, _ = form.filter_nodes(Node.nodes) | ||
2445 | 1095 | self.assertItemsEqual([node1, node2], filtered_nodes) | ||
2446 | 1035 | 1096 | ||
2447 | 1036 | def test_combined_constraints(self): | 1097 | def test_combined_constraints(self): |
2448 | 1037 | tag_big = factory.make_Tag(name='big') | 1098 | tag_big = factory.make_Tag(name='big') |
2449 | 1038 | 1099 | ||
2450 | === modified file 'src/maasserver/tests/test_preseed_storage.py' | |||
2451 | === modified file 'src/maasserver/tests/test_storage_layouts.py' | |||
2452 | --- src/maasserver/tests/test_storage_layouts.py 2015-12-01 18:12:59 +0000 | |||
2453 | +++ src/maasserver/tests/test_storage_layouts.py 2016-01-10 08:29:39 +0000 | |||
2454 | @@ -422,9 +422,15 @@ | |||
2455 | 422 | 422 | ||
2456 | 423 | def assertEFIPartition(self, partition, boot_disk): | 423 | def assertEFIPartition(self, partition, boot_disk): |
2457 | 424 | self.assertIsNotNone(partition) | 424 | self.assertIsNotNone(partition) |
2458 | 425 | <<<<<<< TREE | ||
2459 | 425 | self.assertEqual( | 426 | self.assertEqual( |
2460 | 426 | round_size_to_nearest_block( | 427 | round_size_to_nearest_block( |
2461 | 427 | EFI_PARTITION_SIZE, boot_disk.block_size), | 428 | EFI_PARTITION_SIZE, boot_disk.block_size), |
2462 | 429 | ======= | ||
2463 | 430 | self.assertEquals( | ||
2464 | 431 | round_size_to_nearest_block( | ||
2465 | 432 | EFI_PARTITION_SIZE, boot_disk.block_size), | ||
2466 | 433 | >>>>>>> MERGE-SOURCE | ||
2467 | 428 | partition.size) | 434 | partition.size) |
2468 | 429 | self.assertThat( | 435 | self.assertThat( |
2469 | 430 | partition.get_effective_filesystem(), MatchesStructure.byEquality( | 436 | partition.get_effective_filesystem(), MatchesStructure.byEquality( |
2470 | @@ -462,8 +468,13 @@ | |||
2471 | 462 | partitions = partition_table.partitions.order_by('id').all() | 468 | partitions = partition_table.partitions.order_by('id').all() |
2472 | 463 | root_partition = partitions[0] | 469 | root_partition = partitions[0] |
2473 | 464 | self.assertIsNotNone(root_partition) | 470 | self.assertIsNotNone(root_partition) |
2474 | 471 | <<<<<<< TREE | ||
2475 | 465 | self.assertEqual( | 472 | self.assertEqual( |
2476 | 466 | round_size_to_nearest_block( | 473 | round_size_to_nearest_block( |
2477 | 474 | ======= | ||
2478 | 475 | self.assertEquals( | ||
2479 | 476 | round_size_to_nearest_block( | ||
2480 | 477 | >>>>>>> MERGE-SOURCE | ||
2481 | 467 | boot_disk.size - PARTITION_TABLE_EXTRA_SPACE, | 478 | boot_disk.size - PARTITION_TABLE_EXTRA_SPACE, |
2482 | 468 | PARTITION_ALIGNMENT_SIZE, | 479 | PARTITION_ALIGNMENT_SIZE, |
2483 | 469 | False), | 480 | False), |
2484 | @@ -491,11 +502,19 @@ | |||
2485 | 491 | partitions = partition_table.partitions.order_by('id').all() | 502 | partitions = partition_table.partitions.order_by('id').all() |
2486 | 492 | root_partition = partitions[0] | 503 | root_partition = partitions[0] |
2487 | 493 | self.assertIsNotNone(root_partition) | 504 | self.assertIsNotNone(root_partition) |
2488 | 505 | <<<<<<< TREE | ||
2489 | 494 | self.assertEqual( | 506 | self.assertEqual( |
2490 | 495 | round_size_to_nearest_block( | 507 | round_size_to_nearest_block( |
2491 | 496 | MAX_PARTITION_SIZE_FOR_MBR, | 508 | MAX_PARTITION_SIZE_FOR_MBR, |
2492 | 497 | PARTITION_ALIGNMENT_SIZE, | 509 | PARTITION_ALIGNMENT_SIZE, |
2493 | 498 | False), | 510 | False), |
2494 | 511 | ======= | ||
2495 | 512 | self.assertEquals( | ||
2496 | 513 | round_size_to_nearest_block( | ||
2497 | 514 | MAX_PARTITION_SIZE_FOR_MBR, | ||
2498 | 515 | PARTITION_ALIGNMENT_SIZE, | ||
2499 | 516 | False), | ||
2500 | 517 | >>>>>>> MERGE-SOURCE | ||
2501 | 499 | root_partition.size) | 518 | root_partition.size) |
2502 | 500 | self.assertThat( | 519 | self.assertThat( |
2503 | 501 | root_partition.get_effective_filesystem(), | 520 | root_partition.get_effective_filesystem(), |
2504 | @@ -524,8 +543,13 @@ | |||
2505 | 524 | # Validate root partition. | 543 | # Validate root partition. |
2506 | 525 | root_partition = partitions[1] | 544 | root_partition = partitions[1] |
2507 | 526 | self.assertIsNotNone(root_partition) | 545 | self.assertIsNotNone(root_partition) |
2508 | 546 | <<<<<<< TREE | ||
2509 | 527 | self.assertEqual( | 547 | self.assertEqual( |
2510 | 528 | round_size_to_nearest_block( | 548 | round_size_to_nearest_block( |
2511 | 549 | ======= | ||
2512 | 550 | self.assertEquals( | ||
2513 | 551 | round_size_to_nearest_block( | ||
2514 | 552 | >>>>>>> MERGE-SOURCE | ||
2515 | 529 | boot_disk.size - EFI_PARTITION_SIZE - | 553 | boot_disk.size - EFI_PARTITION_SIZE - |
2516 | 530 | PARTITION_TABLE_EXTRA_SPACE, | 554 | PARTITION_TABLE_EXTRA_SPACE, |
2517 | 531 | PARTITION_ALIGNMENT_SIZE, | 555 | PARTITION_ALIGNMENT_SIZE, |
2518 | @@ -562,9 +586,15 @@ | |||
2519 | 562 | # Validate boot partition. | 586 | # Validate boot partition. |
2520 | 563 | boot_partition = partitions[1] | 587 | boot_partition = partitions[1] |
2521 | 564 | self.assertIsNotNone(boot_partition) | 588 | self.assertIsNotNone(boot_partition) |
2522 | 589 | <<<<<<< TREE | ||
2523 | 565 | self.assertEqual( | 590 | self.assertEqual( |
2524 | 566 | round_size_to_nearest_block( | 591 | round_size_to_nearest_block( |
2525 | 567 | boot_size, PARTITION_ALIGNMENT_SIZE, False), | 592 | boot_size, PARTITION_ALIGNMENT_SIZE, False), |
2526 | 593 | ======= | ||
2527 | 594 | self.assertEquals( | ||
2528 | 595 | round_size_to_nearest_block( | ||
2529 | 596 | boot_size, PARTITION_ALIGNMENT_SIZE, False), | ||
2530 | 597 | >>>>>>> MERGE-SOURCE | ||
2531 | 568 | boot_partition.size) | 598 | boot_partition.size) |
2532 | 569 | self.assertThat( | 599 | self.assertThat( |
2533 | 570 | boot_partition.get_effective_filesystem(), | 600 | boot_partition.get_effective_filesystem(), |
2534 | @@ -577,8 +607,13 @@ | |||
2535 | 577 | # Validate root partition. | 607 | # Validate root partition. |
2536 | 578 | root_partition = partitions[2] | 608 | root_partition = partitions[2] |
2537 | 579 | self.assertIsNotNone(root_partition) | 609 | self.assertIsNotNone(root_partition) |
2538 | 610 | <<<<<<< TREE | ||
2539 | 580 | self.assertEqual( | 611 | self.assertEqual( |
2540 | 581 | round_size_to_nearest_block( | 612 | round_size_to_nearest_block( |
2541 | 613 | ======= | ||
2542 | 614 | self.assertEquals( | ||
2543 | 615 | round_size_to_nearest_block( | ||
2544 | 616 | >>>>>>> MERGE-SOURCE | ||
2545 | 582 | boot_disk.size - boot_partition.size - | 617 | boot_disk.size - boot_partition.size - |
2546 | 583 | EFI_PARTITION_SIZE - PARTITION_TABLE_EXTRA_SPACE, | 618 | EFI_PARTITION_SIZE - PARTITION_TABLE_EXTRA_SPACE, |
2547 | 584 | PARTITION_ALIGNMENT_SIZE, | 619 | PARTITION_ALIGNMENT_SIZE, |
2548 | @@ -615,9 +650,15 @@ | |||
2549 | 615 | # Validate root partition. | 650 | # Validate root partition. |
2550 | 616 | root_partition = partitions[1] | 651 | root_partition = partitions[1] |
2551 | 617 | self.assertIsNotNone(root_partition) | 652 | self.assertIsNotNone(root_partition) |
2552 | 653 | <<<<<<< TREE | ||
2553 | 618 | self.assertEqual( | 654 | self.assertEqual( |
2554 | 619 | round_size_to_nearest_block( | 655 | round_size_to_nearest_block( |
2555 | 620 | root_size, PARTITION_ALIGNMENT_SIZE, False), | 656 | root_size, PARTITION_ALIGNMENT_SIZE, False), |
2556 | 657 | ======= | ||
2557 | 658 | self.assertEquals( | ||
2558 | 659 | round_size_to_nearest_block( | ||
2559 | 660 | root_size, PARTITION_ALIGNMENT_SIZE, False), | ||
2560 | 661 | >>>>>>> MERGE-SOURCE | ||
2561 | 621 | root_partition.size) | 662 | root_partition.size) |
2562 | 622 | self.assertThat( | 663 | self.assertThat( |
2563 | 623 | root_partition.get_effective_filesystem(), | 664 | root_partition.get_effective_filesystem(), |
2564 | @@ -653,9 +694,15 @@ | |||
2565 | 653 | # Validate boot partition. | 694 | # Validate boot partition. |
2566 | 654 | boot_partition = partitions[1] | 695 | boot_partition = partitions[1] |
2567 | 655 | self.assertIsNotNone(boot_partition) | 696 | self.assertIsNotNone(boot_partition) |
2568 | 697 | <<<<<<< TREE | ||
2569 | 656 | self.assertEqual( | 698 | self.assertEqual( |
2570 | 657 | round_size_to_nearest_block( | 699 | round_size_to_nearest_block( |
2571 | 658 | boot_size, PARTITION_ALIGNMENT_SIZE, False), | 700 | boot_size, PARTITION_ALIGNMENT_SIZE, False), |
2572 | 701 | ======= | ||
2573 | 702 | self.assertEquals( | ||
2574 | 703 | round_size_to_nearest_block( | ||
2575 | 704 | boot_size, PARTITION_ALIGNMENT_SIZE, False), | ||
2576 | 705 | >>>>>>> MERGE-SOURCE | ||
2577 | 659 | boot_partition.size) | 706 | boot_partition.size) |
2578 | 660 | self.assertThat( | 707 | self.assertThat( |
2579 | 661 | boot_partition.get_effective_filesystem(), | 708 | boot_partition.get_effective_filesystem(), |
2580 | @@ -668,9 +715,15 @@ | |||
2581 | 668 | # Validate root partition. | 715 | # Validate root partition. |
2582 | 669 | root_partition = partitions[2] | 716 | root_partition = partitions[2] |
2583 | 670 | self.assertIsNotNone(root_partition) | 717 | self.assertIsNotNone(root_partition) |
2584 | 718 | <<<<<<< TREE | ||
2585 | 671 | self.assertEqual( | 719 | self.assertEqual( |
2586 | 672 | round_size_to_nearest_block( | 720 | round_size_to_nearest_block( |
2587 | 673 | root_size, PARTITION_ALIGNMENT_SIZE, False), | 721 | root_size, PARTITION_ALIGNMENT_SIZE, False), |
2588 | 722 | ======= | ||
2589 | 723 | self.assertEquals( | ||
2590 | 724 | round_size_to_nearest_block( | ||
2591 | 725 | root_size, PARTITION_ALIGNMENT_SIZE, False), | ||
2592 | 726 | >>>>>>> MERGE-SOURCE | ||
2593 | 674 | root_partition.size) | 727 | root_partition.size) |
2594 | 675 | self.assertThat( | 728 | self.assertThat( |
2595 | 676 | root_partition.get_effective_filesystem(), | 729 | root_partition.get_effective_filesystem(), |
2596 | @@ -711,9 +764,15 @@ | |||
2597 | 711 | root_partition = root_partition_table.partitions.order_by( | 764 | root_partition = root_partition_table.partitions.order_by( |
2598 | 712 | 'id').all()[0] | 765 | 'id').all()[0] |
2599 | 713 | self.assertIsNotNone(root_partition) | 766 | self.assertIsNotNone(root_partition) |
2600 | 767 | <<<<<<< TREE | ||
2601 | 714 | self.assertEqual( | 768 | self.assertEqual( |
2602 | 715 | round_size_to_nearest_block( | 769 | round_size_to_nearest_block( |
2603 | 716 | root_size, PARTITION_ALIGNMENT_SIZE, False), | 770 | root_size, PARTITION_ALIGNMENT_SIZE, False), |
2604 | 771 | ======= | ||
2605 | 772 | self.assertEquals( | ||
2606 | 773 | round_size_to_nearest_block( | ||
2607 | 774 | root_size, PARTITION_ALIGNMENT_SIZE, False), | ||
2608 | 775 | >>>>>>> MERGE-SOURCE | ||
2609 | 717 | root_partition.size) | 776 | root_partition.size) |
2610 | 718 | self.assertThat( | 777 | self.assertThat( |
2611 | 719 | root_partition.get_effective_filesystem(), | 778 | root_partition.get_effective_filesystem(), |
2612 | @@ -977,10 +1036,17 @@ | |||
2613 | 977 | 1, volume_group.virtual_devices.count(), | 1036 | 1, volume_group.virtual_devices.count(), |
2614 | 978 | "Should have only 1 logical volume.") | 1037 | "Should have only 1 logical volume.") |
2615 | 979 | logical_volume = volume_group.virtual_devices.first() | 1038 | logical_volume = volume_group.virtual_devices.first() |
2616 | 1039 | <<<<<<< TREE | ||
2617 | 980 | expected_size = round_size_to_nearest_block( | 1040 | expected_size = round_size_to_nearest_block( |
2618 | 981 | lv_size, PARTITION_ALIGNMENT_SIZE, False) | 1041 | lv_size, PARTITION_ALIGNMENT_SIZE, False) |
2619 | 982 | self.assertEqual(expected_size, logical_volume.size) | 1042 | self.assertEqual(expected_size, logical_volume.size) |
2620 | 983 | self.assertEqual(layout.DEFAULT_LV_NAME, logical_volume.name) | 1043 | self.assertEqual(layout.DEFAULT_LV_NAME, logical_volume.name) |
2621 | 1044 | ======= | ||
2622 | 1045 | expected_size = round_size_to_nearest_block( | ||
2623 | 1046 | lv_size, PARTITION_ALIGNMENT_SIZE, False) | ||
2624 | 1047 | self.assertEquals(expected_size, logical_volume.size) | ||
2625 | 1048 | self.assertEquals(layout.DEFAULT_LV_NAME, logical_volume.name) | ||
2626 | 1049 | >>>>>>> MERGE-SOURCE | ||
2627 | 984 | self.assertThat( | 1050 | self.assertThat( |
2628 | 985 | logical_volume.get_effective_filesystem(), | 1051 | logical_volume.get_effective_filesystem(), |
2629 | 986 | MatchesStructure.byEquality( | 1052 | MatchesStructure.byEquality( |
2630 | @@ -1006,9 +1072,15 @@ | |||
2631 | 1006 | self.assertEqual( | 1072 | self.assertEqual( |
2632 | 1007 | 4, partition_table.partitions.count(), | 1073 | 4, partition_table.partitions.count(), |
2633 | 1008 | "Should have 4 partitions.") | 1074 | "Should have 4 partitions.") |
2634 | 1075 | <<<<<<< TREE | ||
2635 | 1009 | expected_size = round_size_to_nearest_block( | 1076 | expected_size = round_size_to_nearest_block( |
2636 | 1010 | MAX_PARTITION_SIZE_FOR_MBR, PARTITION_ALIGNMENT_SIZE, False) | 1077 | MAX_PARTITION_SIZE_FOR_MBR, PARTITION_ALIGNMENT_SIZE, False) |
2637 | 1011 | self.assertEqual(expected_size, root_partition.size) | 1078 | self.assertEqual(expected_size, root_partition.size) |
2638 | 1079 | ======= | ||
2639 | 1080 | expected_size = round_size_to_nearest_block( | ||
2640 | 1081 | MAX_PARTITION_SIZE_FOR_MBR, PARTITION_ALIGNMENT_SIZE, False) | ||
2641 | 1082 | self.assertEquals(expected_size, root_partition.size) | ||
2642 | 1083 | >>>>>>> MERGE-SOURCE | ||
2643 | 1012 | 1084 | ||
2644 | 1013 | 1085 | ||
2645 | 1014 | class TestBcacheStorageLayoutBase(MAASServerTestCase): | 1086 | class TestBcacheStorageLayoutBase(MAASServerTestCase): |
2646 | @@ -1197,11 +1269,19 @@ | |||
2647 | 1197 | partition_table = ssd.get_partitiontable() | 1269 | partition_table = ssd.get_partitiontable() |
2648 | 1198 | self.assertIsNotNone(partition_table) | 1270 | self.assertIsNotNone(partition_table) |
2649 | 1199 | partition = partition_table.partitions.order_by('id').all()[0] | 1271 | partition = partition_table.partitions.order_by('id').all()[0] |
2650 | 1272 | <<<<<<< TREE | ||
2651 | 1200 | self.assertEqual(partition, cache_device) | 1273 | self.assertEqual(partition, cache_device) |
2652 | 1201 | self.assertEqual( | 1274 | self.assertEqual( |
2653 | 1202 | round_size_to_nearest_block( | 1275 | round_size_to_nearest_block( |
2654 | 1203 | cache_size, PARTITION_ALIGNMENT_SIZE, False), | 1276 | cache_size, PARTITION_ALIGNMENT_SIZE, False), |
2655 | 1204 | partition.size) | 1277 | partition.size) |
2656 | 1278 | ======= | ||
2657 | 1279 | self.assertEquals(partition, cache_device) | ||
2658 | 1280 | self.assertEquals( | ||
2659 | 1281 | round_size_to_nearest_block( | ||
2660 | 1282 | cache_size, PARTITION_ALIGNMENT_SIZE, False), | ||
2661 | 1283 | partition.size) | ||
2662 | 1284 | >>>>>>> MERGE-SOURCE | ||
2663 | 1205 | 1285 | ||
2664 | 1206 | def test_raises_error_when_invalid_cache_device(self): | 1286 | def test_raises_error_when_invalid_cache_device(self): |
2665 | 1207 | node = make_Node_with_uefi_boot_method() | 1287 | node = make_Node_with_uefi_boot_method() |
2666 | 1208 | 1288 | ||
2667 | === modified file 'src/maasserver/urls_api.py' | |||
2668 | === modified file 'src/maasserver/utils/converters.py' | |||
2669 | --- src/maasserver/utils/converters.py 2015-12-04 08:25:27 +0000 | |||
2670 | +++ src/maasserver/utils/converters.py 2016-01-10 08:29:39 +0000 | |||
2671 | @@ -102,8 +102,13 @@ | |||
2672 | 102 | :param block_size: The block size to round to. | 102 | :param block_size: The block size to round to. |
2673 | 103 | :param round_up: If True, will round up to fill current block, else down. | 103 | :param round_up: If True, will round up to fill current block, else down. |
2674 | 104 | """ | 104 | """ |
2675 | 105 | <<<<<<< TREE | ||
2676 | 105 | number_of_blocks = size // block_size | 106 | number_of_blocks = size // block_size |
2677 | 106 | if round_up and size % block_size > 0: | 107 | if round_up and size % block_size > 0: |
2678 | 108 | ======= | ||
2679 | 109 | number_of_blocks = size / block_size | ||
2680 | 110 | if round_up and size % block_size > 0: | ||
2681 | 111 | >>>>>>> MERGE-SOURCE | ||
2682 | 107 | number_of_blocks += 1 | 112 | number_of_blocks += 1 |
2683 | 108 | return block_size * number_of_blocks | 113 | return block_size * number_of_blocks |
2684 | 109 | 114 | ||
2685 | 110 | 115 | ||
2686 | === modified file 'src/maasserver/utils/orm.py' | |||
2687 | --- src/maasserver/utils/orm.py 2016-01-05 19:56:43 +0000 | |||
2688 | +++ src/maasserver/utils/orm.py 2016-01-10 08:29:39 +0000 | |||
2689 | @@ -841,6 +841,7 @@ | |||
2690 | 841 | if specifier_types is None: | 841 | if specifier_types is None: |
2691 | 842 | raise NotImplementedError("Subclass must specify specifier_types.") | 842 | raise NotImplementedError("Subclass must specify specifier_types.") |
2692 | 843 | current_q = Q() | 843 | current_q = Q() |
2693 | 844 | <<<<<<< TREE | ||
2694 | 844 | if isinstance(specifiers, dict): | 845 | if isinstance(specifiers, dict): |
2695 | 845 | # If we got a dictionary, treat it as one of the entries in a | 846 | # If we got a dictionary, treat it as one of the entries in a |
2696 | 846 | # LabeledConstraintMap. That is, each key is a specifier, and | 847 | # LabeledConstraintMap. That is, each key is a specifier, and |
2697 | @@ -863,6 +864,30 @@ | |||
2698 | 863 | query = self.get_filter_function( | 864 | query = self.get_filter_function( |
2699 | 864 | specifier_type, specifier_types, item, separator=separator) | 865 | specifier_type, specifier_types, item, separator=separator) |
2700 | 865 | current_q = query(current_q, op, item) | 866 | current_q = query(current_q, op, item) |
2701 | 867 | ======= | ||
2702 | 868 | if isinstance(specifiers, dict): | ||
2703 | 869 | # If we got a dictionary, treat it as one of the entries in a | ||
2704 | 870 | # LabeledConstraintMap. That is, each key is a specifier, and | ||
2705 | 871 | # each value is a list of values (which must be OR'd together). | ||
2706 | 872 | for key in specifiers.iterkeys(): | ||
2707 | 873 | assert isinstance(specifiers[key], list) | ||
2708 | 874 | constraints = [ | ||
2709 | 875 | key + separator + value | ||
2710 | 876 | for value in specifiers[key] | ||
2711 | 877 | ] | ||
2712 | 878 | # Leave off specifier_types here because this recursion | ||
2713 | 879 | # will go back to the subclass to get the types filled in. | ||
2714 | 880 | current_q &= self.get_specifiers_q( | ||
2715 | 881 | constraints, separator=separator) | ||
2716 | 882 | else: | ||
2717 | 883 | for item in specifiers: | ||
2718 | 884 | item, op = parse_item_operation(item) | ||
2719 | 885 | item, specifier_type = parse_item_specifier_type( | ||
2720 | 886 | item, spec_types=specifier_types, separator=separator) | ||
2721 | 887 | query = self.get_filter_function( | ||
2722 | 888 | specifier_type, specifier_types, item, separator=separator) | ||
2723 | 889 | current_q = query(current_q, op, item) | ||
2724 | 890 | >>>>>>> MERGE-SOURCE | ||
2725 | 866 | if len(kwargs) > 0: | 891 | if len(kwargs) > 0: |
2726 | 867 | current_q &= Q(**kwargs) | 892 | current_q &= Q(**kwargs) |
2727 | 868 | return current_q | 893 | return current_q |
2728 | 869 | 894 | ||
2729 | === modified file 'src/maasserver/utils/tests/test_converters.py' | |||
2730 | --- src/maasserver/utils/tests/test_converters.py 2015-12-01 18:12:59 +0000 | |||
2731 | +++ src/maasserver/utils/tests/test_converters.py 2016-01-10 08:29:39 +0000 | |||
2732 | @@ -116,23 +116,46 @@ | |||
2733 | 116 | def test__round_up_doesnt_add_extra_block(self): | 116 | def test__round_up_doesnt_add_extra_block(self): |
2734 | 117 | block_size = 4096 | 117 | block_size = 4096 |
2735 | 118 | size = block_size | 118 | size = block_size |
2756 | 119 | self.assertEqual( | 119 | <<<<<<< TREE |
2757 | 120 | size, | 120 | self.assertEqual( |
2758 | 121 | round_size_to_nearest_block(size, block_size, True), | 121 | size, |
2759 | 122 | "Shouldn't add an extra block to the size.") | 122 | round_size_to_nearest_block(size, block_size, True), |
2760 | 123 | 123 | "Shouldn't add an extra block to the size.") | |
2761 | 124 | def test__round_down_removes_block(self): | 124 | |
2762 | 125 | block_size = 4096 | 125 | def test__round_down_removes_block(self): |
2763 | 126 | size = block_size + 1 | 126 | block_size = 4096 |
2764 | 127 | self.assertEqual( | 127 | size = block_size + 1 |
2765 | 128 | 1 * block_size, | 128 | self.assertEqual( |
2766 | 129 | round_size_to_nearest_block(size, block_size, False), | 129 | 1 * block_size, |
2767 | 130 | "Should remove block from the size.") | 130 | round_size_to_nearest_block(size, block_size, False), |
2768 | 131 | 131 | "Should remove block from the size.") | |
2769 | 132 | def test__round_down_doesnt_remove_block(self): | 132 | |
2770 | 133 | block_size = 4096 | 133 | def test__round_down_doesnt_remove_block(self): |
2771 | 134 | size = block_size * 2 | 134 | block_size = 4096 |
2772 | 135 | self.assertEqual( | 135 | size = block_size * 2 |
2773 | 136 | size, | 136 | self.assertEqual( |
2774 | 137 | round_size_to_nearest_block(size, block_size, False), | 137 | size, |
2775 | 138 | "Shouldn't remove a block from the size.") | 138 | round_size_to_nearest_block(size, block_size, False), |
2776 | 139 | "Shouldn't remove a block from the size.") | ||
2777 | 140 | ======= | ||
2778 | 141 | self.assertEquals( | ||
2779 | 142 | size, | ||
2780 | 143 | round_size_to_nearest_block(size, block_size, True), | ||
2781 | 144 | "Shouldn't add an extra block to the size.") | ||
2782 | 145 | |||
2783 | 146 | def test__round_down_removes_block(self): | ||
2784 | 147 | block_size = 4096 | ||
2785 | 148 | size = block_size + 1 | ||
2786 | 149 | self.assertEquals( | ||
2787 | 150 | 1 * block_size, | ||
2788 | 151 | round_size_to_nearest_block(size, block_size, False), | ||
2789 | 152 | "Should remove block from the size.") | ||
2790 | 153 | |||
2791 | 154 | def test__round_down_doesnt_remove_block(self): | ||
2792 | 155 | block_size = 4096 | ||
2793 | 156 | size = block_size * 2 | ||
2794 | 157 | self.assertEquals( | ||
2795 | 158 | size, | ||
2796 | 159 | round_size_to_nearest_block(size, block_size, False), | ||
2797 | 160 | "Shouldn't remove a block from the size.") | ||
2798 | 161 | >>>>>>> MERGE-SOURCE | ||
2799 | 139 | 162 | ||
2800 | === modified file 'src/maasserver/websockets/handlers/node.py' | |||
2801 | === modified file 'src/maasserver/websockets/handlers/tests/test_node.py' | |||
2802 | --- src/maasserver/websockets/handlers/tests/test_node.py 2016-01-07 03:41:57 +0000 | |||
2803 | +++ src/maasserver/websockets/handlers/tests/test_node.py 2016-01-10 08:29:39 +0000 | |||
2804 | @@ -1446,23 +1446,41 @@ | |||
2805 | 1446 | interface=True, | 1446 | interface=True, |
2806 | 1447 | architecture=architecture, | 1447 | architecture=architecture, |
2807 | 1448 | status=NODE_STATUS.ALLOCATED) | 1448 | status=NODE_STATUS.ALLOCATED) |
2808 | 1449 | <<<<<<< TREE | ||
2809 | 1449 | block_device = factory.make_BlockDevice(node=node) | 1450 | block_device = factory.make_BlockDevice(node=node) |
2810 | 1450 | partition_table = factory.make_PartitionTable( | 1451 | partition_table = factory.make_PartitionTable( |
2811 | 1451 | block_device=block_device, node=node) | 1452 | block_device=block_device, node=node) |
2812 | 1452 | size = partition_table.block_device.size // 2 | 1453 | size = partition_table.block_device.size // 2 |
2813 | 1454 | ======= | ||
2814 | 1455 | block_device = factory.make_BlockDevice(node=node) | ||
2815 | 1456 | partition_table = factory.make_PartitionTable( | ||
2816 | 1457 | block_device=block_device, node=node) | ||
2817 | 1458 | size = partition_table.block_device.size / 2 | ||
2818 | 1459 | >>>>>>> MERGE-SOURCE | ||
2819 | 1453 | handler.create_partition({ | 1460 | handler.create_partition({ |
2820 | 1454 | 'system_id': node.system_id, | 1461 | 'system_id': node.system_id, |
2821 | 1455 | 'block_id': partition_table.block_device_id, | 1462 | 'block_id': partition_table.block_device_id, |
2822 | 1456 | 'partition_size': size | 1463 | 'partition_size': size |
2823 | 1457 | }) | 1464 | }) |
2832 | 1458 | partition = partition_table.partitions.first() | 1465 | <<<<<<< TREE |
2833 | 1459 | self.assertEqual( | 1466 | partition = partition_table.partitions.first() |
2834 | 1460 | 2, Partition.objects.count()) | 1467 | self.assertEqual( |
2835 | 1461 | self.assertEqual( | 1468 | 2, Partition.objects.count()) |
2836 | 1462 | human_readable_bytes( | 1469 | self.assertEqual( |
2837 | 1463 | round_size_to_nearest_block( | 1470 | human_readable_bytes( |
2838 | 1464 | size, PARTITION_ALIGNMENT_SIZE, False)), | 1471 | round_size_to_nearest_block( |
2839 | 1465 | human_readable_bytes(partition.size)) | 1472 | size, PARTITION_ALIGNMENT_SIZE, False)), |
2840 | 1473 | human_readable_bytes(partition.size)) | ||
2841 | 1474 | ======= | ||
2842 | 1475 | partition = partition_table.partitions.first() | ||
2843 | 1476 | self.assertEquals( | ||
2844 | 1477 | 2, Partition.objects.count()) | ||
2845 | 1478 | self.assertEquals( | ||
2846 | 1479 | human_readable_bytes( | ||
2847 | 1480 | round_size_to_nearest_block( | ||
2848 | 1481 | size, PARTITION_ALIGNMENT_SIZE, False)), | ||
2849 | 1482 | human_readable_bytes(partition.size)) | ||
2850 | 1483 | >>>>>>> MERGE-SOURCE | ||
2851 | 1466 | 1484 | ||
2852 | 1467 | def test_create_partition_with_filesystem(self): | 1485 | def test_create_partition_with_filesystem(self): |
2853 | 1468 | user = factory.make_admin() | 1486 | user = factory.make_admin() |
2854 | @@ -1472,11 +1490,19 @@ | |||
2855 | 1472 | interface=True, | 1490 | interface=True, |
2856 | 1473 | architecture=architecture, | 1491 | architecture=architecture, |
2857 | 1474 | status=NODE_STATUS.ALLOCATED) | 1492 | status=NODE_STATUS.ALLOCATED) |
2858 | 1493 | <<<<<<< TREE | ||
2859 | 1475 | block_device = factory.make_BlockDevice(node=node) | 1494 | block_device = factory.make_BlockDevice(node=node) |
2860 | 1476 | partition_table = factory.make_PartitionTable( | 1495 | partition_table = factory.make_PartitionTable( |
2861 | 1477 | block_device=block_device, node=node) | 1496 | block_device=block_device, node=node) |
2862 | 1478 | partition = partition_table.partitions.first() | 1497 | partition = partition_table.partitions.first() |
2863 | 1479 | size = partition_table.block_device.size // 2 | 1498 | size = partition_table.block_device.size // 2 |
2864 | 1499 | ======= | ||
2865 | 1500 | block_device = factory.make_BlockDevice(node=node) | ||
2866 | 1501 | partition_table = factory.make_PartitionTable( | ||
2867 | 1502 | block_device=block_device, node=node) | ||
2868 | 1503 | partition = partition_table.partitions.first() | ||
2869 | 1504 | size = partition_table.block_device.size / 2 | ||
2870 | 1505 | >>>>>>> MERGE-SOURCE | ||
2871 | 1480 | fstype = factory.pick_choice(FILESYSTEM_FORMAT_TYPE_CHOICES) | 1506 | fstype = factory.pick_choice(FILESYSTEM_FORMAT_TYPE_CHOICES) |
2872 | 1481 | mount_point = factory.make_absolute_path() | 1507 | mount_point = factory.make_absolute_path() |
2873 | 1482 | handler.create_partition({ | 1508 | handler.create_partition({ |
2874 | @@ -1486,18 +1512,35 @@ | |||
2875 | 1486 | 'fstype': fstype, | 1512 | 'fstype': fstype, |
2876 | 1487 | 'mount_point': mount_point, | 1513 | 'mount_point': mount_point, |
2877 | 1488 | }) | 1514 | }) |
2887 | 1489 | partition = partition_table.partitions.first() | 1515 | <<<<<<< TREE |
2888 | 1490 | self.assertEqual( | 1516 | partition = partition_table.partitions.first() |
2889 | 1491 | 2, Partition.objects.count()) | 1517 | self.assertEqual( |
2890 | 1492 | self.assertEqual( | 1518 | 2, Partition.objects.count()) |
2891 | 1493 | human_readable_bytes( | 1519 | self.assertEqual( |
2892 | 1494 | round_size_to_nearest_block( | 1520 | human_readable_bytes( |
2893 | 1495 | size, PARTITION_ALIGNMENT_SIZE, False)), | 1521 | round_size_to_nearest_block( |
2894 | 1496 | human_readable_bytes(partition.size)) | 1522 | size, PARTITION_ALIGNMENT_SIZE, False)), |
2895 | 1497 | self.assertEqual( | 1523 | human_readable_bytes(partition.size)) |
2896 | 1524 | self.assertEqual( | ||
2897 | 1525 | ======= | ||
2898 | 1526 | partition = partition_table.partitions.first() | ||
2899 | 1527 | self.assertEquals( | ||
2900 | 1528 | 2, Partition.objects.count()) | ||
2901 | 1529 | self.assertEquals( | ||
2902 | 1530 | human_readable_bytes( | ||
2903 | 1531 | round_size_to_nearest_block( | ||
2904 | 1532 | size, PARTITION_ALIGNMENT_SIZE, False)), | ||
2905 | 1533 | human_readable_bytes(partition.size)) | ||
2906 | 1534 | self.assertEquals( | ||
2907 | 1535 | >>>>>>> MERGE-SOURCE | ||
2908 | 1498 | fstype, | 1536 | fstype, |
2909 | 1537 | <<<<<<< TREE | ||
2910 | 1499 | partition.get_effective_filesystem().fstype) | 1538 | partition.get_effective_filesystem().fstype) |
2911 | 1500 | self.assertEqual( | 1539 | self.assertEqual( |
2912 | 1540 | ======= | ||
2913 | 1541 | partition.get_effective_filesystem().fstype) | ||
2914 | 1542 | self.assertEquals( | ||
2915 | 1543 | >>>>>>> MERGE-SOURCE | ||
2916 | 1501 | mount_point, | 1544 | mount_point, |
2917 | 1502 | partition.get_effective_filesystem().mount_point) | 1545 | partition.get_effective_filesystem().mount_point) |
2918 | 1503 | 1546 | ||
2919 | 1504 | 1547 | ||
2920 | === modified file 'src/metadataserver/models/commissioningscript.py' | |||
2921 | --- src/metadataserver/models/commissioningscript.py 2016-01-05 19:56:43 +0000 | |||
2922 | +++ src/metadataserver/models/commissioningscript.py 2016-01-10 08:29:39 +0000 | |||
2923 | @@ -682,6 +682,10 @@ | |||
2924 | 682 | 'content': IPADDR_SCRIPT.encode('ascii'), | 682 | 'content': IPADDR_SCRIPT.encode('ascii'), |
2925 | 683 | 'hook': update_node_network_information, | 683 | 'hook': update_node_network_information, |
2926 | 684 | }, | 684 | }, |
2927 | 685 | '99-maas-03-network-interfaces.out': { | ||
2928 | 686 | 'content': IPADDR_SCRIPT.encode('ascii'), | ||
2929 | 687 | 'hook': update_node_network_information, | ||
2930 | 688 | }, | ||
2931 | 685 | } | 689 | } |
2932 | 686 | 690 | ||
2933 | 687 | 691 | ||
2934 | 688 | 692 | ||
2935 | === modified file 'src/provisioningserver/cluster_config_command.py' | |||
2936 | === modified file 'src/provisioningserver/config.py' | |||
2937 | --- src/provisioningserver/config.py 2015-12-10 09:42:55 +0000 | |||
2938 | +++ src/provisioningserver/config.py 2016-01-10 08:29:39 +0000 | |||
2939 | @@ -138,6 +138,10 @@ | |||
2940 | 138 | ) | 138 | ) |
2941 | 139 | from formencode.declarative import DeclarativeMeta | 139 | from formencode.declarative import DeclarativeMeta |
2942 | 140 | from formencode.validators import ( | 140 | from formencode.validators import ( |
2943 | 141 | <<<<<<< TREE | ||
2944 | 142 | ======= | ||
2945 | 143 | Invalid, | ||
2946 | 144 | >>>>>>> MERGE-SOURCE | ||
2947 | 141 | Number, | 145 | Number, |
2948 | 142 | Set, | 146 | Set, |
2949 | 143 | ) | 147 | ) |
2950 | @@ -343,7 +347,11 @@ | |||
2951 | 343 | class ConfigurationDatabase: | 347 | class ConfigurationDatabase: |
2952 | 344 | """Store configuration in an sqlite3 database.""" | 348 | """Store configuration in an sqlite3 database.""" |
2953 | 345 | 349 | ||
2954 | 350 | <<<<<<< TREE | ||
2955 | 346 | def __init__(self, database, *, mutable=False): | 351 | def __init__(self, database, *, mutable=False): |
2956 | 352 | ======= | ||
2957 | 353 | def __init__(self, database, mutable=False): | ||
2958 | 354 | >>>>>>> MERGE-SOURCE | ||
2959 | 347 | self.database = database | 355 | self.database = database |
2960 | 348 | self.mutable = mutable | 356 | self.mutable = mutable |
2961 | 349 | with self.cursor() as cursor: | 357 | with self.cursor() as cursor: |
2962 | @@ -383,6 +391,7 @@ | |||
2963 | 383 | "%s: Cannot set `%s'." % (self, name)) | 391 | "%s: Cannot set `%s'." % (self, name)) |
2964 | 384 | 392 | ||
2965 | 385 | def __delitem__(self, name): | 393 | def __delitem__(self, name): |
2966 | 394 | <<<<<<< TREE | ||
2967 | 386 | if self.mutable: | 395 | if self.mutable: |
2968 | 387 | with self.cursor() as cursor: | 396 | with self.cursor() as cursor: |
2969 | 388 | cursor.execute( | 397 | cursor.execute( |
2970 | @@ -393,7 +402,20 @@ | |||
2971 | 393 | "%s: Cannot set `%s'." % (self, name)) | 402 | "%s: Cannot set `%s'." % (self, name)) |
2972 | 394 | 403 | ||
2973 | 395 | def __str__(self): | 404 | def __str__(self): |
2974 | 405 | ======= | ||
2975 | 406 | if self.mutable: | ||
2976 | 407 | with self.cursor() as cursor: | ||
2977 | 408 | cursor.execute( | ||
2978 | 409 | "DELETE FROM configuration" | ||
2979 | 410 | " WHERE name = ?", (name,)) | ||
2980 | 411 | else: | ||
2981 | 412 | raise ConfigurationImmutable( | ||
2982 | 413 | "%s: Cannot set `%s'." % (self, name)) | ||
2983 | 414 | |||
2984 | 415 | def __unicode__(self): | ||
2985 | 416 | >>>>>>> MERGE-SOURCE | ||
2986 | 396 | with self.cursor() as cursor: | 417 | with self.cursor() as cursor: |
2987 | 418 | <<<<<<< TREE | ||
2988 | 397 | # https://www.sqlite.org/pragma.html#pragma_database_list | 419 | # https://www.sqlite.org/pragma.html#pragma_database_list |
2989 | 398 | databases = "; ".join( | 420 | databases = "; ".join( |
2990 | 399 | "%s=%s" % (name, ":memory:" if path == "" else path) | 421 | "%s=%s" % (name, ":memory:" if path == "" else path) |
2991 | @@ -426,6 +448,38 @@ | |||
2992 | 426 | @contextmanager | 448 | @contextmanager |
2993 | 427 | @typed | 449 | @typed |
2994 | 428 | def open_for_update(cls, dbpath: str): | 450 | def open_for_update(cls, dbpath: str): |
2995 | 451 | ======= | ||
2996 | 452 | # https://www.sqlite.org/pragma.html#pragma_database_list | ||
2997 | 453 | databases = "; ".join( | ||
2998 | 454 | "%s=%s" % (name, ":memory:" if path == "" else path) | ||
2999 | 455 | for (_, name, path) in cursor.execute("PRAGMA database_list")) | ||
3000 | 456 | return "%s(%s)" % (self.__class__.__name__, databases) | ||
3001 | 457 | |||
3002 | 458 | @classmethod | ||
3003 | 459 | @contextmanager | ||
3004 | 460 | def open(cls, dbpath): | ||
3005 | 461 | >>>>>>> MERGE-SOURCE | ||
3006 | 462 | """Open a configuration database. | ||
3007 | 463 | |||
3008 | 464 | **Note** that this returns a context manager which will open the | ||
3009 | 465 | database READ-ONLY. | ||
3010 | 466 | """ | ||
3011 | 467 | # Ensure `dbpath` exists... | ||
3012 | 468 | touch(dbpath) | ||
3013 | 469 | # before opening it with sqlite. | ||
3014 | 470 | database = sqlite3.connect(dbpath) | ||
3015 | 471 | try: | ||
3016 | 472 | yield cls(database, mutable=False) | ||
3017 | 473 | except: | ||
3018 | 474 | raise | ||
3019 | 475 | else: | ||
3020 | 476 | database.rollback() | ||
3021 | 477 | finally: | ||
3022 | 478 | database.close() | ||
3023 | 479 | |||
3024 | 480 | @classmethod | ||
3025 | 481 | @contextmanager | ||
3026 | 482 | def open_for_update(cls, dbpath): | ||
3027 | 429 | """Open a configuration database. | 483 | """Open a configuration database. |
3028 | 430 | 484 | ||
3029 | 431 | **Note** that this returns a context manager which will close the | 485 | **Note** that this returns a context manager which will close the |
3030 | @@ -460,7 +514,11 @@ | |||
3031 | 460 | got to use this. | 514 | got to use this. |
3032 | 461 | """ | 515 | """ |
3033 | 462 | 516 | ||
3034 | 517 | <<<<<<< TREE | ||
3035 | 463 | def __init__(self, path, *, mutable=False): | 518 | def __init__(self, path, *, mutable=False): |
3036 | 519 | ======= | ||
3037 | 520 | def __init__(self, path, mutable=False): | ||
3038 | 521 | >>>>>>> MERGE-SOURCE | ||
3039 | 464 | super(ConfigurationFile, self).__init__() | 522 | super(ConfigurationFile, self).__init__() |
3040 | 465 | self.config = {} | 523 | self.config = {} |
3041 | 466 | self.dirty = False | 524 | self.dirty = False |
3042 | @@ -521,6 +579,7 @@ | |||
3043 | 521 | self.path, mode=mode) | 579 | self.path, mode=mode) |
3044 | 522 | self.dirty = False | 580 | self.dirty = False |
3045 | 523 | 581 | ||
3046 | 582 | <<<<<<< TREE | ||
3047 | 524 | def __str__(self): | 583 | def __str__(self): |
3048 | 525 | return "%s(%r)" % (self.__class__.__qualname__, self.path) | 584 | return "%s(%r)" % (self.__class__.__qualname__, self.path) |
3049 | 526 | 585 | ||
3050 | @@ -547,6 +606,32 @@ | |||
3051 | 547 | @contextmanager | 606 | @contextmanager |
3052 | 548 | @typed | 607 | @typed |
3053 | 549 | def open_for_update(cls, path: str): | 608 | def open_for_update(cls, path: str): |
3054 | 609 | ======= | ||
3055 | 610 | def __unicode__(self): | ||
3056 | 611 | return "%s(%r)" % (self.__class__.__name__, self.path) | ||
3057 | 612 | |||
3058 | 613 | @classmethod | ||
3059 | 614 | @contextmanager | ||
3060 | 615 | def open(cls, path): | ||
3061 | 616 | """Open a configuration file read-only. | ||
3062 | 617 | |||
3063 | 618 | This avoids all the locking that happens in `open_for_update`. However, | ||
3064 | 619 | it will create the configuration file if it does not yet exist. | ||
3065 | 620 | |||
3066 | 621 | **Note** that this returns a context manager which will DISCARD | ||
3067 | 622 | changes to the configuration on exit. | ||
3068 | 623 | """ | ||
3069 | 624 | # Ensure `path` exists... | ||
3070 | 625 | touch(path) | ||
3071 | 626 | # before loading it in. | ||
3072 | 627 | configfile = cls(path, mutable=False) | ||
3073 | 628 | configfile.load() | ||
3074 | 629 | yield configfile | ||
3075 | 630 | |||
3076 | 631 | @classmethod | ||
3077 | 632 | @contextmanager | ||
3078 | 633 | def open_for_update(cls, path): | ||
3079 | 634 | >>>>>>> MERGE-SOURCE | ||
3080 | 550 | """Open a configuration file. | 635 | """Open a configuration file. |
3081 | 551 | 636 | ||
3082 | 552 | Locks are taken so that there can only be *one* reader or writer for a | 637 | Locks are taken so that there can only be *one* reader or writer for a |
3083 | 553 | 638 | ||
3084 | === modified file 'src/provisioningserver/dhcp/omshell.py' | |||
3085 | === modified file 'src/provisioningserver/dhcp/tests/test_omshell.py' | |||
3086 | === modified file 'src/provisioningserver/drivers/hardware/hmc.py' | |||
3087 | === modified file 'src/provisioningserver/drivers/hardware/virsh.py' | |||
3088 | === modified file 'src/provisioningserver/drivers/osystem/tests/test_custom.py' | |||
3089 | === modified file 'src/provisioningserver/drivers/power/__init__.py' | |||
3090 | === modified file 'src/provisioningserver/drivers/power/amt.py' | |||
3091 | --- src/provisioningserver/drivers/power/amt.py 2015-12-17 08:14:09 +0000 | |||
3092 | +++ src/provisioningserver/drivers/power/amt.py 2016-01-10 08:29:39 +0000 | |||
3093 | @@ -43,6 +43,7 @@ | |||
3094 | 43 | missing_packages.append(package) | 43 | missing_packages.append(package) |
3095 | 44 | return missing_packages | 44 | return missing_packages |
3096 | 45 | 45 | ||
3097 | 46 | <<<<<<< TREE | ||
3098 | 46 | def _render_wsman_state_xml(self, power_change): | 47 | def _render_wsman_state_xml(self, power_change): |
3099 | 47 | """Render wsman state XML.""" | 48 | """Render wsman state XML.""" |
3100 | 48 | wsman_state_filename = join(dirname(__file__), "amt.wsman-state.xml") | 49 | wsman_state_filename = join(dirname(__file__), "amt.wsman-state.xml") |
3101 | @@ -366,3 +367,13 @@ | |||
3102 | 366 | return self.amttool_query_state(ip_address, power_pass) | 367 | return self.amttool_query_state(ip_address, power_pass) |
3103 | 367 | elif amt_command == 'wsman': | 368 | elif amt_command == 'wsman': |
3104 | 368 | return self.wsman_query_state(ip_address, power_pass) | 369 | return self.wsman_query_state(ip_address, power_pass) |
3105 | 370 | ======= | ||
3106 | 371 | def power_on(self, system_id, context): | ||
3107 | 372 | raise NotImplementedError | ||
3108 | 373 | |||
3109 | 374 | def power_off(self, system_id, context): | ||
3110 | 375 | raise NotImplementedError | ||
3111 | 376 | |||
3112 | 377 | def power_query(self, system_id, context): | ||
3113 | 378 | raise NotImplementedError | ||
3114 | 379 | >>>>>>> MERGE-SOURCE | ||
3115 | 369 | 380 | ||
3116 | === modified file 'src/provisioningserver/drivers/power/apc.py' | |||
3117 | === modified file 'src/provisioningserver/drivers/power/dli.py' | |||
3118 | --- src/provisioningserver/drivers/power/dli.py 2015-12-04 22:06:07 +0000 | |||
3119 | +++ src/provisioningserver/drivers/power/dli.py 2016-01-10 08:29:39 +0000 | |||
3120 | @@ -87,6 +87,7 @@ | |||
3121 | 87 | 87 | ||
3122 | 88 | def power_on(self, system_id, context): | 88 | def power_on(self, system_id, context): |
3123 | 89 | """Power on DLI outlet.""" | 89 | """Power on DLI outlet.""" |
3124 | 90 | <<<<<<< TREE | ||
3125 | 90 | # Power off the outlet if it is currently on | 91 | # Power off the outlet if it is currently on |
3126 | 91 | if self._query_outlet_state(**context) == 'on': | 92 | if self._query_outlet_state(**context) == 'on': |
3127 | 92 | self._set_outlet_state('OFF', **context) | 93 | self._set_outlet_state('OFF', **context) |
3128 | @@ -96,6 +97,16 @@ | |||
3129 | 96 | "Unable to power off outlet %s that is already on." | 97 | "Unable to power off outlet %s that is already on." |
3130 | 97 | % context['outlet_id']) | 98 | % context['outlet_id']) |
3131 | 98 | self._set_outlet_state('ON', **context) | 99 | self._set_outlet_state('ON', **context) |
3132 | 100 | ======= | ||
3133 | 101 | if self._query_outlet_state(**context) == 'on': | ||
3134 | 102 | self._set_outlet_state('OFF', **context) | ||
3135 | 103 | sleep(1) | ||
3136 | 104 | if self._query_outlet_state(**context) != 'off': | ||
3137 | 105 | raise PowerError( | ||
3138 | 106 | "Unable to power off outlet %s that is already on." | ||
3139 | 107 | % context['outlet_id']) | ||
3140 | 108 | self._set_outlet_state('ON', **context) | ||
3141 | 109 | >>>>>>> MERGE-SOURCE | ||
3142 | 99 | 110 | ||
3143 | 100 | def power_off(self, system_id, context): | 111 | def power_off(self, system_id, context): |
3144 | 101 | """Power off DLI outlet.""" | 112 | """Power off DLI outlet.""" |
3145 | 102 | 113 | ||
3146 | === modified file 'src/provisioningserver/drivers/power/ether_wake.py' | |||
3147 | === modified file 'src/provisioningserver/drivers/power/fence_cdu.py' | |||
3148 | === modified file 'src/provisioningserver/drivers/power/hmc.py' | |||
3149 | === modified file 'src/provisioningserver/drivers/power/ipmi.py' | |||
3150 | --- src/provisioningserver/drivers/power/ipmi.py 2015-12-01 18:12:59 +0000 | |||
3151 | +++ src/provisioningserver/drivers/power/ipmi.py 2016-01-10 08:29:39 +0000 | |||
3152 | @@ -34,7 +34,15 @@ | |||
3153 | 34 | """ | 34 | """ |
3154 | 35 | 35 | ||
3155 | 36 | 36 | ||
3157 | 37 | maaslog = get_maas_logger("drivers.power.ipmi") | 37 | <<<<<<< TREE |
3158 | 38 | maaslog = get_maas_logger("drivers.power.ipmi") | ||
3159 | 39 | ======= | ||
3160 | 40 | maaslog = get_maas_logger("drivers.power.ipmi") | ||
3161 | 41 | |||
3162 | 42 | |||
3163 | 43 | def is_set(setting): | ||
3164 | 44 | return not (setting is None or setting == "" or setting.isspace()) | ||
3165 | 45 | >>>>>>> MERGE-SOURCE | ||
3166 | 38 | 46 | ||
3167 | 39 | 47 | ||
3168 | 40 | class IPMIPowerDriver(PowerDriver): | 48 | class IPMIPowerDriver(PowerDriver): |
3169 | @@ -49,10 +57,16 @@ | |||
3170 | 49 | return [] | 57 | return [] |
3171 | 50 | 58 | ||
3172 | 51 | @staticmethod | 59 | @staticmethod |
3173 | 60 | <<<<<<< TREE | ||
3174 | 52 | def _issue_ipmi_chassis_config_command( | 61 | def _issue_ipmi_chassis_config_command( |
3175 | 53 | command, power_change, power_address): | 62 | command, power_change, power_address): |
3176 | 54 | env = shell.select_c_utf8_locale() | 63 | env = shell.select_c_utf8_locale() |
3177 | 55 | with NamedTemporaryFile("w+", encoding="utf-8") as tmp_config: | 64 | with NamedTemporaryFile("w+", encoding="utf-8") as tmp_config: |
3178 | 65 | ======= | ||
3179 | 66 | def _issue_ipmi_chassis_config_command( | ||
3180 | 67 | command, power_change, power_address, env): | ||
3181 | 68 | with NamedTemporaryFile() as tmp_config: | ||
3182 | 69 | >>>>>>> MERGE-SOURCE | ||
3183 | 56 | # Write out the chassis configuration. | 70 | # Write out the chassis configuration. |
3184 | 57 | tmp_config.write(IPMI_CONFIG) | 71 | tmp_config.write(IPMI_CONFIG) |
3185 | 58 | tmp_config.flush() | 72 | tmp_config.flush() |
3186 | @@ -72,8 +86,12 @@ | |||
3187 | 72 | power_address, stderr)) | 86 | power_address, stderr)) |
3188 | 73 | 87 | ||
3189 | 74 | @staticmethod | 88 | @staticmethod |
3190 | 89 | <<<<<<< TREE | ||
3191 | 75 | def _issue_ipmi_power_command(command, power_change, power_address): | 90 | def _issue_ipmi_power_command(command, power_change, power_address): |
3192 | 76 | env = shell.select_c_utf8_locale() | 91 | env = shell.select_c_utf8_locale() |
3193 | 92 | ======= | ||
3194 | 93 | def _issue_ipmi_power_command(command, power_change, power_address, env): | ||
3195 | 94 | >>>>>>> MERGE-SOURCE | ||
3196 | 77 | command = tuple(command) # For consistency when testing. | 95 | command = tuple(command) # For consistency when testing. |
3197 | 78 | try: | 96 | try: |
3198 | 79 | output = call_and_check(command, env=env) | 97 | output = call_and_check(command, env=env) |
3199 | @@ -146,6 +164,7 @@ | |||
3200 | 146 | 164 | ||
3201 | 147 | # Update or query the power state. | 165 | # Update or query the power state. |
3202 | 148 | return self._issue_ipmi_power_command( | 166 | return self._issue_ipmi_power_command( |
3203 | 167 | <<<<<<< TREE | ||
3204 | 149 | ipmipower_command, power_change, power_address) | 168 | ipmipower_command, power_change, power_address) |
3205 | 150 | 169 | ||
3206 | 151 | def power_on(self, system_id, context): | 170 | def power_on(self, system_id, context): |
3207 | @@ -156,3 +175,15 @@ | |||
3208 | 156 | 175 | ||
3209 | 157 | def power_query(self, system_id, context): | 176 | def power_query(self, system_id, context): |
3210 | 158 | return self._issue_ipmi_command('query', **context) | 177 | return self._issue_ipmi_command('query', **context) |
3211 | 178 | ======= | ||
3212 | 179 | ipmipower_command, power_change, power_address, env) | ||
3213 | 180 | |||
3214 | 181 | def power_on(self, system_id, context): | ||
3215 | 182 | self._issue_ipmi_command('on', **context) | ||
3216 | 183 | |||
3217 | 184 | def power_off(self, system_id, context): | ||
3218 | 185 | self._issue_ipmi_command('off', **context) | ||
3219 | 186 | |||
3220 | 187 | def power_query(self, system_id, context): | ||
3221 | 188 | return self._issue_ipmi_command('query', **context) | ||
3222 | 189 | >>>>>>> MERGE-SOURCE | ||
3223 | 159 | 190 | ||
3224 | === modified file 'src/provisioningserver/drivers/power/moonshot.py' | |||
3225 | === modified file 'src/provisioningserver/drivers/power/mscm.py' | |||
3226 | === modified file 'src/provisioningserver/drivers/power/msftocs.py' | |||
3227 | === modified file 'src/provisioningserver/drivers/power/seamicro.py' | |||
3228 | --- src/provisioningserver/drivers/power/seamicro.py 2015-12-01 18:12:59 +0000 | |||
3229 | +++ src/provisioningserver/drivers/power/seamicro.py 2016-01-10 08:29:39 +0000 | |||
3230 | @@ -82,10 +82,15 @@ | |||
3231 | 82 | """Power query SeaMicro node.""" | 82 | """Power query SeaMicro node.""" |
3232 | 83 | # Query the state. | 83 | # Query the state. |
3233 | 84 | # Only supported by REST v2. | 84 | # Only supported by REST v2. |
3234 | 85 | <<<<<<< TREE | ||
3235 | 85 | ip, username, password, _, power_control = ( | 86 | ip, username, password, _, power_control = ( |
3236 | 86 | extract_seamicro_parameters(context)) | 87 | extract_seamicro_parameters(context)) |
3237 | 88 | ======= | ||
3238 | 89 | ip, username, password, server_id, power_control = ( | ||
3239 | 90 | extract_seamicro_parameters(context)) | ||
3240 | 91 | >>>>>>> MERGE-SOURCE | ||
3241 | 87 | if power_control == 'restapi2': | 92 | if power_control == 'restapi2': |
3242 | 88 | return power_query_seamicro15k_v2( | 93 | return power_query_seamicro15k_v2( |
3244 | 89 | ip, username, password, system_id) | 94 | ip, username, password, server_id) |
3245 | 90 | else: | 95 | else: |
3246 | 91 | return 'unknown' | 96 | return 'unknown' |
3247 | 92 | 97 | ||
3248 | === modified file 'src/provisioningserver/drivers/power/tests/test_amt.py' | |||
3249 | --- src/provisioningserver/drivers/power/tests/test_amt.py 2015-12-17 08:14:09 +0000 | |||
3250 | +++ src/provisioningserver/drivers/power/tests/test_amt.py 2016-01-10 08:29:39 +0000 | |||
3251 | @@ -94,6 +94,7 @@ | |||
3252 | 94 | missing = driver.detect_missing_packages() | 94 | missing = driver.detect_missing_packages() |
3253 | 95 | self.assertItemsEqual([], missing) | 95 | self.assertItemsEqual([], missing) |
3254 | 96 | 96 | ||
3255 | 97 | <<<<<<< TREE | ||
3256 | 97 | def test__render_wsman_state_xml_renders_xml(self): | 98 | def test__render_wsman_state_xml_renders_xml(self): |
3257 | 98 | amt_power_driver = AMTPowerDriver() | 99 | amt_power_driver = AMTPowerDriver() |
3258 | 99 | power_change = choice(['on', 'off', 'restart']) | 100 | power_change = choice(['on', 'off', 'restart']) |
3259 | @@ -778,3 +779,19 @@ | |||
3260 | 778 | wsman_query_state_mock, MockCalledOnceWith( | 779 | wsman_query_state_mock, MockCalledOnceWith( |
3261 | 779 | context['ip_address'], context['power_pass'])) | 780 | context['ip_address'], context['power_pass'])) |
3262 | 780 | self.expectThat(state, Equals('on')) | 781 | self.expectThat(state, Equals('on')) |
3263 | 782 | ======= | ||
3264 | 783 | def test_power_on(self): | ||
3265 | 784 | driver = amt_module.AMTPowerDriver() | ||
3266 | 785 | self.assertRaises( | ||
3267 | 786 | NotImplementedError, driver.power_on, "fake_id", {}) | ||
3268 | 787 | |||
3269 | 788 | def test_power_off(self): | ||
3270 | 789 | driver = amt_module.AMTPowerDriver() | ||
3271 | 790 | self.assertRaises( | ||
3272 | 791 | NotImplementedError, driver.power_off, "fake_id", {}) | ||
3273 | 792 | |||
3274 | 793 | def test_power_query(self): | ||
3275 | 794 | driver = amt_module.AMTPowerDriver() | ||
3276 | 795 | self.assertRaises( | ||
3277 | 796 | NotImplementedError, driver.power_query, "fake_id", {}) | ||
3278 | 797 | >>>>>>> MERGE-SOURCE | ||
3279 | 781 | 798 | ||
3280 | === modified file 'src/provisioningserver/drivers/power/tests/test_apc.py' | |||
3281 | === modified file 'src/provisioningserver/drivers/power/tests/test_base.py' | |||
3282 | === modified file 'src/provisioningserver/drivers/power/tests/test_dli.py' | |||
3283 | === modified file 'src/provisioningserver/drivers/power/tests/test_ether_wake.py' | |||
3284 | === modified file 'src/provisioningserver/drivers/power/tests/test_fence_cdu.py' | |||
3285 | === modified file 'src/provisioningserver/drivers/power/tests/test_hmc.py' | |||
3286 | === modified file 'src/provisioningserver/drivers/power/tests/test_ipmi.py' | |||
3287 | --- src/provisioningserver/drivers/power/tests/test_ipmi.py 2015-12-01 18:12:59 +0000 | |||
3288 | +++ src/provisioningserver/drivers/power/tests/test_ipmi.py 2016-01-10 08:29:39 +0000 | |||
3289 | @@ -260,8 +260,13 @@ | |||
3290 | 260 | ipmipower_command, env=env)) | 260 | ipmipower_command, env=env)) |
3291 | 261 | self.expectThat(result, Equals('other')) | 261 | self.expectThat(result, Equals('other')) |
3292 | 262 | 262 | ||
3293 | 263 | <<<<<<< TREE | ||
3294 | 263 | def test__issue_ipmi_command_issues_raises_power_auth_error(self): | 264 | def test__issue_ipmi_command_issues_raises_power_auth_error(self): |
3295 | 264 | _, _, _, _, _, _, _, context = make_parameters() | 265 | _, _, _, _, _, _, _, context = make_parameters() |
3296 | 266 | ======= | ||
3297 | 267 | def test__issue_ipmi_command_raises_power_fatal_error(self): | ||
3298 | 268 | _, _, _, _, _, _, _, context = make_parameters() | ||
3299 | 269 | >>>>>>> MERGE-SOURCE | ||
3300 | 265 | ipmi_power_driver = IPMIPowerDriver() | 270 | ipmi_power_driver = IPMIPowerDriver() |
3301 | 266 | popen_mock = self.patch(ipmi_module, 'Popen') | 271 | popen_mock = self.patch(ipmi_module, 'Popen') |
3302 | 267 | process = popen_mock.return_value | 272 | process = popen_mock.return_value |
3303 | @@ -277,7 +282,11 @@ | |||
3304 | 277 | ipmi_power_driver = IPMIP | 282 | ipmi_power_driver = IPMIP |