/* 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":14042,"date":"2026-05-08T09:24:55","date_gmt":"2026-05-08T09:24:55","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=14042"},"modified":"2026-05-08T09:24:56","modified_gmt":"2026-05-08T09:24:56","slug":"best-solana-casinos-2026-most-useful-sol-gambling-sites-rated","status":"publish","type":"post","link":"http:\/\/klecet.edu.in\/alumni\/best-solana-casinos-2026-most-useful-sol-gambling-sites-rated\/","title":{"rendered":"Best Solana Casinos 2026 Most useful SOL Gambling Sites Rated"},"content":{"rendered":"

Built-in the DeFi has ensure it is staking SOL while keeping betting fund accessible, probably making passive income toward gambling enterprise bankrolls. Done one effective incentive betting requirements just before asking for distributions. Check out the bonus terms and conditions meticulously, detailing betting conditions, games restrictions, and time restrictions. Speed-focused people should choose Insane.io getting sub-10-minute distributions.<\/p>\n

To own gambling enterprises, which abilities in addition to lets these to take care of simple gameplay experiences to own every pages on the other hand, irrespective of request. In place of Bitcoin otherwise Ethereum, where network congestion is log off participants wishing times otherwise days, Solana assurances a smooth changeover ranging from funding an account and you can bouncing to the action. Gambling enterprises having fun with SOL could possibly offer quick places and you will withdrawals, opening the door so you’re able to has including alive tournaments which have genuine-day position, on-strings benefits, and you may provably fair options performing at the speed of the system. As opposed to Bitcoin otherwise Ethereum, which can have obstruction and you may erratic charges, Solana\u2019s system assurances smooth, continuous sessions\u2014also throughout level passion. The novel Proof of Records consensus allows exceptional scalability, enabling the newest system to remain secure and you may receptive even during periods off extreme demand. Still, it\u2019s wise to look at the regional guidelines before signing up-and deposit loans.<\/p>\n

The fresh new handbag is free, very easy to arranged, and you may works on each other desktop computer and you will mobile, therefore it is one of the better options for getting together with Solana-founded gambling enterprises and you may Dapps. Solana repayments are let due to blockchain integrations you to be sure close-instant processing. This will make brief or repeated wagers a reduced amount of an alternative as the your treat money more you transact. All of the game is designed in-house because of the Crypto.Games, providing a different sort of gambling experience.<\/p>\n

Help save handbag exchange hashes demonstrating deposits and you will withdrawals. Leave cons happens sometimes when casinos turn off having member fund. Participants chance shedding funds in the event the casinos score closed.<\/p>\n

Within a few minutes, you\u2019ll be to tackle your chosen online casino games the real deal currency. So it local casino also offers a new brand that is included with personal online game like Bull Work at Break and its own playing token $WSM. Immediate Local casino is definitely worth the major just right the variety of crypto casinos you to definitely support Solana. That it means that users provides small and you can productive the means to access their profits, so it is a leading choice for Solana profiles. During the TG Local casino, you can talk about over 300 gambling titles at that Solana casino, also multiple variants of black-jack and roulette, together with jackpot ports. In addition, the new gambling establishment uses security features like SSL, 2FA, and you will cold storage, protecting your own privacy and you may funds.<\/p>\n

This can improve your gameplay which help beginning with an effective loaded gambling membership. Additionally, since the Solana provides safe and fast on the web Winnerz online casino<\/a> deals, many gaming internet accept SOL once the a fees means. Find a very good Solana gambling web sites to possess on the web game play otherwise activities playing only at WhichCasino. Besides unknown game play and waterproof safety, Solana cleared of several hurdles you to very early cryptocurrencies always have trouble with. It\u2019s always better to view regional laws and regulations to make sure your\u2019re certified. Solana purchases is secure and you will, oftentimes, casinos use provably reasonable games to boost transparency.<\/p>\n

This strategy can be optimize the bonus funds you obtain, enabling you to enjoy significantly more playtime and potentially higher winnings. Becoming informed concerning the marketing and advertising schedule of your picked Solana crypto gambling enterprise means that you do not lose out on a very important added bonus possibility. As an example, in the event that a gambling establishment also provides a great ten% cashback venture and you may a player runs into losses of five SOL while in the each week, they’d receive 0.5 SOL right back since incentive loans.<\/p>\n

Alternatives instance Solflare, Ledger Stax, or Better Purse render additional security measures, which makes them perfect for handling dumps and you can withdrawals. Solana places and you will withdrawals are typically immediate and payment-free. Punctual control times was a positive signal that a casino was dependable and economically stable. We along with look at the extra fine print and make certain they was practical and supply participants with actual well worth. Other eco-friendly flags we select are 3rd-people audits in addition to presence of provably reasonable video game.<\/p>\n

These types of offers, not, generally incorporate conditions and betting standards one to participants is comment carefully. Totally free revolves will still be a well-known bonus, allowing slot users to help you spin reels instead risking their finance if you are nevertheless getting the chance to winnings real cash. These can were campaigns regarding having fun with Solana especially, perks tied to blockchain incidents, or unique rewards such as for instance added bonus revolves otherwise competition entries having SOL deals. This type of incentives assist stretch gameplay and generally function significantly more advantageous wagering requirements than just conventional gambling enterprises, leading them to very glamorous having normal participants.<\/p>\n

Which have lower purchase costs and a robust, decentralized structure, Solana has become well-known for DeFi software and you can crypto gambling enterprises the same. Several crypto casinos, along with Shuffle, curently have their particular provably fair roulette and you will black-jack. That includes highest-definition alive dealer game in several dialects, that cover the conventional game as well as kinds of progressive twists. Solana gambling establishment web sites like MetaWin, Shuffle and you can BC.Games is located at the fresh revolutionary when it comes to technical and so they should give you the ideal user experience.<\/p>\n

Parlay and knowledge-particular promotions improve the experience.17 cryptocurrencies is actually served having deposits and you will withdrawals, and Bitcoin, Ethereum, and you will USD Money, plus memecoins eg Dogecoin. It generally does not create unknown gamble, making certain defense because of SSL security and two-basis authentication (2FA). The latest gambling establishment boasts more step three,eight hundred games also ports, baccarat, black-jack, roulette, and you may provably fair online game including Aviator and Mines. So it ensures fast and you can safer deals, straightening having progressive monetary trends. Listed here is our full range of an informed Solana casinos, providing brief places and you may distributions as well as reduced purchase charge.<\/p>\n

You could gamble tabletop game which have live agent games, in addition to Solana blackjack, Solana roulette, Solana baccarat, and much more. Try your own chance into the vintage harbors and table game such as blackjack and you can roulette, or speak about specific niche Solana gambling games for example crash and you will quick profit possibilities. Within Solana gambling enterprises, you\u2019ll select many online game to match your hobbies. This type of ongoing advertisements ensure it is one of the better crypto casinos to own typical members looking for uniform value.<\/p>\n

Reload bonuses give you extra money once you generate a lot more deposits just after having the greeting bonus. This means your wear\u2019t have to fulfill one wagering conditions in order to withdraw they otherwise put it to use to store to try out your preferred gambling games. Such bonuses are an easy way in order to develop more substantial money and you will speak about a wide variety of gambling games. The advantage is unlocked in the ten instalments, with 10% of one’s money put-out every time you wager your own 1st put 6x. The original ones your\u2019ll located is a pleasant extra according to research by the number of SOL you deposit once joining. Understanding the different varieties of bonuses and just how they work is help you optimize your gameplay and have now many well worth out of your preferred Solana gambling establishment.<\/p>\n

Harbors \u2013 Regarding classic slots to big jackpots, there\u2019s constantly one thing to talk about. Remember that profits out of free spins may have betting requirements. Totally free revolves are usually linked with particular slots, allowing you to spin the fresh reels without using the money.<\/p>\n","protected":false},"excerpt":{"rendered":"

Built-in the DeFi has ensure it is staking SOL while keeping betting fund accessible, probably making passive income toward gambling enterprise bankrolls. Done one effective incentive betting requirements just before asking for distributions. Check out the bonus terms and conditions meticulously, detailing betting conditions, games restrictions, and time restrictions. Speed-focused\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-14042","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/14042","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=14042"}],"version-history":[{"count":1,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/14042\/revisions"}],"predecessor-version":[{"id":14043,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/14042\/revisions\/14043"}],"wp:attachment":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/media?parent=14042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/categories?post=14042"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/tags?post=14042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}