: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
if ( ! defined( 'ET_BUILDER_PRODUCT_VERSION' ) ) {
// Note, this will be updated automatically during grunt release task.
define( 'ET_BUILDER_PRODUCT_VERSION', '4.5.3' );
if ( ! defined( 'ET_BUILDER_VERSION' ) ) {
define( 'ET_BUILDER_VERSION', 0.7 );
if ( ! defined( 'ET_BUILDER_FORCE_CACHE_PURGE' ) ) {
define( 'ET_BUILDER_FORCE_CACHE_PURGE', false );
if ( ! defined( 'ET_BUILDER_DIR_RESOLVED_PATH' ) ) {
define( 'ET_BUILDER_DIR_RESOLVED_PATH', dirname( __FILE__ ) );
// When set to true, the builder will use the new loading method
if ( ! defined( 'ET_BUILDER_CACHE_ASSETS' ) ) {
define( 'ET_BUILDER_CACHE_ASSETS', ! isset( $_REQUEST['nocache'] ) );
if ( ! defined( 'ET_BUILDER_CACHE_MODULES' ) ) {
define( 'ET_BUILDER_CACHE_MODULES', apply_filters( 'et_builder_cache_modules', true ) );
if ( ! defined( 'ET_BUILDER_JSON_ENCODE_OPTIONS' ) ) {
define( 'ET_BUILDER_JSON_ENCODE_OPTIONS', 0 );
if ( ! defined( 'ET_BUILDER_KEEP_OLDEST_CACHED_ASSETS' ) ) {
define( 'ET_BUILDER_KEEP_OLDEST_CACHED_ASSETS', false );
if ( ! defined( 'ET_BUILDER_PURGE_OLD_CACHED_ASSETS' ) ) {
define( 'ET_BUILDER_PURGE_OLD_CACHED_ASSETS', true );
if ( defined( 'ET_BUILDER_DEFINITION_SORT' ) && ET_BUILDER_DEFINITION_SORT ) {
// You don't want to know and this isn't the function you're looking for.
// Still reading ? Aight, this is only used to debug definitions.
function et_builder_definition_sort( &$definitions ) {
if ( ! is_array( $definitions ) ) {
$fields = array_keys( $definitions );
foreach ( $fields as $field ) {
$definition =& $definitions[ $field ];
if ( is_array( $definition ) ) {
foreach ( $order as $key ) {
if ( isset( $definition[ $key ] ) ) {
$value = $definition[ $key ];
unset( $definition[ $key ] );
$definition[ $key ] = $value;
et_builder_definition_sort( $definition );
$et_fonts_queue = array();
// exclude predefined layouts from import
function et_remove_predefined_layouts_from_import( $posts ) {
$processed_posts = $posts;
if ( isset( $posts ) && is_array( $posts ) ) {
$processed_posts = array();
foreach ( $posts as $post ) {
if ( isset( $post['postmeta'] ) && is_array( $post['postmeta'] ) ) {
foreach ( $post['postmeta'] as $meta ) {
if ( '_et_pb_predefined_layout' === $meta['key'] && 'on' === $meta['value'] )
$processed_posts[] = $post;
add_filter( 'wp_import_posts', 'et_remove_predefined_layouts_from_import', 5 );
* Output all module fields JSON dump.
// function et_dev_output_all_fields() {
// die( json_encode( ET_Builder_Element::get_all_fields('page') ) );
// add_action('wp', 'et_dev_output_all_fields', 100);
// set the layout_type taxonomy to "layout" for layouts imported from old version of Divi.
function et_update_old_layouts_taxonomy( $posts ) {
$processed_posts = $posts;
if ( isset( $posts ) && is_array( $posts ) ) {
$processed_posts = array();
foreach ( $posts as $post ) {
$update_built_for_post_type = false;
if ( 'et_pb_layout' === $post['post_type'] ) {
if ( ! isset( $post['terms'] ) ) {
$post['terms'][] = array(
'domain' => 'layout_type'
$post['terms'][] = array(
$update_built_for_post_type = true;
// check whether _et_pb_built_for_post_type custom field exists
if ( ! empty( $post['postmeta'] ) ) {
foreach ( $post['postmeta'] as $index => $value ) {
if ( '_et_pb_built_for_post_type' === $value['key'] ) {
$update_built_for_post_type = false;
// set _et_pb_built_for_post_type value to 'page' if not exists
if ( $update_built_for_post_type ) {
$post['postmeta'][] = array(
'key' => '_et_pb_built_for_post_type',
$processed_posts[] = $post;
add_filter( 'wp_import_posts', 'et_update_old_layouts_taxonomy', 10 );
// add custom filters for posts in the Divi Library
if ( ! function_exists( 'et_pb_add_layout_filters' ) ) :
function et_pb_add_layout_filters() {
if ( isset( $_GET['post_type'] ) && 'et_pb_layout' === $_GET['post_type'] ) { // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
$layout_categories = get_terms( 'layout_category' );
$filter_category = array();
$filter_category[''] = esc_html__( 'All Categories', 'et_builder' );
if ( is_array( $layout_categories ) && ! empty( $layout_categories ) ) {
foreach( $layout_categories as $category ) {
$filter_category[$category->slug] = $category->name;
$layout_packs = get_terms( 'layout_pack' );
$filter_pack[''] = esc_html_x( 'All Packs', 'Layout Packs', 'et_builder' );
if ( is_array( $layout_packs ) ) {
foreach ( $layout_packs as $pack ) {
$filter_pack[ $pack->slug ] = $pack->name;
$filter_layout_type = array(
'' => esc_html__( 'All Types', 'et_builder' ),
'module' => esc_html__( 'Modules', 'et_builder' ),
'row' => esc_html__( 'Rows', 'et_builder' ),
'section' => esc_html__( 'Sections', 'et_builder' ),
'layout' => esc_html__( 'Layouts', 'et_builder' ),
'' => esc_html__( 'All Scopes', 'et_builder' ),
'global' => esc_html__( 'Global', 'et_builder' ),
'not_global' => esc_html__( 'Not Global', 'et_builder' )
<select name="layout_type">
$selected = isset( $_GET['layout_type'] ) ? $_GET['layout_type'] : ''; // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
foreach ( $filter_layout_type as $value => $label ) {
printf( '<option value="%1$s"%2$s>%3$s</option>',
selected( $value, $selected ),
$selected = isset( $_GET['scope'] ) ? $_GET['scope'] : ''; // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
foreach ( $filter_scope as $value => $label ) {
printf( '<option value="%1$s"%2$s>%3$s</option>',
selected( $value, $selected ),
<select name="layout_category">
$selected = isset( $_GET['layout_category'] ) ? $_GET['layout_category'] : ''; // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
foreach ( $filter_category as $value => $label ) {
printf( '<option value="%1$s"%2$s>%3$s</option>',
selected( $value, $selected ),
<select name="layout_pack">
$selected = isset( $_GET['layout_pack'] ) ? $_GET['layout_pack'] : ''; // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
foreach ( $filter_pack as $value => $label ) {
printf( '<option value="%1$s"%2$s>%3$s</option>',
selected( $value, $selected ),
add_action( 'restrict_manage_posts', 'et_pb_add_layout_filters' );
// Add "Export Divi Layouts" button to the Divi Library page
if ( ! function_exists( 'et_pb_load_export_section' ) ) :
function et_pb_load_export_section(){
$current_screen = get_current_screen();
if ( 'edit-et_pb_layout' === $current_screen->id ) {
// display wp error screen if library is disabled for current user
if ( ! et_pb_is_allowed( 'divi_library' ) || ! et_pb_is_allowed( 'add_library' ) || ! et_pb_is_allowed( 'save_library' ) ) {
wp_die( esc_html__( "you don't have sufficient permissions to access this page", 'et_builder' ) );
add_action( 'all_admin_notices', 'et_pb_export_layouts_interface' );
add_action( 'load-edit.php', 'et_pb_load_export_section' );
if ( ! function_exists( 'et_pb_edit_library_categories' ) ) :
function et_pb_edit_library_categories(){
$current_screen = get_current_screen();
if ( 'edit-layout_category' === $current_screen->id || 'edit-layout_pack' === $current_screen->id ) {
// display wp error screen if library is disabled for current user
if ( ! et_pb_is_allowed( 'divi_library' ) || ! et_pb_is_allowed( 'add_library' ) || ! et_pb_is_allowed( 'save_library' ) ) {
wp_die( esc_html__( "you don't have sufficient permissions to access this page", 'et_builder' ) );
wp_enqueue_script( 'builder-library-category', ET_BUILDER_URI . '/scripts/library_category.js', array( 'jquery' ), ET_BUILDER_VERSION, true );
add_action( 'load-edit-tags.php', 'et_pb_edit_library_categories' );
// Check whether the library editor page should be displayed or not
function et_pb_check_library_permissions(){
$current_screen = get_current_screen();
if ( 'et_pb_layout' === $current_screen->id && ( ! et_pb_is_allowed( 'divi_library' ) || ! et_pb_is_allowed( 'save_library' ) ) ) {
// display wp error screen if library is disabled for current user
wp_die( esc_html__( "you don't have sufficient permissions to access this page", 'et_builder' ) );
add_action( 'load-post.php', 'et_pb_check_library_permissions' );
// exclude premade layouts from the list of all templates in the library.
if ( ! function_exists( 'exclude_premade_layouts_library' ) ) :
function exclude_premade_layouts_library( $query ) {
$current_post_type = get_query_var( 'post_type' );
if ( is_admin() && 'edit.php' === $pagenow && $current_post_type && 'et_pb_layout' === $current_post_type ) {
'key' => '_et_pb_predefined_layout',
'compare' => 'NOT EXISTS',
$used_built_for_post_types = et_pb_get_used_built_for_post_types();
if ( isset( $_GET['built_for'] ) && count( $used_built_for_post_types ) > 1 ) { // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
$built_for_post_type = sanitize_text_field( $_GET['built_for'] );
// get array of all standard post types if built_for is one of them
$built_for_post_type_processed = in_array( $built_for_post_type, et_pb_get_standard_post_types() ) ? et_pb_get_standard_post_types() : $built_for_post_type;
if ( in_array( $built_for_post_type, $used_built_for_post_types ) ) {
'key' => '_et_pb_built_for_post_type',
'value' => $built_for_post_type_processed,
$query->set( 'meta_query', $meta_query );
add_action( 'pre_get_posts', 'exclude_premade_layouts_library' );
if ( ! function_exists( 'exclude_premade_layouts_library_count' ) ) :
* Post count for "mine" in post table relies to fixed value set by WP_Posts_List_Table->user_posts_count
* Thus, exclude_premade_layouts_library() action doesn't automatically exclude premade layout and
* it has to be late filtered via this exclude_premade_layouts_library_count()
* @see WP_Posts_List_Table->user_posts_count to see how mine post value is retrieved
function exclude_premade_layouts_library_count( $views ) {
if ( isset( $views['mine'] ) ) {
$current_user_id = get_current_user_id();
if ( isset( $_GET['author'] ) && ( $_GET['author'] === $current_user_id ) ) { // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
// Reuse current $wp_query global
$mine_posts_count = $wp_query->found_posts;
// Use WP_Query instead of plain MySQL SELECT because the custom field filtering uses
// GROUP BY which needs FOUND_ROWS() and this has been automatically handled by WP_Query
$query = new WP_Query( array(
'post_type' => 'et_pb_layout',
'author' => $current_user_id,
'key' => '_et_pb_predefined_layout',
'compare' => 'NOT EXISTS',
$mine_posts_count = $query->found_posts;
'post_type' => 'et_pb_layout',
'author' => $current_user_id,
$views['mine'] = sprintf(
'<a href="%1$s" class="%2$s">%3$s <span class="count">(%4$s)</span></a>',
esc_html__( 'Mine', 'et_builder' ),
esc_html( intval( $mine_posts_count ) )
add_filter( 'views_edit-et_pb_layout', 'exclude_premade_layouts_library_count' );
if ( ! function_exists( 'et_pb_get_standard_post_types' ) ):
* Returns the standard '_et_pb_built_for_post_type' post types.
* @deprecated {@see ET_Builder_Post_Type_Layout::get_built_for_post_types()}
function et_pb_get_standard_post_types() {
return ET_Builder_Library::built_for_post_types();
if ( ! function_exists( 'et_pb_get_used_built_for_post_types' ) ):
* Returns all current '_et_pb_built_for_post_type' post types.
* @deprecated {@see ET_Builder_Post_Type_Layout::get_built_for_post_types()}
function et_pb_get_used_built_for_post_types() {
return ET_Builder_Library::built_for_post_types( 'all' );
if ( ! function_exists( 'et_pb_get_font_icon_symbols' ) ) :
function et_pb_get_font_icon_symbols() {
$symbols = array( '&#x21;', '&#x22;', '&#x23;', '&#x24;', '&#x25;', '&#x26;', '&#x27;', '&#x28;', '&#x29;', '&#x2a;', '&#x2b;', '&#x2c;', '&#x2d;', '&#x2e;', '&#x2f;', '&#x30;', '&#x31;', '&#x32;', '&#x33;', '&#x34;', '&#x35;', '&#x36;', '&#x37;', '&#x38;', '&#x39;', '&#x3a;', '&#x3b;', '&#x3c;', '&#x3d;', '&#x3e;', '&#x3f;', '&#x40;', '&#x41;', '&#x42;', '&#x43;', '&#x44;', '&#x45;', '&#x46;', '&#x47;', '&#x48;', '&#x49;', '&#x4a;', '&#x4b;', '&#x4c;', '&#x4d;', '&#x4e;', '&#x4f;', '&#x50;', '&#x51;', '&#x52;', '&#x53;', '&#x54;', '&#x55;', '&#x56;', '&#x57;', '&#x58;', '&#x59;', '&#x5a;', '&#x5b;', '&#x5c;', '&#x5d;', '&#x5e;', '&#x5f;', '&#x60;', '&#x61;', '&#x62;', '&#x63;', '&#x64;', '&#x65;', '&#x66;', '&#x67;', '&#x68;', '&#x69;', '&#x6a;', '&#x6b;', '&#x6c;', '&#x6d;', '&#x6e;', '&#x6f;', '&#x70;', '&#x71;', '&#x72;', '&#x73;', '&#x74;', '&#x75;', '&#x76;', '&#x77;', '&#x78;', '&#x79;', '&#x7a;', '&#x7b;', '&#x7c;', '&#x7d;', '&#x7e;', '&#xe000;', '&#xe001;', '&#xe002;', '&#xe003;', '&#xe004;', '&#xe005;', '&#xe006;', '&#xe007;', '&#xe009;', '&#xe00a;', '&#xe00b;', '&#xe00c;', '&#xe00d;', '&#xe00e;', '&#xe00f;', '&#xe010;', '&#xe011;', '&#xe012;', '&#xe013;', '&#xe014;', '&#xe015;', '&#xe016;', '&#xe017;', '&#xe018;', '&#xe019;', '&#xe01a;', '&#xe01b;', '&#xe01c;', '&#xe01d;', '&#xe01e;', '&#xe01f;', '&#xe020;', '&#xe021;', '&#xe022;', '&#xe023;', '&#xe024;', '&#xe025;', '&#xe026;', '&#xe027;', '&#xe028;', '&#xe029;', '&#xe02a;', '&#xe02b;', '&#xe02c;', '&#xe02d;', '&#xe02e;', '&#xe02f;', '&#xe030;', '&#xe103;', '&#xe0ee;', '&#xe0ef;', '&#xe0e8;', '&#xe0ea;', '&#xe101;', '&#xe107;', '&#xe108;', '&#xe102;', '&#xe106;', '&#xe0eb;', '&#xe010;', '&#xe105;', '&#xe0ed;', '&#xe100;', '&#xe104;', '&#xe0e9;', '&#xe109;', '&#xe0ec;', '&#xe0fe;', '&#xe0f6;', '&#xe0fb;', '&#xe0e2;', '&#xe0e3;', '&#xe0f5;', '&#xe0e1;', '&#xe0ff;', '&#xe031;', '&#xe032;', '&#xe033;', '&#xe034;', '&#xe035;', '&#xe036;', '&#xe037;', '&#xe038;', '&#xe039;', '&#xe03a;', '&#xe03b;', '&#xe03c;', '&#xe03d;', '&#xe03e;', '&#xe03f;', '&#xe040;', '&#xe041;', '&#xe042;', '&#xe043;', '&#xe044;', '&#xe045;', '&#xe046;', '&#xe047;', '&#xe048;', '&#xe049;', '&#xe04a;', '&#xe04b;', '&#xe04c;', '&#xe04d;', '&#xe04e;', '&#xe04f;', '&#xe050;', '&#xe051;', '&#xe052;', '&#xe053;', '&#xe054;', '&#xe055;', '&#xe056;', '&#xe057;', '&#xe058;', '&#xe059;', '&#xe05a;', '&#xe05b;', '&#xe05c;', '&#xe05d;', '&#xe05e;', '&#xe05f;', '&#xe060;', '&#xe061;', '&#xe062;', '&#xe063;', '&#xe064;', '&#xe065;', '&#xe066;', '&#xe067;', '&#xe068;', '&#xe069;', '&#xe06a;', '&#xe06b;', '&#xe06c;', '&#xe06d;', '&#xe06e;', '&#xe06f;', '&#xe070;', '&#xe071;', '&#xe072;', '&#xe073;', '&#xe074;', '&#xe075;', '&#xe076;', '&#xe077;', '&#xe078;', '&#xe079;', '&#xe07a;', '&#xe07b;', '&#xe07c;', '&#xe07d;', '&#xe07e;', '&#xe07f;', '&#xe080;', '&#xe081;', '&#xe082;', '&#xe083;', '&#xe084;', '&#xe085;', '&#xe086;', '&#xe087;', '&#xe088;', '&#xe089;', '&#xe08a;', '&#xe08b;', '&#xe08c;', '&#xe08d;', '&#xe08e;', '&#xe08f;', '&#xe090;', '&#xe091;', '&#xe092;', '&#xe0f8;', '&#xe0fa;', '&#xe0e7;', '&#xe0fd;', '&#xe0e4;', '&#xe0e5;', '&#xe0f7;', '&#xe0e0;', '&#xe0fc;', '&#xe0f9;', '&#xe0dd;', '&#xe0f1;', '&#xe0dc;', '&#xe0f3;', '&#xe0d8;', '&#xe0db;', '&#xe0f0;', '&#xe0df;', '&#xe0f2;', '&#xe0f4;', '&#xe0d9;', '&#xe0da;', '&#xe0de;', '&#xe0e6;', '&#xe093;', '&#xe094;', '&#xe095;', '&#xe096;', '&#xe097;', '&#xe098;', '&#xe099;', '&#xe09a;', '&#xe09b;', '&#xe09c;', '&#xe09d;', '&#xe09e;', '&#xe09f;', '&#xe0a0;', '&#xe0a1;', '&#xe0a2;', '&#xe0a3;', '&#xe0a4;', '&#xe0a5;', '&#xe0a6;', '&#xe0a7;', '&#xe0a8;', '&#xe0a9;', '&#xe0aa;', '&#xe0ab;', '&#xe0ac;', '&#xe0ad;', '&#xe0ae;', '&#xe0af;', '&#xe0b0;', '&#xe0b1;', '&#xe0b2;', '&#xe0b3;', '&#xe0b4;', '&#xe0b5;', '&#xe0b6;', '&#xe0b7;', '&#xe0b8;', '&#xe0b9;', '&#xe0ba;', '&#xe0bb;', '&#xe0bc;', '&#xe0bd;', '&#xe0be;', '&#xe0bf;', '&#xe0c0;', '&#xe0c1;', '&#xe0c2;', '&#xe0c3;', '&#xe0c4;', '&#xe0c5;', '&#xe0c6;', '&#xe0c7;', '&#xe0c8;', '&#xe0c9;', '&#xe0ca;', '&#xe0cb;', '&#xe0cc;', '&#xe0cd;', '&#xe0ce;', '&#xe0cf;', '&#xe0d0;', '&#xe0d1;', '&#xe0d2;', '&#xe0d3;', '&#xe0d4;', '&#xe0d5;', '&#xe0d6;', '&#xe0d7;', '&#xe600;', '&#xe601;', '&#xe602;', '&#xe603;', '&#xe604;', '&#xe605;', '&#xe606;', '&#xe607;', '&#xe608;', '&#xe609;', '&#xe60a;', '&#xe60b;', '&#xe60c;', '&#xe60d;', '&#xe60e;', '&#xe60f;', '&#xe610;', '&#xe611;', '&#xe612;', '&#xe008;', );
$symbols = apply_filters( 'et_pb_font_icon_symbols', $symbols );
if ( ! function_exists( 'et_pb_get_font_icon_list' ) ) :
function et_pb_get_font_icon_list() {
$output = is_customize_preview() ? et_pb_get_font_icon_list_items() : '<%= window.et_builder.font_icon_list_template() %>';
$output = sprintf( '<ul class="et_font_icon">%1$s</ul>', et_core_esc_previously( $output ) );
if ( ! function_exists( 'et_pb_get_svg_icons_list' ) ) :
function et_pb_get_svg_icons_list() {
<path d="M18 13h-3v-3a1 1 0 0 0-2 0v3h-3a1 1 0 0 0 0 2h3v3a1 1 0 0 0 2 0v-3h3a1 1 0 0 0 0-2z" fillRule="evenodd" />
<path d="M19 9h-3V8a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v1H9a1 1 0 1 0 0 2h10a1 1 0 0 0 .004-2H19zM9 20c.021.543.457.979 1 1h8c.55-.004.996-.45 1-1v-7H9v7zm2.02-4.985h2v4h-2v-4zm4 0h2v4h-2v-4z" fillRule="evenodd" />
<path d="M20.426 13.088l-1.383-.362a.874.874 0 0 1-.589-.514l-.043-.107a.871.871 0 0 1 .053-.779l.721-1.234a.766.766 0 0 0-.116-.917 6.682 6.682 0 0 0-.252-.253.768.768 0 0 0-.917-.116l-1.234.722a.877.877 0 0 1-.779.053l-.107-.044a.87.87 0 0 1-.513-.587l-.362-1.383a.767.767 0 0 0-.73-.567h-.358a.768.768 0 0 0-.73.567l-.362 1.383a.878.878 0 0 1-.513.589l-.107.044a.875.875 0 0 1-.778-.054l-1.234-.722a.769.769 0 0 0-.918.117c-.086.082-.17.166-.253.253a.766.766 0 0 0-.115.916l.721 1.234a.87.87 0 0 1 .053.779l-.043.106a.874.874 0 0 1-.589.514l-1.382.362a.766.766 0 0 0-.567.731v.357a.766.766 0 0 0 .567.731l1.383.362c.266.07.483.26.588.513l.043.107a.87.87 0 0 1-.053.779l-.721 1.233a.767.767 0 0 0 .115.917c.083.087.167.171.253.253a.77.77 0 0 0 .918.116l1.234-.721a.87.87 0 0 1 .779-.054l.107.044a.878.878 0 0 1 .513.589l.362 1.383a.77.77 0 0 0 .731.567h.356a.766.766 0 0 0 .73-.567l.362-1.383a.878.878 0 0 1 .515-.589l.107-.044a.875.875 0 0 1 .778.054l1.234.721c.297.17.672.123.917-.117.087-.082.171-.166.253-.253a.766.766 0 0 0 .116-.917l-.721-1.234a.874.874 0 0 1-.054-.779l.044-.107a.88.88 0 0 1 .589-.513l1.383-.362a.77.77 0 0 0 .567-.731v-.357a.772.772 0 0 0-.569-.724v-.005zm-6.43 3.9a2.986 2.986 0 1 1 2.985-2.986 3 3 0 0 1-2.985 2.987v-.001z" fillRule="evenodd" />
<path d="M19.4 14.6c0 0-1.5 3.1-1.5 4.4 0 0.9 0.7 1.6 1.5 1.6 0.8 0 1.5-0.7 1.5-1.6C20.9 17.6 19.4 14.6 19.4 14.6zM19.3 12.8l-4.8-4.8c-0.2-0.2-0.4-0.3-0.6-0.3 -0.3 0-0.5 0.1-0.7 0.3l-1.6 1.6L9.8 7.8c-0.4-0.4-1-0.4-1.4 0C8 8.1 8 8.8 8.4 9.1l1.8 1.8 -2.8 2.8c-0.4 0.4-0.4 1-0.1 1.4l4.6 4.6c0.2 0.2 0.4 0.3 0.6 0.3 0.3 0 0.5-0.1 0.7-0.3l6.1-6.1C19.5 13.4 19.5 13.1 19.3 12.8zM15.6 14.6c-1.7 1.7-4.5 1.7-6.2 0l2.1-2.1 1 1c0.4 0.4 1 0.4 1.4 0 0.4-0.4 0.4-1 0-1.4l-1-1 0.9-0.9 3.1 3.1L15.6 14.6z" fillRule="evenodd"/>
<path d="M22.9 7.5c-0.1-0.3-0.5-0.6-0.8-0.6H5.9c-0.4 0-0.7 0.2-0.8 0.6C5.1 7.6 5 7.7 5 7.9v12.2c0 0.1 0 0.2 0.1 0.4 0.1 0.3 0.5 0.5 0.8 0.6h16.2c0.4 0 0.7-0.2 0.8-0.6 0-0.1 0.1-0.2 0.1-0.4V7.9C23 7.7 23 7.6 22.9 7.5zM21 18.9H7v-10h14V18.9z" fillRule="evenodd"/>
<circle cx="10.5" cy="12.4" r="1.5"/>
<polygon points="15 16.9 13 13.9 11 16.9 "/>
<polygon points="17 10.9 15 16.9 19 16.9 "/>
<path d="M22.9 7.5c-0.1-0.3-0.5-0.6-0.8-0.6H5.9c-0.4 0-0.7 0.2-0.8 0.6C5.1 7.6 5 7.7 5 7.9v12.2c0 0.1 0 0.2 0.1 0.4 0.1 0.3 0.5 0.5 0.8 0.6h16.2c0.4 0 0.7-0.2 0.8-0.6 0-0.1 0.1-0.2 0.1-0.4V7.9C23 7.7 23 7.6 22.9 7.5zM21 18.9L7 8.9h14V18.9z" fillRule="evenodd"/>
<path d="M22.9 7.5c-0.1-0.3-0.5-0.6-0.8-0.6H5.9c-0.4 0-0.7 0.2-0.8 0.6C5.1 7.6 5 7.7 5 7.9v12.2c0 0.1 0 0.2 0.1 0.4 0.1 0.3 0.5 0.5 0.8 0.6h16.2c0.4 0 0.7-0.2 0.8-0.6 0-0.1 0.1-0.2 0.1-0.4V7.9C23 7.7 23 7.6 22.9 7.5zM21 18.9H7v-10h14V18.9z" fillRule="evenodd"/>
<polygon points="13 10.9 13 16.9 17 13.9 "/>
<path d="M19 12h-3V9c0-0.5-0.5-1-1-1H8C7.5 8 7 8.5 7 9v7c0 0.5 0.5 1 1 1h3v3c0 0.5 0.5 1 1 1h7c0.5 0 1-0.5 1-1v-7C20 12.5 19.5 12 19 12zM18 19h-5v-2h2c0.5 0 1-0.5 1-1v-2h2V19z" fillRule="evenodd"/>
<path d="M14 24c5.5 0 10-4.5 10-10S19.5 4 14 4 4 8.5 4 14s4.5 10 10 10zm0-17.5c4.1 0 7.5 3.4 7.5 7.5 0 1.5-.5 2.9-1.2 4.1L9.9 7.7c1.2-.7 2.6-1.2 4.1-1.2zM7.7 9.9l10.4 10.4c-1.2.8-2.6 1.2-4.1 1.2-4.1 0-7.5-3.4-7.5-7.5 0-1.5.5-2.9 1.2-4.1z"/>
<path d="M14 24c5.5 0 10-4.5 10-10S19.5 4 14 4 4 8.5 4 14s4.5 10 10 10zm0-17.5c4.1 0 7.5 3.4 7.5 7.5 0 1.5-.5 2.9-1.2 4.1L9.9 7.7c1.2-.7 2.6-1.2 4.1-1.2zM7.7 9.9l10.4 10.4c-1.2.8-2.6 1.2-4.1 1.2-4.1 0-7.5-3.4-7.5-7.5 0-1.5.5-2.9 1.2-4.1z"/>