/* Widget Name: Button Description: Create a custom button with flexible styling, icon support, and click tracking functionality. Author: SiteOrigin Author URI: https://siteorigin.com Documentation: https://siteorigin.com/widgets-bundle/button-widget-documentation/ Keywords: event, icon, link */ class SiteOrigin_Widget_Button_Widget extends SiteOrigin_Widget { public function __construct() { parent::__construct( 'sow-button', __( 'SiteOrigin Button', 'so-widgets-bundle' ), array( 'description' => __( 'Create a custom button with flexible styling, icon support, and click tracking functionality.', 'so-widgets-bundle' ), 'help' => 'https://siteorigin.com/widgets-bundle/button-widget-documentation/', ), array( ), false, plugin_dir_path( __FILE__ ) ); } public function get_settings_form() { return array( 'responsive_breakpoint' => array( 'type' => 'measurement', 'label' => __( 'Responsive Breakpoint', 'so-widgets-bundle' ), 'default' => '780px', 'description' => __( 'This setting controls when the Mobile Align setting will be used. The default value is 780px.', 'so-widgets-bundle' ), ), ); } public function initialize() { $this->register_frontend_styles( array( array( 'sow-button-base', plugin_dir_url( __FILE__ ) . 'css/style.css', array(), SOW_BUNDLE_VERSION, ), ) ); } public function get_widget_form() { return array( 'text' => array( 'type' => 'text', 'label' => __( 'Button Text', 'so-widgets-bundle' ), ), 'url' => array( 'type' => 'link', 'label' => __( 'Destination URL', 'so-widgets-bundle' ), 'allow_shortcode' => true, ), 'new_window' => array( 'type' => 'checkbox', 'default' => false, 'label' => __( 'Open in a new window', 'so-widgets-bundle' ), ), 'download' => array( 'type' => 'checkbox', 'default' => false, 'label' => __( 'Download', 'so-widgets-bundle' ), 'description' => __( 'The Destination URL will be downloaded when a user clicks on the button.', 'so-widgets-bundle' ), ), 'button_icon' => array( 'type' => 'section', 'label' => __( 'Icon', 'so-widgets-bundle' ), 'fields' => array( 'icon_selected' => array( 'type' => 'icon', 'label' => __( 'Icon', 'so-widgets-bundle' ), ), 'icon_color' => array( 'type' => 'color', 'label' => __( 'Icon Color', 'so-widgets-bundle' ), ), 'icon' => array( 'type' => 'media', 'label' => __( 'Image Icon', 'so-widgets-bundle' ), 'description' => __( 'Replaces the icon with your own image icon.', 'so-widgets-bundle' ), ), 'icon_placement' => array( 'type' => 'select', 'label' => __( 'Icon Placement', 'so-widgets-bundle' ), 'default' => 'left', 'options' => array( 'top' => __( 'Top', 'so-widgets-bundle' ), 'right' => __( 'Right', 'so-widgets-bundle' ), 'bottom' => __( 'Bottom', 'so-widgets-bundle' ), 'left' => __( 'Left', 'so-widgets-bundle' ), ), ), ), ), 'design' => array( 'type' => 'section', 'label' => __( 'Design and Layout', 'so-widgets-bundle' ), 'hide' => true, 'fields' => array( 'width' => array( 'type' => 'measurement', 'label' => __( 'Width', 'so-widgets-bundle' ), 'description' => __( 'Leave blank to let the button resize according to content.', 'so-widgets-bundle' ), ), 'align' => array( 'type' => 'select', 'label' => __( 'Align', 'so-widgets-bundle' ), 'default' => 'center', 'options' => array( 'left' => __( 'Left', 'so-widgets-bundle' ), 'right' => __( 'Right', 'so-widgets-bundle' ), 'center' => __( 'Center', 'so-widgets-bundle' ), 'justify' => __( 'Full Width', 'so-widgets-bundle' ), ), ), 'mobile_align' => array( 'type' => 'select', 'label' => __( 'Mobile Align', 'so-widgets-bundle' ), 'default' => 'center', 'options' => array( 'left' => __( 'Left', 'so-widgets-bundle' ), 'right' => __( 'Right', 'so-widgets-bundle' ), 'center' => __( 'Center', 'so-widgets-bundle' ), 'justify' => __( 'Full Width', 'so-widgets-bundle' ), ), ), 'theme' => array( 'type' => 'select', 'label' => __( 'Button Theme', 'so-widgets-bundle' ), 'default' => 'flat', 'options' => array( 'atom' => __( 'Atom', 'so-widgets-bundle' ), 'flat' => __( 'Flat', 'so-widgets-bundle' ), 'wire' => __( 'Wire', 'so-widgets-bundle' ), ), ), 'button_color' => array( 'type' => 'color', 'label' => __( 'Button Color', 'so-widgets-bundle' ), ), 'text_color' => array( 'type' => 'color', 'label' => __( 'Text Color', 'so-widgets-bundle' ), ), 'hover' => array( 'type' => 'checkbox', 'default' => true, 'label' => __( 'Use hover effects', 'so-widgets-bundle' ), 'state_emitter' => array( 'callback' => 'conditional', 'args' => array( 'hover[show]: val', 'hover[hide]: ! val', ), ), ), 'hover_background_color' => array( 'type' => 'color', 'label' => __( 'Hover Background Color', 'so-widgets-bundle' ), 'state_handler' => array( 'hover[show]' => array( 'show' ), 'hover[hide]' => array( 'hide' ), ), ), 'hover_text_color' => array( 'type' => 'color', 'label' => __( 'Hover Text Color', 'so-widgets-bundle' ), 'state_handler' => array( 'hover[show]' => array( 'show' ), 'hover[hide]' => array( 'hide' ), ), ), 'font' => array( 'type' => 'font', 'label' => __( 'Font', 'so-widgets-bundle' ), 'default' => 'default', ), 'font_size' => array( 'type' => 'measurement', 'label' => __( 'Font Size', 'so-widgets-bundle' ), 'default' => '1em', ), 'icon_size' => array( 'type' => 'measurement', 'label' => __( 'Icon Size', 'so-widgets-bundle' ), 'default' => '1.3em', ), 'padding' => array( 'type' => 'measurement', 'label' => __( 'Padding', 'so-widgets-bundle' ), 'default' => '1em', ), 'rounding' => array( 'type' => 'multi-measurement', 'label' => __( 'Rounding', 'so-widgets-bundle' ), 'default' => '0.25em 0.25em 0.25em 0.25em', 'measurements' => array( 'top' => array( 'label' => __( 'Top', 'so-widgets-bundle' ), ), 'right' => array( 'label' => __( 'Right', 'so-widgets-bundle' ), ), 'bottom' => array( 'label' => __( 'Bottom', 'so-widgets-bundle' ), ), 'left' => array( 'label' => __( 'Left', 'so-widgets-bundle' ), ), ), ), ), ), 'attributes' => array( 'type' => 'section', 'label' => __( 'Other Attributes and SEO', 'so-widgets-bundle' ), 'hide' => true, 'fields' => array( 'id' => array( 'type' => 'text', 'label' => __( 'Button ID', 'so-widgets-bundle' ), 'description' => __( 'An ID attribute allows you to target this button in JavaScript.', 'so-widgets-bundle' ), ), 'classes' => array( 'type' => 'text', 'label' => __( 'Button Classes', 'so-widgets-bundle' ), 'description' => __( 'Additional CSS classes added to the button link.', 'so-widgets-bundle' ), ), 'title' => array( 'type' => 'text', 'label' => __( 'Title Attribute', 'so-widgets-bundle' ), 'description' => __( 'Adds a title attribute to the button link.', 'so-widgets-bundle' ), ), 'on_click' => array( 'type' => 'text', 'label' => __( 'Onclick', 'so-widgets-bundle' ), 'description' => __( 'Run this JavaScript when the button is clicked. Ideal for tracking.', 'so-widgets-bundle' ), 'onclick' => true, ), 'rel' => array( 'type' => 'text', 'label' => __( 'Rel Attribute', 'so-widgets-bundle' ), 'description' => __( 'Adds a rel attribute to the button link.', 'so-widgets-bundle' ), ), ), ), ); } public function get_style_name( $instance ) { if ( empty( $instance['design']['theme'] ) ) { return 'atom'; } return $instance['design']['theme']; } /** * Get the variables for the Button Widget. * * @return array */ public function get_template_variables( $instance, $args ) { $button_attributes = array(); $attributes = $instance['attributes']; $classes = ! empty( $attributes['classes'] ) ? $attributes['classes'] : ''; if ( ! empty( $classes ) ) { $classes .= ' '; } $classes .= 'sowb-button ow-icon-placement-' . $instance['button_icon']['icon_placement']; if ( ! empty( $instance['design']['hover'] ) ) { $classes .= ' ow-button-hover'; } $button_attributes['class'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $classes ) ) ); if ( ! empty( $instance['new_window'] ) ) { $button_attributes['target'] = '_blank'; $button_attributes['rel'] = 'noopener noreferrer'; } if ( ! empty( $instance['download'] ) ) { $button_attributes['download'] = null; } if ( ! empty( $attributes['id'] ) ) { $button_attributes['id'] = $attributes['id']; } if ( ! empty( $attributes['title'] ) ) { $button_attributes['title'] = $attributes['title']; } if ( ! empty( $attributes['rel'] ) ) { if ( isset( $button_attributes['rel'] ) ) { $button_attributes['rel'] .= " $attributes[rel]"; } else { $button_attributes['rel'] = $attributes['rel']; } } $icon_image_url = ''; if ( ! empty( $instance['button_icon']['icon'] ) ) { $attachment = wp_get_attachment_image_src( $instance['button_icon']['icon'] ); if ( ! empty( $attachment ) ) { $icon_image_url = $attachment[0]; } } return array( 'button_attributes' => apply_filters( 'siteorigin_widgets_button_attributes', $button_attributes, $instance ), 'href' => ! empty( $instance['url'] ) ? $instance['url'] : '', 'on_click' => ! empty( $attributes['on_click'] ) ? $attributes['on_click'] : '', 'align' => $instance['design']['align'], 'icon_image_url' => $icon_image_url, 'icon' => $instance['button_icon']['icon_selected'], 'icon_color' => $instance['button_icon']['icon_color'], 'text' => $instance['text'], ); } /** * Get the variables that we'll be injecting into the less stylesheet. * * @return array */ public function get_less_variables( $instance ) { if ( empty( $instance ) || empty( $instance['design'] ) ) { return array(); } $text_color = isset( $instance['design']['text_color'] ) ? $instance['design']['text_color'] : ''; $button_color = isset( $instance['design']['button_color'] ) ? $instance['design']['button_color'] : ''; $less_vars = array( 'button_width' => isset( $instance['design']['width'] ) ? $instance['design']['width'] : '', 'button_color' => $button_color, 'text_color' => $text_color, 'icon_size' => ! empty( $instance['design']['icon_size'] ) ? $instance['design']['icon_size'] : '1.3em', 'hover_text_color' => ! empty( $instance['design']['hover_text_color'] ) ? $instance['design']['hover_text_color'] : $text_color, 'hover_background_color' => ! empty( $instance['design']['hover_background_color'] ) ? $instance['design']['hover_background_color'] : $button_color, 'font_size' => isset( $instance['design']['font_size'] ) ? $instance['design']['font_size'] : '', 'rounding' => isset( $instance['design']['rounding'] ) ? $instance['design']['rounding'] : '', 'padding' => isset( $instance['design']['padding'] ) ? $instance['design']['padding'] : '', 'has_text' => empty( $instance['text'] ) ? 'false' : 'true', 'responsive_breakpoint' => $this->get_global_settings( 'responsive_breakpoint' ), 'align' => ! empty( $instance['design']['align'] ) ? $instance['design']['align'] : 'center', 'mobile_align' => ! empty( $instance['design']['mobile_align'] ) ? $instance['design']['mobile_align'] : 'center', 'has_button_icon' => empty( $instance['button_icon']['icon_selected'] ) ? 'false' : 'true', ); if ( ! empty( $instance['design']['font'] ) ) { $font = siteorigin_widget_get_font( $instance['design']['font'] ); $less_vars['button_font'] = $font['family']; if ( ! empty( $font['weight'] ) ) { $less_vars['button_font_weight'] = $font['weight_raw']; $less_vars['button_font_style'] = $font['style']; } } return $less_vars; } /** * Make sure the instance is the most up to date version. * * @return mixed */ public function modify_instance( $instance ) { if ( empty( $instance ) ) { return array(); } $migrate_props = array( 'button_icon' => array( 'icon_selected', 'icon_color', 'icon', ), 'design' => array( 'align', 'theme', 'button_color', 'text_color', 'hover', 'hover_text_color', 'hover_background_color', 'font_size', 'rounding', 'padding', ), 'attributes' => array( 'id', ), ); foreach ( $migrate_props as $prop => $sub_props ) { if ( empty( $instance[ $prop ] ) ) { $instance[ $prop ] = array(); foreach ( $sub_props as $sub_prop ) { if ( isset( $instance[ $sub_prop ] ) ) { $instance[ $prop ][ $sub_prop ] = $instance[ $sub_prop ]; unset( $instance[ $sub_prop ] ); } } } } // Migrate onclick setting to prevent Wordfence flag. if ( ! empty( $instance['attributes'] ) && ! empty( $instance['attributes']['onclick'] ) ) { $instance['attributes']['on_click'] = $instance['attributes']['onclick']; } // If the mobile_align setting isn't set, set it to the same value as the align value. if ( ! empty( $instance['design'] ) && ! empty( $instance['design']['align'] ) && empty( $instance['design']['mobile_align'] ) ) { $instance['design']['mobile_align'] = $instance['design']['align']; } // Migrate predefined settings to more customizable settings. if ( ! empty( $instance['design']['font_size'] ) && is_numeric( $instance['design']['font_size'] ) ) { $instance['design']['font_size'] .= 'em'; } if ( ! empty( $instance['design']['padding'] ) && is_numeric( $instance['design']['padding'] ) ) { $instance['design']['padding'] .= 'em'; } if ( ! empty( $instance['design']['rounding'] ) && is_numeric( $instance['design']['rounding'] ) ) { $instance['design']['rounding'] = $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em'; } if ( empty( $instance['design']['icon_size'] ) ) { $instance['design']['icon_size'] = '1.3em'; } return $instance; } public function get_form_teaser() { if ( class_exists( 'SiteOrigin_Premium' ) ) { return false; } return array( sprintf( __( 'Add a beautiful tooltip to the Button Widget with %sSiteOrigin Premium%s', 'so-widgets-bundle' ), '', '' ), ); } } siteorigin_widget_register( 'sow-button', __FILE__, 'SiteOrigin_Widget_Button_Widget' );{"id":59332,"date":"2026-05-21T09:23:51","date_gmt":"2026-05-21T09:23:51","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=59332"},"modified":"2026-05-21T09:23:52","modified_gmt":"2026-05-21T09:23:52","slug":"gamer-missen-zigeunern-daher-exakt-anmerken-wafer-spiele-je-angewandten-maklercourtage-begabt-seien-unter-anderem-pass-away-auf-keinen-fall","status":"publish","type":"post","link":"http:\/\/klecet.edu.in\/alumni\/gamer-missen-zigeunern-daher-exakt-anmerken-wafer-spiele-je-angewandten-maklercourtage-begabt-seien-unter-anderem-pass-away-auf-keinen-fall\/","title":{"rendered":"Gamer mi?ssen zigeunern daher exakt anmerken, wafer Spiele je angewandten Maklercourtage begabt seien unter anderem pass away auf keinen fall"},"content":{"rendered":"

Die genauen Prozentsatze, diese verschiedene Spielarten hinten unserem Bonusumsatz hinzufugen, fahig sein gema? Spielsaal und Lieferant modifizieren. Um unangenehme Uberraschungen hinten verhindern, sollen Zocker sich stets unter einsatz von unser maximalen Einsatzlimits anmerken & unser beachten. Unplanma?ig ist eres wesentlich dahinter perzipieren, so sehr zig Angeschlossen-Casinos untergeordnet Einschrankungen wie diverses maximalen Einsatzes solange ein Indienstnahme des With zero Pranumeration Accessories sehen. Meistens haben Spieler gunstgewerblerin bestimmte Phase, inmitten derer diese angewandten Bonus pluspunkt mussen, damit ihn gar nicht hinter einbu?en. Generell eignen diese Anforderungen dass aufgestellt, so sehr die leser sowohl den Spielern alabama auch dem Casino einen gewissen Sturz vorschlag.<\/p>\n

Wahle doch lizenzierte Casinos weiters uberprufe diese Bonusbedingungen, vorweg du spielst<\/h2>\n

Fast alle With no Abschlagzahlung Pramie Angebote alle unserer Verkettete liste erhaltst respons sofortig. Bei dem Spielsalon unlimitiert kannst respons selbige gewonnenen Betrage mehrfach freier zum eins z bringen, denn keine monatlichen Einzahlungslimits gultigkeit haben. Ebendiese Angebote findest respons in erster linie bei Casinos exklusive Verifizierung, die actuelle Zahlungsmethoden ferner vereinfachte Registrierungsprozesse applizieren.<\/p>\n

Es verlangt eres Divene Fortune wo spielen<\/a> Spielern, einige Spiele auszuprobieren ferner herauszufinden, expire jedermann an dem wichtigsten liegen. Au?erplanma?ig sollen Gamer aufwarts selbige Auslese an Vortragen achten, nachfolgende as part of Gangbar Casinos unter zuhilfenahme von NoDeposit Maklercourtage serviceleistungen werden. Ihr Spielsaal, welches transparente ferner faire Bedingungen anbietet, vermag vorzugsweise seien. Angesichts ihr Mannigfaltigkeit an verfugbaren Spiel-Plattformen war eres essenziell, auf der hut zu abwagen, welche Casinos die besten Angebote weiters Bedingungen z. hd. And no Vorleistung Boni zur verfugung stellen. Dies war ergo essentiell, diese spezifischen Bedingungen zu handen jedweden Maklercourtage ferner diese damit verbundenen Spiele within einen AGB & einen Setzbedingungen de l’ensemble des einzelnen Anbieters dahinter etwas unter die lupe nehmen.<\/p>\n

Die kunden vermogen unter einsatz von Angeboten zu handen Freispiele exklusive Einzahlung echtes Piepen erwerben oder dieses ausschutten bewilligen. Diese Mindesteinzahlung, damit die Angebote hinter gewinn, ist meist so sehr niedrig, so sehr meinereiner Zocker via kleinem Finanzplan wie geschmiert mitmischen im griff haben. Bei dem Lohnenswert durch Erwerben leer diesem Maklercourtage ermi\ufffdglichen sich zumeist noch mehr Universelle verwendbarkeit Viele Spielcasino Admirers den vorzug geben Freispiele exklusive Einzahlung, dabei zusatzliche mehr auf Freispiele durch ‘ne Einzahlung setzen.<\/p>\n

So lange du diesseitigen Anbieter testen mochtest, kannst du dich via nachfolgende Alternativ hier einfach weiterleiten lassen. Ein gro?teil Online Spielotheken & Casinos vorubergehen statt dessen uff klassische Einzahlungsboni, within denen deine erste Einzahlung via angeschlossenem Bonusguthaben aufgestockt wird. Angewandten Bonus unter zuhilfenahme von Freispielen frei Einzahlung nachdem ausfindig machen, sei nichtens jeglicher reibungslos.<\/p>\n

Diese Anzahl der Freispiele war eingeschrankt ferner du findest ihr solches Prasentation lieber selten<\/h2>\n

Der gutes Erreichbar Spielcasino abgemacht living area Nutzern genau, hinsichtlich die Casino With no Deposit Pramie Codes eingelost seien beherrschen. Diese Spielbanken gerieren in diesem fall Spielsalon Maklercourtage Codes ebenso wie je andere wie nebensachlich fur jedes bestehende Kunden leer. Erreichbar Spielsalon Additional, gerade Complimentary Spins provision & Casino provision abzuglich einzahlung werden mit dm promo sourcecode nachsehen, der temporar sei.<\/p>\n

Intensiv existieren as part of einen wichtigsten Casinos ausgewahlte Arten de l’ensemble des Provision, die Die kunden kontakt haben sollen. Entweder sollen Sie ihn storungsfrei nur anfordern, oder aber den Provision Quelltext eingeben, der Jedem sodann Einsicht zum Vermittlungsprovision verschafft. Dafur fahig sein Die leser zigeunern jeglicher storungsfrei in unserer Verzeichnis umgucken. Und wird uns ebendiese vom Casino gewahrte Auslese bei Geben elementar. Vor sein eigen nennen unsereins sodann etwas direktemang, wie reibungslos sera ist und bleibt, diesseitigen Bonus nachdem aktivieren & inwiefern zum beispiel ihr Bonuscode unumganglich sei. Deswegen degustieren unsereins unser Angebote meinereiner unter anderem werten Die leser nach bestimmten Ma?staben, ebendiese die schreiber besonders essenziell eignen.<\/p>\n

Fast alle Casinos aneignen jedweder Richtlinie-Zahlungsmethoden, wohl manche verriegeln Skrill ferner Neteller von Auszahlungen nicht mehr da. Fast alle Casinos kontingentieren den Maklercourtage aufwarts den z. hd. Spieler. Das gros Boni sind fix gutgeschrieben, diverse Casinos lechzen noch zu anfang die eine Verifizierung. Sie auffuhren an, entsprechend immer wieder respons einen Vermittlungsgebuhr vorubergehen musst, vorweg du folgende Ausschuttung durchfuhren kannst.<\/p>\n

In der regel gebot nachfolgende Angebote dir zwischen 10 \ufffd unter anderem 50 \ufffd inside Bonusgeldern zum Zum besten geben, trotz kleinere weiters gro?ere Boni gleichfalls existieren. Erstens gebot diverse Casinos dir muhelos Bonusguthaben angeschaltet, unser du inoffizieller mitarbeiter Spielcasino aushandigen kannst. Sera existireren manche Arten von Without-Deposit-Casino-Boni, aufwarts nachfolgende wir nachdem genauer gesagt stellung nehmen sind.<\/p>\n","protected":false},"excerpt":{"rendered":"

Die genauen Prozentsatze, diese verschiedene Spielarten hinten unserem Bonusumsatz hinzufugen, fahig sein gema? Spielsaal und Lieferant modifizieren. Um unangenehme Uberraschungen hinten verhindern, sollen Zocker sich stets unter einsatz von unser maximalen Einsatzlimits anmerken & unser beachten. Unplanma?ig ist eres wesentlich dahinter perzipieren, so sehr zig Angeschlossen-Casinos untergeordnet Einschrankungen wie diverses\u2026<\/p>\n

Continue reading<\/span><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-59332","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/59332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/comments?post=59332"}],"version-history":[{"count":1,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/59332\/revisions"}],"predecessor-version":[{"id":59333,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/59332\/revisions\/59333"}],"wp:attachment":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/media?parent=59332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/categories?post=59332"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/tags?post=59332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}