/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

@font-face { font-family: 'IconicStroke'; src: url('iconic_stroke.eot'); src: local('IconicStroke'), url('iconic_stroke.svg#iconic') format('svg'), url('iconic_stroke.otf') format('opentype'); }.iconic { display:inline-block; font-family: 'IconicStroke'; }.hash:before {content:'\23';}.question_mark:before {content:'\3f';}.at:before {content:'\40';}.pilcrow:before {content:'\b6';}.info:before {content:'\2139';}.arrow_left:before {content:'\2190';}.arrow_up:before {content:'\2191';}.arrow_right:before {content:'\2192';}.arrow_down:before {content:'\2193';}.home:before {content:'\2302';}.sun_stroke:before {content:'\2600';}.cloud:before {content:'\2601';}.umbrella:before {content:'\2602';}.star:before {content:'\2605';}.moon_stroke:before {content:'\263e';}.heart_stroke:before {content:'\2764';}.cog:before {content:'\2699';}.bolt:before {content:'\26a1';}.key_stroke:before {content:'\26bf';}.rain:before {content:'\26c6';}.denied:before {content:'\26d4';}.mail:before {content:'\2709';}.pen:before {content:'\270e';}.check:before {content:'\2717';}.check_alt:before {content:'\2718';}.x:before {content:'\2713';}.x_alt:before {content:'\2714';}.left_quote:before {content:'\275d';}.right_quote:before {content:'\275e';}.plus:before {content:'\2795';}.minus:before {content:'\2796';}.curved_arrow:before {content:'\2935';}.document_alt_stroke:before {content:'\e000';}.calendar:before {content:'\e001';}.map_pin_alt:before {content:'\e002';}.comment_alt1_stroke:before {content:'\e003';}.comment_alt2_stroke:before {content:'\e004';}.pen_alt_stroke:before {content:'\e005';}.pen_alt2:before {content:'\e006';}.chat_alt_stroke:before {content:'\e007';}.plus_alt:before {content:'\e008';}.minus_alt:before {content:'\e009';}.bars_alt:before {content:'\e00a';}.book_alt:before {content:'\e00b';}.aperture_alt:before {content:'\e00c';}.beaker_alt:before {content:'\e010';}.left_quote_alt:before {content:'\e011';}.right_quote_alt:before {content:'\e012';}.arrow_left_alt1:before {content:'\e013';}.arrow_up_alt1:before {content:'\e014';}.arrow_right_alt1:before {content:'\e015';}.arrow_down_alt1:before {content:'\e016';}.arrow_left_alt2:before {content:'\e017';}.arrow_up_alt2:before {content:'\e018';}.arrow_right_alt2:before {content:'\e019';}.arrow_down_alt2:before {content:'\e01a';}.brush:before {content:'\e01b';}.brush_alt:before {content:'\e01c';}.eyedropper:before {content:'\e01e';}.layers:before {content:'\e01f';}.layers_alt:before {content:'\e020';}.compass:before {content:'\e021';}.award_stroke:before {content:'\e022';}.beaker:before {content:'\e023';}.steering_wheel:before {content:'\e024';}.eye:before {content:'\e025';}.aperture:before {content:'\e026';}.image:before {content:'\e027';}.chart:before {content:'\e028';}.chart_alt:before {content:'\e029';}.target:before {content:'\e02a';}.tag_stroke:before {content:'\e02b';}.rss:before {content:'\e02c';}.rss_alt:before {content:'\e02d';}.share:before {content:'\e02e';}.undo:before {content:'\e02f';}.reload:before {content:'\e030';}.reload_alt:before {content:'\e031';}.loop_alt1:before {content:'\e032';}.loop_alt2:before {content:'\e033';}.loop_alt3:before {content:'\e034';}.loop_alt4:before {content:'\e035';}.spin:before {content:'\e036';}.spin_alt:before {content:'\e037';}.move_horizontal:before {content:'\e038';}.move_horizontal_alt1:before {content:'\e039';}.move_horizontal_alt2:before {content:'\e03a';}.move_vertical:before {content:'\e03b';}.move_vertical_alt1:before {content:'\e03c';}.move_vertical_alt2:before {content:'\e03d';}.move:before {content:'\e03e';}.move_alt1:before {content:'\e03f';}.move_alt2:before {content:'\e040';}.transfer:before {content:'\e041';}.download:before {content:'\e042';}.upload:before {content:'\e043';}.cloud_download:before {content:'\e044';}.cloud_upload:before {content:'\e045';}.fork:before {content:'\e046';}.play:before {content:'\e047';}.play_alt:before {content:'\e048';}.pause:before {content:'\e049';}.stop:before {content:'\e04a';}.eject:before {content:'\e04b';}.first:before {content:'\e04c';}.last:before {content:'\e04d';}.fullscreen:before {content:'\e04e';}.fullscreen_alt:before {content:'\e04f';}.fullscreen_exit:before {content:'\e050';}.fullscreen_exit_alt:before {content:'\e051';}.equalizer:before {content:'\e052';}.article:before {content:'\e053';}.read_more:before {content:'\e054';}.list:before {content:'\e055';}.list_nested:before {content:'\e056';}.cursor:before {content:'\e057';}.dial:before {content:'\e058';}.new_window:before {content:'\e059';}.trash_stroke:before {content:'\e05a';}.battery_half:before {content:'\e05b';}.battery_empty:before {content:'\e05c';}.battery_charging:before {content:'\e05d';}.chat:before {content:'\e05e';}.mic:before {content:'\e05f';}.movie:before {content:'\e060';}.headphones:before {content:'\e061';}.user:before {content:'\e062';}.lightbulb:before {content:'\e063';}.cd:before {content:'\e064';}.folder_stroke:before {content:'\e065';}.document_stroke:before {content:'\e066';}.pin:before {content:'\e067';}.map_pin_stroke:before {content:'\e068';}.book:before {content:'\e069';}.book_alt2:before {content:'\e06a';}.box:before {content:'\e06b';}.calendar_alt_stroke:before {content:'\e06c';}.comment_stroke:before {content:'\e06d';}.iphone:before {content:'\e06e';}.bars:before {content:'\e06f';}.camera:before {content:'\e070';}.volume_mute:before {content:'\e071';}.volume:before {content:'\e072';}.battery_full:before {content:'\e073';}.magnifying_glass:before {content:'\e074';}.lock_stroke:before {content:'\e075';}.unlock_stroke:before {content:'\e076';}.link:before {content:'\e077';}.wrench:before {content:'\e078';}.clock:before {content:'\e079';}
