Файловый менеджер - Редактировать - /home/kunzqhe/photostocker/2/lets-encrypt.tar
Ðазад
class-letsencrypt-handler.php 0000644 00000151700 15154444756 0012372 0 ustar 00 <?php defined('ABSPATH') or die("you do not have access to this page!"); require_once rsssl_le_path . 'vendor/autoload.php'; use LE_ACME2\Account; use LE_ACME2\Authorizer\AbstractDNSWriter; use LE_ACME2\Authorizer\DNS; use LE_ACME2\Authorizer\HTTP; use LE_ACME2\Connector\Connector; use LE_ACME2\Order; use LE_ACME2\Utilities\Certificate; use LE_ACME2\Utilities\Logger; class rsssl_letsencrypt_handler { private static $_this; /** * Account object * @var bool|LE_ACME2\Account */ public $account = false; public $challenge_directory = false; public $key_directory = false; public $certs_directory = false; public $subjects = array(); function __construct() { if ( isset( self::$_this ) ) { wp_die( sprintf( __( '%s is a singleton class and you cannot create a second instance.', 'really-simple-ssl' ), get_class( $this ) ) ); } //loading of these hooks is stricter. The class can be used in the notices, which are needed on the generic dashboard //These functionality is not needed on the dashboard, so should only be loaded in strict circumstances if ( rsssl_letsencrypt_generation_allowed( true ) ) { add_action( 'rsssl_before_save_lets-encrypt_option', array( $this, 'before_save_wizard_option' ), 10, 4 ); add_action( 'rsssl_le_activation', array( $this, 'cleanup_on_ssl_activation')); add_action( 'rsssl_le_activation', array( $this, 'plugin_activation_actions')); add_action( 'admin_init', array( $this, 'maybe_add_htaccess_exclude')); add_action( 'admin_init', array( $this, 'maybe_create_htaccess_directories')); $this->key_directory = $this->key_directory(); $this->challenge_directory = $this->challenge_directory(); $this->certs_directory = $this->certs_directory(); // Config the desired paths if ( $this->key_directory ) { Account::setCommonKeyDirectoryPath( $this->key_directory ); } if ( $this->challenge_directory ) { HTTP::setDirectoryPath( $this->challenge_directory ); } // General configs Connector::getInstance()->useStagingServer( false ); Logger::getInstance()->setDesiredLevel( Logger::LEVEL_DISABLED ); if ( !rsssl_get_value( 'disable_ocsp' ) ) { Certificate::enableFeatureOCSPMustStaple(); } Order::setPreferredChain('ISRG Root X1'); $this->subjects = $this->get_subjects(); $this->verify_dns(); } self::$_this = $this; } static function this() { return self::$_this; } /** * If we're on apache, add a line to the .htaccess so the acme challenge directory won't get blocked. */ public function maybe_add_htaccess_exclude(){ if (!current_user_can('manage_options')) { return; } if ( !RSSSL()->rsssl_server->uses_htaccess() ) { return; } $htaccess_file = RSSSL()->really_simple_ssl->htaccess_file(); if ( !file_exists($htaccess_file) ) { return; } if ( !is_writable($htaccess_file) ) { return; } $htaccess = file_get_contents( $htaccess_file ); //if it's already inserted, skip. if ( strpos($htaccess, 'Really Simple SSL LETS ENCRYPT') !== FALSE ) { return; } $htaccess = preg_replace("/#\s?BEGIN\s?Really Simple SSL LETS ENCRYPT.*?#\s?END\s?Really Simple SSL LETS ENCRYPT/s", "", $htaccess); $htaccess = preg_replace("/\n+/", "\n", $htaccess); $rules = '#BEGIN Really Simple SSL LETS ENCRYPT'."\n"; $rules .= 'RewriteRule ^.well-known/(.*)$ - [L]'."\n"; $rules .= '#END Really Simple SSL LETS ENCRYPT'."\n"; $htaccess = $rules . $htaccess; file_put_contents($htaccess_file, $htaccess); } /** * Check if we have an installation failed state. * @return bool */ public function installation_failed(){ $installation_active = get_option("rsssl_le_start_installation"); $installation_failed = get_option("rsssl_installation_error"); return $installation_active && $installation_failed; } public function plugin_activation_actions(){ if (get_option('rsssl_activated_plugin')) { //do some actions delete_option('rsssl_activated_plugin'); } } /** * Cleanup. If user did not consent to storage, all password fields should be removed on activation, unless they're needed for renewals */ public function cleanup_on_ssl_activation(){ if (!current_user_can('manage_options')) return; $delete_credentials = !rsssl_get_value('store_credentials'); if ( !$this->certificate_automatic_install_possible() || !$this->certificate_install_required() || $delete_credentials ) { $fields = RSSSL_LE()->config->fields; $fields = array_filter($fields, function($i){ return isset( $i['type'] ) && $i['type'] === 'password'; }); $options = get_option( 'rsssl_options_lets-encrypt' ); foreach ($fields as $fieldname => $field ) { unset($options[$fieldname]); } update_option( 'rsssl_options_lets-encrypt', $options ); } } public function before_save_wizard_option( $fieldname, $fieldvalue, $prev_value, $type ) { rsssl_progress_add('domain'); //only run when changes have been made if ( $fieldvalue === $prev_value ) { return; } if ($fieldname==='other_host_type'){ if ( !rsssl_do_local_lets_encrypt_generation() ) { rsssl_progress_add('directories'); rsssl_progress_add('generation'); rsssl_progress_add('dns-verification'); } } if ( $fieldname==='email' ){ if ( !is_email($fieldvalue) ) { rsssl_progress_remove('domain'); } } } /** * Test for localhost or subfolder usage * @return RSSSL_RESPONSE */ public function check_domain(){ $details = parse_url(site_url()); $path = isset($details['path']) ? $details['path'] : ''; if ( strpos(site_url(), 'localhost')!==false ) { rsssl_progress_remove( 'system-status' ); $action = 'stop'; $status = 'error'; $message = __( "It is not possible to install Let's Encrypt on a localhost environment.", "really-simple-ssl" ); } else if (is_multisite() && get_current_blog_id() !== get_main_site_id() ) { rsssl_progress_remove('system-status'); $action = 'stop'; $status = 'error'; $message = __("It is not possible to install Let's Encrypt on a subsite. Please go to the main site of your website.", "really-simple-ssl" ); } else if ( strlen($path)>0 ) { rsssl_progress_remove('system-status'); $action = 'stop'; $status = 'error'; $message = __("It is not possible to install Let's Encrypt on a subfolder configuration.", "really-simple-ssl" ).rsssl_read_more('https://really-simple-ssl.com/install-ssl-on-subfolders'); } else { $action = 'continue'; $status = 'success'; $message = __("Your domain meets the requirements for Let's Encrypt.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Get certificate installation URL * @return RSSSL_RESPONSE */ public function search_ssl_installation_url(){ //start with most generic, then more specific if possible. $url = 'https://really-simple-ssl.com/install-ssl-certificate'; $host = 'enter-your-dashboard-url-here'; if (function_exists('wp_get_direct_update_https_url') && !empty(wp_get_direct_update_https_url())) { $url = wp_get_direct_update_https_url(); } if ( rsssl_is_cpanel() ) { $cpanel = new rsssl_cPanel(); $host = $cpanel->host; $url = $cpanel->ssl_installation_url; } else if ( rsssl_is_plesk() ) { $plesk = new rsssl_plesk(); $host = $plesk->host; $url = $plesk->ssl_installation_url; } else if ( rsssl_is_directadmin() ) { $directadmin = new rsssl_directadmin(); $host = $directadmin->host; $url = $directadmin->ssl_installation_url; } $hosting_company = rsssl_get_other_host(); if ( $hosting_company && $hosting_company !== 'none' ) { $hosting_specific_link = RSSSL_LE()->config->hosts[$hosting_company]['ssl_installation_link']; if ($hosting_specific_link) { $site = trailingslashit( str_replace(array('https://','http://', 'www.'),'', site_url()) ); if ( strpos($hosting_specific_link,'{host}') !==false && empty($host) ) { $url = ''; } else { $url = str_replace(array('{host}', '{domain}'), array($host, $site), $hosting_specific_link); } } } $action = 'continue'; $status = 'warning'; $message = rsssl_get_manual_instructions_text($url); $output = $url; return new RSSSL_RESPONSE($status, $action, $message, $output ); } /** * Test for localhost usage * @return RSSSL_RESPONSE */ public function certificate_status(){ delete_transient('rsssl_certinfo'); if ( RSSSL()->rsssl_certificate->is_valid() ) { //we have now renewed the cert info transient $certinfo = get_transient('rsssl_certinfo'); $end_date = isset($certinfo['validTo_time_t']) ? $certinfo['validTo_time_t'] : false; $grace_period = strtotime('+'.rsssl_le_manual_generation_renewal_check.' days'); $expiry_date = !empty($end_date) ? date( get_option('date_format'), $end_date ) : __("(unknown)","really-simple-ssl"); //if the certificate expires within the grace period, allow renewal //e.g. expiry date 30 may, now = 10 may => grace period 9 june. if ( $grace_period > $end_date ) { $action = 'continue'; $status = 'success'; $message = sprintf(__("Your certificate will expire on %s.", "really-simple-ssl" ).' '.__("Continue to renew.", "really-simple-ssl" ), $expiry_date); ; } else { $action = 'continue'; $status = 'error'; $message = __("You already have a valid SSL certificate.", "really-simple-ssl" ); } } else { $action = 'continue'; $status = 'success'; $message = __("SSL certificate should be generated and installed.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Check if the certifiate is to expire in max rsssl_le_manual_generation_renewal_check days. * Used in notices list * @return bool */ public function certificate_about_to_expire(){ $about_to_expire = RSSSL()->rsssl_certificate->about_to_expire(); if ( !$about_to_expire ) { //if the certificate is valid, stop any attempt to renew. delete_option('rsssl_le_start_renewal'); delete_option('rsssl_le_start_installation'); return false; } else { return true; } } /** * Test for server software * @return RSSSL_RESPONSE */ public function server_software(){ $action = 'continue'; $status = 'warning'; $message = __("The Hosting Panel software was not recognized. Depending on your hosting provider, the generated certificate may need to be installed manually.", "really-simple-ssl" ); if ( rsssl_is_cpanel() ) { $status = 'success'; $message = __("CPanel recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" ); } else if ( rsssl_is_plesk() ) { $status = 'success'; $message = __("Plesk recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" ); } else if ( rsssl_is_directadmin() ) { $status = 'success'; $message = __("DirectAdmin recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Check if CURL is available * * @return RSSSL_RESPONSE */ public function curl_exists(){ if(function_exists('curl_init') === false){ $action = 'stop'; $status = 'error'; $message = __("The PHP function CURL is not available on your server, which is required. Please contact your hosting provider.", "really-simple-ssl" ); } else { $action = 'continue'; $status = 'success'; $message = __("The PHP function CURL has successfully been detected.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Get or create an account * @return RSSSL_RESPONSE */ public function get_account(){ $account_email = $this->account_email(); if ( is_email($account_email) ) { try { $this->account = ! Account::exists( $account_email ) ? Account::create( $account_email ) : Account::get( $account_email ); $status = 'success'; $action = 'continue'; $message = __("Successfully retrieved account", "really-simple-ssl"); } catch(Exception $e) { error_log(print_r($e, true)); $response = $this->get_error($e); $status = 'error'; $action = 'retry'; if ( strpos($response, 'invalid contact domain')) { $action = 'stop'; $response = __("The used domain for your email address is not allowed.","really-simple-ssl").' '. sprintf(__("Please change your email address %shere%s and try again.", "really-simple-ssl"),'<a href="'.rsssl_letsencrypt_wizard_url().'&step=2'.'">','</a>'); } $message = $response; } } else { error_log("no email set"); $status = 'error'; $action = 'stop'; $message = __("The email address was not set. Please set the email address",'really-simple-ssl'); } return new RSSSL_RESPONSE($status, $action, $message); } /** * @return RSSSL_RESPONSE */ public function get_dns_token(){ if (rsssl_is_ready_for('dns-verification')) { $use_dns = rsssl_dns_verification_required(); $challenge_type = $use_dns ? Order::CHALLENGE_TYPE_DNS : Order::CHALLENGE_TYPE_HTTP; if ( $use_dns ) { try { $this->get_account(); $dnsWriter = new class extends AbstractDNSWriter { public function write( Order $order, string $identifier, string $digest ): bool { $tokens = get_option( 'rsssl_le_dns_tokens', array() ); $tokens[ $identifier ] = $digest; update_option( "rsssl_le_dns_tokens", $tokens ); rsssl_progress_add( 'dns-verification' ); //return false, as we will continue later on. return false; } }; DNS::setWriter( $dnsWriter ); $response = $this->get_order(); $order = $response->output; $response->output = false; if ( $order ) { try { if ( $order->authorize( $challenge_type ) ) { $response = new RSSSL_RESPONSE( 'success', 'continue', __( "Token successfully retrieved.", 'really-simple-ssl' ), json_encode( get_option( 'rsssl_le_dns_tokens' ) ) ); } else { if ( get_option( 'rsssl_le_dns_tokens' ) ) { $response = new RSSSL_RESPONSE( 'success', 'continue', __( "Token successfully retrieved.", 'really-simple-ssl' ), json_encode( get_option( 'rsssl_le_dns_tokens' ) ) ); } else { $response = new RSSSL_RESPONSE( 'error', 'retry', __( "Token not received yet.", 'really-simple-ssl' ) ); } } } catch ( Exception $e ) { error_log( print_r( $e, true ) ); $error = $this->get_error( $e ); if (strpos($error, 'Order has status "invalid"')!==false) { $order->clear(); $error = __("The order is invalid, possibly due to too many failed authorization attempts. Please start at the previous step.","really-simple-ssl"); } else //fixing a plesk bug if ( strpos($error, 'No order for ID ') !== FALSE){ $error .= ' '.__("Order ID mismatch, regenerate order.","really-simple-ssl"); $order->clear(); rsssl_progress_remove('dns-verification'); $error .= ' '.__("If you entered your DNS records before, they need to be changed.","really-simple-ssl"); } $response = new RSSSL_RESPONSE( 'error', 'retry', $error ); } } } catch ( Exception $e ) { rsssl_progress_remove( 'dns-verification' ); $response = $this->get_error( $e ); error_log( print_r( $e, true ) ); $response = new RSSSL_RESPONSE( 'error', 'retry', $response ); } } else { $response = new RSSSL_RESPONSE( 'error', 'stop', __( "Configured for HTTP challenge", 'really-simple-ssl' ) ); } } else { rsssl_progress_remove( 'dns-verification' ); $response = new RSSSL_RESPONSE( 'error', 'stop', $this->not_completed_steps_message('dns-verification') ); } return $response; } /** * Check DNS txt records. * @return RSSSL_RESPONSE */ public function verify_dns(){ if (rsssl_is_ready_for('generation')) { update_option('rsssl_le_dns_records_verified', false); $tokens = get_option('rsssl_le_dns_tokens'); if ( !$tokens) { $status = 'error'; $action = 'stop'; $message = __('Token not generated. Please complete the previous step.',"really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } foreach ($tokens as $identifier => $token){ if (strpos($identifier, '*') !== false) continue; set_error_handler(array($this, 'custom_error_handling')); $response = dns_get_record( "_acme-challenge.$identifier", DNS_TXT ); restore_error_handler(); if ( isset($response[0]['txt']) ){ if ($response[0]['txt'] === $token) { $response = new RSSSL_RESPONSE( 'success', 'continue', sprintf(__('Successfully verified DNS records', "really-simple-ssl"), "_acme-challenge.$identifier") ); update_option('rsssl_le_dns_records_verified', true); } else { $response = new RSSSL_RESPONSE( 'error', 'stop', sprintf(__('The DNS response for %s was %s, while it should be %s.', "really-simple-ssl"), "_acme-challenge.$identifier", $response[0]['txt'], $token ) ); break; } } else { $action = get_option('rsssl_skip_dns_check') ? 'continue' : 'stop'; $response = new RSSSL_RESPONSE( 'warning', $action, sprintf(__('Could not verify TXT record for domain %s', "really-simple-ssl"), "_acme-challenge.$identifier") ); } } } else { $response = new RSSSL_RESPONSE( 'error', 'stop', $this->not_completed_steps_message('dns-verification') ); } return $response; } /** * Clear an existing order */ public function clear_order(){ $this->get_account(); if ( $this->account ) { $response = $this->get_order(); $order = $response->output; if ( $order ) { $order->clear(); } } } /** * Authorize the order * @return RSSSL_RESPONSE */ public function create_bundle_or_renew(){ $bundle_completed = false; $use_dns = rsssl_dns_verification_required(); $attempt_count = intval(get_transient('rsssl_le_generate_attempt_count')); if ( $attempt_count>5 ){ delete_option("rsssl_le_start_renewal"); $message = __("The certificate generation was rate limited for 10 minutes because the authorization failed.",'really-simple-ssl'); if ($use_dns){ $message .= ' '.__("Please double check your DNS txt record.",'really-simple-ssl'); } return new RSSSL_RESPONSE( 'error', 'stop', $message ); } if ( !get_option('rsssl_skip_dns_check') ) { if ( $use_dns && ! get_option( 'rsssl_le_dns_records_verified' ) ) { return new RSSSL_RESPONSE( 'error', 'stop', __( "DNS records were not verified yet. Please complete the previous step.", 'really-simple-ssl' ) ); } } if (rsssl_is_ready_for('generation') ) { $this->get_account(); if ( $use_dns ) { $dnsWriter = new class extends AbstractDNSWriter { public function write( Order $order, string $identifier, string $digest): bool { $status = false; if ( get_option('rsssl_le_dns_tokens') ) { $status = true; } return $status; } }; DNS::setWriter($dnsWriter); } $response = $this->get_order(); $order = $response->output; $response->output = false; if ( $order ) { if ( $order->isCertificateBundleAvailable() ) { try { $order->enableAutoRenewal(); $response = new RSSSL_RESPONSE( 'success', 'continue', __("Certificate already generated. It was renewed if required.",'really-simple-ssl') ); $bundle_completed = true; } catch ( Exception $e ) { error_log( print_r( $e, true ) ); $response = new RSSSL_RESPONSE( 'error', 'retry', $this->get_error( $e ) ); $bundle_completed = false; } } else { $finalized = false; $challenge_type = $use_dns ? Order::CHALLENGE_TYPE_DNS : Order::CHALLENGE_TYPE_HTTP; try { if ( $order->authorize( $challenge_type ) ) { $order->finalize(); $this->reset_attempt(); $finalized = true; } else { $this->count_attempt(); $response = new RSSSL_RESPONSE( 'error', 'retry', __('Authorization not completed yet.',"really-simple-ssl") ); $bundle_completed = false; } } catch ( Exception $e ) { $this->count_attempt(); $message = $this->get_error( $e ); error_log( print_r( $e, true ) ); $response = new RSSSL_RESPONSE( 'error', 'stop', $message ); if (strpos($message, 'Order has status "invalid"')!==false) { $order->clear(); $response->message = __("The order is invalid, possibly due to too many failed authorization attempts. Please start at the previous step.","really-simple-ssl"); if ($use_dns) { rsssl_progress_remove('dns-verification'); $response->message .= ' '.__("As your order will be regenerated, you'll need to update your DNS text records.","really-simple-ssl"); } } else { //if OCSP is not disabled yet, and the order status is not invalid, we disable ocsp, and try again. if ( !rsssl_get_value( 'disable_ocsp' ) ) { RSSSL_LE()->field->save_field('disable_ocsp', true); $response->action = 'retry'; $response->status = 'warning'; $response->message = __("OCSP not supported, the certificate will be generated without OCSP.","really-simple-ssl"); } } } if ($finalized) { try { if ( $order->isCertificateBundleAvailable() ) { error_log( "cert bundle available" ); $bundle_completed = true; $success_cert = $success_intermediate = $success_private = false; $bundle = $order->getCertificateBundle(); $pathToPrivateKey = $bundle->path . $bundle->private; $pathToCertificate = $bundle->path . $bundle->certificate; $pathToIntermediate = $bundle->path . $bundle->intermediate; if ( file_exists( $pathToPrivateKey ) ) { $success_private = true; update_option( 'rsssl_private_key_path', $pathToPrivateKey ); } if ( file_exists( $pathToCertificate ) ) { $success_cert = true; update_option( 'rsssl_certificate_path', $pathToCertificate ); } if ( file_exists( $pathToIntermediate ) ) { $success_intermediate = true; update_option( 'rsssl_intermediate_path', $pathToIntermediate ); } if ( ! $success_cert || ! $success_private || ! $success_intermediate ) { $bundle_completed = false; } if ( $bundle_completed ) { $response = new RSSSL_RESPONSE( 'success', 'continue', __("Successfully generated certificate.",'really-simple-ssl') ); } else { $response = new RSSSL_RESPONSE( 'error', 'retry', __("Files not created yet...",'really-simple-ssl') ); } } else { $response = new RSSSL_RESPONSE( 'error', 'retry', __("Bundle not available yet...",'really-simple-ssl') ); } } catch ( Exception $e ) { error_log( print_r( $e, true ) ); $response = new RSSSL_RESPONSE( 'error', 'retry', $this->get_error( $e ) ); } } } } } else { $response = new RSSSL_RESPONSE( 'error', 'stop', $this->not_completed_steps_message('generation') ); } if ( $bundle_completed ){ rsssl_progress_add('generation'); update_option('rsssl_le_certificate_generated_by_rsssl', true); delete_option("rsssl_le_start_renewal"); } else { rsssl_progress_remove('generation'); } return $response; } /** * Get the order object * * @return RSSSL_RESPONSE */ public function get_order(){ if ( ! Order::exists( $this->account, $this->subjects ) ) { try { $response = new RSSSL_RESPONSE( 'success', 'continue', __("Order successfully created.",'really-simple-ssl') ); $response->output = Order::create( $this->account, $this->subjects ); } catch(Exception $e) { error_log(print_r($e, true)); $response = new RSSSL_RESPONSE( 'error', 'retry', $this->get_error($e) ); } } else { //order exists already $response = new RSSSL_RESPONSE( 'success', 'continue', __( "Order successfully retrieved.", 'really-simple-ssl' ) ); $response->output = Order::get( $this->account, $this->subjects ); } return $response; } /** * Keep track of certain request counts, to prevent rate limiting by LE */ public function count_attempt(){ $attempt_count = intval(get_transient('rsssl_le_generate_attempt_count')); $attempt_count++; set_transient('rsssl_le_generate_attempt_count', $attempt_count, 10 * MINUTE_IN_SECONDS); } public function reset_attempt(){ delete_transient('rsssl_le_generate_attempt_count'); } /** * Check if SSL generation renewal can be handled automatically * @return bool */ public function ssl_generation_can_auto_renew(){ if ( get_option('rsssl_verification_type')==='DNS' && !get_option('rsssl_le_dns_configured_by_rsssl') ) { return false; } else { return true; } } /** * Check if it's possible to autorenew * @return bool */ public function certificate_automatic_install_possible(){ $install_method = get_option('rsssl_le_certificate_installed_by_rsssl'); //if it was never auto installed, we probably can't autorenew. if ($install_method === false ) { return false; } else { return true; } } /** * Check if the manual renewal should start. * * @return bool */ public function should_start_manual_installation_renewal(){ if ( !$this->should_start_manual_ssl_generation() && get_option( "rsssl_le_start_installation" ) ) { return true; } return false; } public function should_start_manual_ssl_generation(){ return get_option( "rsssl_le_start_renewal" ); } /** * Only used if * - SSL generated by RSSSL * - certificate is about to expire * * @return string */ public function certificate_renewal_status_notice(){ if ( !RSSSL_LE()->letsencrypt_handler->ssl_generation_can_auto_renew()){ return 'manual-generation'; } if ( $this->certificate_install_required() && $this->certificate_automatic_install_possible() && $this->installation_failed() ){ return 'automatic-installation-failed'; } if ( $this->certificate_install_required() && !$this->certificate_automatic_install_possible() ) { return 'manual-installation'; } return 'automatic'; } /** * Check if the certificate has to be installed on each renewal * defaults to true. * */ public function certificate_install_required(){ $install_method = get_option('rsssl_le_certificate_installed_by_rsssl'); $hosting_company = rsssl_get_other_host(); if ( in_array($install_method, RSSSL_LE()->config->no_installation_renewal_needed) || in_array($hosting_company, RSSSL_LE()->config->no_installation_renewal_needed)) { return false; } return true; } /** * Check if the certificate needs renewal. * * @return bool */ public function cron_certificate_needs_renewal(){ $cert_file = get_option('rsssl_certificate_path'); if ( empty($cert_file) ) { return false; } $certificate = file_get_contents($cert_file); $certificateInfo = openssl_x509_parse($certificate); $valid_to = $certificateInfo['validTo_time_t']; $in_expiry_days = strtotime( "+".rsssl_le_cron_generation_renewal_check." days" ); if ( $in_expiry_days > $valid_to ) { return true; } else { return false; } } /** * Get account email * @return string */ public function account_email(){ //don't use the default value: we want users to explicitly enter a value return rsssl_get_value('email_address', false); } /** * Get terms accepted * @return RSSSL_RESPONSE */ public function terms_accepted(){ //don't use the default value: we want users to explicitly enter a value $accepted = rsssl_get_value('accept_le_terms', false); if ( $accepted ) { $status = 'success'; $action = 'continue'; $message = __("Terms & Conditions are accepted.",'really-simple-ssl'); } else { $status = 'error'; $action = 'stop'; $message = __("The Terms & Conditions were not accepted. Please accept in the general settings.",'really-simple-ssl'); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Change the email address in an account * @param $new_email */ public function update_account( $new_email ){ if (!$this->account) return; try { $this->account->update($new_email); } catch (Exception $e) { error_log("Lets encrypt email update failed"); error_log(print_r($e, true)); } } /** * Get list of common names on the certificate * @return array */ public function get_subjects(){ $subjects = array(); $domain = rsssl_get_domain(); $root = str_replace( 'www.', '', $domain );; $subjects[] = $domain; //don't offer aliasses for subdomains if ( !rsssl_is_subdomain() ) { if (rsssl_get_value( 'include_alias' )) { //main is www. if ( strpos( $domain, 'www.' ) !== false ) { $alias_domain = $root; } else { $alias_domain = 'www.'.$root; } $subjects[] = $alias_domain; } } if ( rsssl_wildcard_certificate_required() ) { $domain = rsssl_get_domain(); //in theory, the main site of a subdomain setup can be a www. domain. But we have to request a certificate without the www. $domain = str_replace( 'www.', '', $domain ); $subjects = array( $domain, '*.' . $domain, ); } return apply_filters('rsssl_le_subjects', $subjects); } /** * Check if we're ready for the next step. * @param string $item * * @return array | bool */ public function is_ready_for($item) { if ( !rsssl_do_local_lets_encrypt_generation() ) { rsssl_progress_add('directories'); rsssl_progress_add('generation'); rsssl_progress_add('dns-verification'); } if ( !rsssl_dns_verification_required() ) { rsssl_progress_add('dns-verification'); } if (empty(rsssl_get_not_completed_steps($item))){ return true; } else{ return false; } } /** * Catch errors * * @since 3.0 * * @access public * @param $errno * @param $errstr * @param $errfile * @param $errline * @param array $errcontext * * @return bool */ public function custom_error_handling( $errno, $errstr, $errfile, $errline, $errcontext = array() ) { return true; } public function not_completed_steps_message($step){ $not_completed_steps = rsssl_get_not_completed_steps($step); $nice_names = array(); foreach ($not_completed_steps as $not_completed_step ) { $index = array_search($not_completed_step, array_column( RSSSL_LE()->config->steps['lets-encrypt'], 'id')); $nice_names[] = RSSSL_LE()->config->steps['lets-encrypt'][$index+1]['title']; } return sprintf(__('Please complete the following step(s) first: %s', "really-simple-ssl"), implode(", ", $nice_names) ); } /** * Test for writing permissions * @return RSSSL_RESPONSE */ public function check_writing_permissions(){ $directories_without_permissions = $this->directories_without_writing_permissions(); $has_missing_permissions = count($directories_without_permissions)>0; if ( $has_missing_permissions ) { rsssl_progress_remove('directories'); $action = 'stop'; $status = 'error'; $message = __("The following directories do not have the necessary writing permissions.", "really-simple-ssl" )." ".__("Set permissions to 644 to enable SSL generation.", "really-simple-ssl" ); foreach ($directories_without_permissions as $directories_without_permission) { $message .= "<br> - ".$directories_without_permission; } } else { $action = 'continue'; $status = 'success'; $message = __("The required directories have the necessary writing permissions.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Test for directory * @return RSSSL_RESPONSE */ public function check_challenge_directory(){ if ( !$this->challenge_directory() ) { rsssl_progress_remove('directories'); $action = 'stop'; $status = 'error'; $message = __("The challenge directory is not created yet.", "really-simple-ssl" ); } else { $action = 'continue'; $status = 'success'; $message = __("The challenge directory was successfully created.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Test for directory * @return RSSSL_RESPONSE */ public function check_key_directory(){ $action = 'stop'; $status = 'error'; $message = __("The key directory is not created yet.", "really-simple-ssl" ); //this option is set in the key_dir function, so we need to check it now. if ( !get_option('rsssl_create_folders_in_root')) { $action = 'retry'; $message = __("Trying to create directory in root of website.", "really-simple-ssl" ); } if ( !$this->key_directory() ) { rsssl_progress_remove('directories'); } else { $action = 'continue'; $status = 'success'; $message = __("The key directory was successfully created.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Test for directory * @return RSSSL_RESPONSE */ public function check_certs_directory(){ if ( !$this->certs_directory() ) { rsssl_progress_remove('directories'); $action = 'stop'; $status = 'error'; $message = __("The certs directory is not created yet.", "really-simple-ssl" ); } else { $action = 'continue'; $status = 'success'; $message = __("The certs directory was successfully created.", "really-simple-ssl" ); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Check if our created directories have the necessary writing permissions */ public function directories_without_writing_permissions( ){ $required_folders = array( $this->key_directory, $this->certs_directory, ); if ( !rsssl_dns_verification_required() ) { $required_folders[] = $this->challenge_directory; } $no_writing_permissions = array(); foreach ($required_folders as $required_folder){ if (!$this->directory_has_writing_permissions( $required_folder )) { $no_writing_permissions[] = $required_folder; } } return $no_writing_permissions; } /** * Check if a directory has writing permissions * @param string $directory * * @return bool */ public function directory_has_writing_permissions( $directory ){ set_error_handler(array($this, 'custom_error_handling')); $test_file = fopen( $directory . "/really-simple-ssl-permissions-check.txt", "w" ); if ( !$test_file ) { return false; } fwrite($test_file, 'file to test writing permissions for Really Simple SSL'); fclose( $test_file ); restore_error_handler(); if (!file_exists($directory . "/really-simple-ssl-permissions-check.txt")) { return false; } else { return true; } } /** * Check if the challenage directory is reachable over the http protocol * @return RSSSL_RESPONSE */ public function challenge_directory_reachable(){ $file_content = false; $status_code = __('no response','really-simple-ssl'); //make sure we request over http, otherwise the request might fail if the url is already https. $url = str_replace('https://', 'http://', site_url('.well-known/acme-challenge/really-simple-ssl-permissions-check.txt')); $error_message = sprintf(__( "Could not reach challenge directory over %s.", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">'.$url.'</a>'); $test_string = 'Really Simple SSL'; $folders = $this->directories_without_writing_permissions(); if ( !$this->challenge_directory() || count($folders) !==0 ) { $status = 'error'; $action = 'stop'; $message = __( "Challenge directory not writable.", "really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } $response = wp_remote_get( $url ); if ( is_array( $response ) ) { $status_code = wp_remote_retrieve_response_code( $response ); $file_content = wp_remote_retrieve_body( $response ); } if ( $status_code !== 200 ) { if (get_option('rsssl_skip_challenge_directory_request')) { $status = 'warning'; $action = 'continue'; $message = $error_message.' '.sprintf( __( "Error code %s.", "really-simple-ssl" ), $status_code ); } else { $status = 'error'; $action = 'stop'; $message = $error_message.' '.sprintf( __( "Error code %s.", "really-simple-ssl" ), $status_code ); rsssl_progress_remove('directories'); } } else { if ( ! is_wp_error( $response ) && ( strpos( $file_content, $test_string ) !== false ) ) { $status = 'success'; $action = 'continue'; $message = __( "Successfully verified alias domain.", "really-simple-ssl" ); set_transient('rsssl_alias_domain_available', 'available', 30 * MINUTE_IN_SECONDS ); } else { $status = 'error'; $action = 'stop'; $message = $error_message; rsssl_progress_remove('directories'); } } return new RSSSL_RESPONSE($status, $action, $message); } /** * Check if exists, create .well-known/acme-challenge directory if not existing * @return bool|string */ public function challenge_directory() { $root_directory = trailingslashit(ABSPATH); if ( ! file_exists( $root_directory . '.well-known' ) ) { mkdir( $root_directory . '.well-known' ); } if ( ! file_exists( $root_directory . '.well-known/acme-challenge' ) ) { mkdir( $root_directory . '.well-known/acme-challenge' ); } if ( file_exists( $root_directory . '.well-known/acme-challenge' ) ){ return $root_directory . '.well-known/acme-challenge'; } else { return false; } } /** * Check if exists, create ssl/certs directory above the wp root if not existing * @return bool|string */ public function certs_directory(){ $directory = $this->get_directory_path(); if ( ! file_exists( $directory . 'ssl' ) ) { mkdir( $directory . 'ssl' ); } if ( ! file_exists( $directory . 'ssl/certs' ) ) { mkdir( $directory . 'ssl/certs' ); } if ( file_exists( $directory . 'ssl/certs' ) ){ return $directory . 'ssl/certs'; } else { return false; } } /** * Get path to location where to create the directories. * @return string */ public function get_directory_path(){ $root_directory = trailingslashit(ABSPATH); if ( get_option('rsssl_create_folders_in_root') ) { if ( !get_option('rsssl_ssl_dirname') ) { $token = str_shuffle ( time() ); update_option('rsssl_ssl_dirname', $token ); } if ( ! file_exists( $root_directory . get_option('rsssl_ssl_dirname') ) ) { mkdir( $root_directory . get_option('rsssl_ssl_dirname') ); } return $root_directory . trailingslashit( get_option('rsssl_ssl_dirname') ); } else { return trailingslashit(dirname($root_directory)); } } /** * Check if exists, create ssl/keys directory above the wp root if not existing * @return bool|string */ public function key_directory(){ $directory = $this->get_directory_path(); if ( ! file_exists( $directory . 'ssl' ) ) { mkdir( $directory . 'ssl' ); } if ( ! file_exists( $directory . 'ssl/keys' ) ) { mkdir( $directory . 'ssl/keys' ); } if ( file_exists( $directory . 'ssl/keys' ) ){ return $directory . 'ssl/keys'; } else { //if creating the folder has failed, we're on apache, and can write to these folders, we create a root directory. $challenge_dir = $this->challenge_directory; $has_writing_permissions = $this->directory_has_writing_permissions( $challenge_dir ); //we're guessing that if the challenge dir has writing permissions, the new dir will also have it. if ( RSSSL()->rsssl_server->uses_htaccess() && $has_writing_permissions ) { update_option('rsssl_create_folders_in_root', true); } return false; } } /** * Clear the keys directory, used in reset function * @since 5.0 */ public function clear_keys_directory() { if (!current_user_can('manage_options')) { return; } $dir = $this->key_directory(); $this->delete_files_directories_recursively( $dir ); } /** * @param $dir * Delete files and directories recursively. Used to clear the order from keys directory * @since 5.0.11 */ private function delete_files_directories_recursively( $dir ) { if ( strpos( $dir, 'ssl/keys' ) !== false ) { foreach ( glob( $dir . '/*' ) as $file ) { if ( is_dir( $file ) ) { $this->delete_files_directories_recursively( $file ); } else { unlink( $file ); } } rmdir( $dir ); } } public function maybe_create_htaccess_directories(){ if (!current_user_can('manage_options')) { return; } if ( !RSSSL()->rsssl_server->uses_htaccess() ) { return; } if ( !get_option('rsssl_create_folders_in_root') ) { return; } if ( !empty($this->get_directory_path()) ) { $this->write_htaccess_dir_file( $this->get_directory_path().'ssl/.htaccess' ,'ssl'); } if ( !empty($this->key_directory()) ) { $this->write_htaccess_dir_file( trailingslashit($this->key_directory()).'.htaccess' ,'key'); } if ( !empty($this->certs_directory()) ) { $this->write_htaccess_dir_file( trailingslashit($this->certs_directory()).'.htaccess' ,'certs'); } } public function write_htaccess_dir_file($path, $type){ $htaccess = '<ifModule mod_authz_core.c>' . "\n" . ' Require all denied' . "\n" . '</ifModule>' . "\n" . '<ifModule !mod_authz_core.c>' . "\n" . ' Deny from all' . "\n" . '</ifModule>'; insert_with_markers($path, 'Really Simple SSL LETS ENCRYPT', $htaccess); $htaccess = file_get_contents( $path ); if ( strpos($htaccess, 'deny from all') !== FALSE ) { update_option('rsssl_htaccess_file_set_'.$type, true); return; } } /** * Check if it's a subdomain multisite * @return RSSSL_RESPONSE */ public function is_subdomain_setup(){ if ( !is_multisite() ) { $is_subdomain = false; } else { if ( defined('SUBDOMAIN_INSTALL') && SUBDOMAIN_INSTALL ) { $is_subdomain = true; } else { $is_subdomain = false; } } if ($is_subdomain) { $status = 'error'; $action = 'stop'; $message = sprintf(__("This is a multisite configuration with subdomains, which requires a wildcard certificate. Wildcard certificates are part of the %spremium%s plan.",'really-simple-ssl'), '<a href="https://really-simple-ssl.com/pro" target="_blank">','</a>'); rsssl_progress_remove('system-status'); } else { $status = 'success'; $action = 'continue'; $message = __("No subdomain setup detected.","really-simple-ssl"); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Check if we're about to create a wilcard certificate * @return bool */ public function is_wildcard(){ $subjects = $this->get_subjects(); $is_wildcard = false; foreach ($subjects as $domain ) { if ( strpos($domain, '*') !== false ) { $is_wildcard = true; } } return $is_wildcard; } /** * Check if the alias domain is available * * @return RSSSL_RESPONSE */ public function alias_domain_available(){ if ( rsssl_is_subdomain() ) { return new RSSSL_RESPONSE('success', 'continue',__("Alias domain check is not relevant for a subdomain","really-simple-ssl")); } //write a test file to the uploads directory $uploads = wp_upload_dir(); $upload_dir = trailingslashit($uploads['basedir']); $upload_url = trailingslashit($uploads['baseurl']); $file_content = false; $status_code = __('no response','really-simple-ssl'); $domain = rsssl_get_domain(); if ( strpos( $domain, 'www.' ) !== false ) { $is_www = true; $alias_domain = str_replace( 'www.', '', $domain ); } else { $is_www = false; $alias_domain = 'www.'.$domain; } if ( $is_www ) { $message = __("Please check if the non www version of your site also points to this website.", "really-simple-ssl" ); } else { $message = __("Please check if the www version of your site also points to this website.", "really-simple-ssl" ); } $error_message = __( "Could not verify alias domain.", "really-simple-ssl") .' '. $message.' '. __( "If this is not the case, don't add this alias to your certificate.", "really-simple-ssl"); //get cached status first. $cached_status = get_transient('rsssl_alias_domain_available'); if ( $cached_status ) { if ( $cached_status === 'available' ) { $status = 'success'; $action = 'continue'; $message = __( "Successfully verified alias domain.", "really-simple-ssl" ); } else { $status = 'warning'; $action = 'continue'; $message = $error_message; } return new RSSSL_RESPONSE($status, $action, $message); } if ( ! file_exists( $upload_dir . 'rsssl' ) ) { mkdir( $upload_dir . 'rsssl' ); } $test_string = 'file to test alias domain existence'; $test_file = $upload_dir . 'rsssl/test.txt'; file_put_contents($test_file, $test_string ); $test_url = $upload_url . 'rsssl/test.txt'; if ( ! file_exists( $test_file ) ) { $status = 'error'; $action = 'stop'; $message = __("Could not create test folder and file.", "really-simple-ssl").' '. __("Please create a folder 'rsssl' in the uploads directory, with 644 permissions.", "really-simple-ssl"); } else { set_transient('rsssl_alias_domain_available', 'not-available', 30 * MINUTE_IN_SECONDS ); $alias_test_url = str_replace( $domain, $alias_domain, $test_url ); //always over http: $alias_test_url = str_replace('https://','http://', $alias_test_url); $response = wp_remote_get( $alias_test_url ); if ( is_array( $response ) ) { $status_code = wp_remote_retrieve_response_code( $response ); $file_content = wp_remote_retrieve_body( $response ); } if ( $status_code !== 200 ) { $status = 'warning'; $action = 'continue'; $message = $error_message; if (intval($status_code) != 0 ) { $message .= ' '.sprintf( __( "Error code %s", "really-simple-ssl" ), $status_code ); } } else { if ( ! is_wp_error( $response ) && ( strpos( $file_content, $test_string ) !== false ) ) { //make sure we only set this value once, during first setup. if ( !get_option('rsssl_initial_alias_domain_value_set') ) { RSSSL_LE()->field->save_field('rsssl_include_alias', true); update_option('rsssl_initial_alias_domain_value_set', true); } $status = 'success'; $action = 'continue'; $message = __( "Successfully verified alias domain.", "really-simple-ssl" ); set_transient('rsssl_alias_domain_available', 'available', 30 * MINUTE_IN_SECONDS ); } else { $status = 'warning'; $action = 'continue'; $message = $error_message; } } } return new RSSSL_RESPONSE($status, $action, $message); } /** * Get string error from error message. * @param mixed|LE_ACME2\Exception\InvalidResponse $e * * @return string */ private function get_error($e){ $is_raw_response = false; if (method_exists($e, 'getRawResponse') && isset($e->getRawResponse()->body['detail'])) { $is_raw_response = true; $error = $e->getRawResponse()->body['detail']; error_log($error); //check for subproblems if (isset($e->getRawResponse()->body['subproblems'])){ $error .= '<ul>'; foreach($e->getRawResponse()->body['subproblems'] as $index => $problem) { $error .= '<li>'. $this->cleanup_error_message($e->getRawResponse()->body['subproblems'][$index]['detail']).'</li>'; } $error .= '</ul>'; } } else { $error = $e->getMessage(); } $max = strpos($error, 'CURL response'); if ($max===false) { $max = 200; } if (!$is_raw_response){ $error = substr( $error, 0, $max); } return $error; } /** * Generic SSL cert installation function * * @return RSSSL_RESPONSE */ public function cron_renew_installation() { $install_method = get_option('rsssl_le_certificate_installed_by_rsssl'); $data = explode(':', $install_method ); $server = isset($data[0]) ? $data[0] : false; $type = isset($data[1]) ? $data[1] : false; $attempt_count = intval(get_transient('rsssl_le_install_attempt_count')); $attempt_count++; set_transient('rsssl_le_install_attempt_count', $attempt_count, DAY_IN_SECONDS); if ( $attempt_count>10 ){ delete_option("rsssl_le_start_installation"); $status = 'error'; $action = 'stop'; $message = __("The certificate installation was rate limited. Please try again later.",'really-simple-ssl'); return new RSSSL_RESPONSE($status, $action, $message); } if (rsssl_is_ready_for('installation')) { try { if ( $server === 'cpanel' ) { if ($type==='default') { $response = rsssl_install_cpanel_default(); } else if ( function_exists('rsssl_install_cpanel_shell') ) { $response = rsssl_install_cpanel_shell(); } if ( $response->status === 'success' ) { delete_option( "rsssl_le_start_installation" ); } return $response; } else if ( $server === 'plesk') { $response = rsssl_plesk_install(); if ( $response->status === 'success' ) { delete_option( "rsssl_le_start_installation" ); } return $response; } else { $status = 'error'; $action = 'stop'; $message = __("Not recognized server.", "really-simple-ssl"); } } catch (Exception $e) { error_log(print_r($e, true)); $status = 'error'; $action = 'stop'; $message = __("Installation failed.", "really-simple-ssl"); } } else { $status = 'error'; $action = 'stop'; $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl"); } return new RSSSL_RESPONSE($status, $action, $message); } /** * Cleanup the default message a bit * * @param $msg * * @return string|string[] */ private function cleanup_error_message($msg){ return str_replace(array( 'Refer to sub-problems for more information.', 'Error creating new order ::', ), '', $msg); } /** * Encode a string * @param string $string * @return string */ public function encode( $string ) { if ( strlen(trim($string)) === 0 ) { return $string; } if (strpos( $string , 'rsssl_') !== FALSE ) { return $string; } $key = $this->get_key(); if ( !$key ) { $key = $this->set_key(); } $ivlength = openssl_cipher_iv_length('aes-256-cbc'); $iv = openssl_random_pseudo_bytes($ivlength); $ciphertext_raw = openssl_encrypt($string, 'aes-256-cbc', $key, 0, $iv); $key = base64_encode( $iv.$ciphertext_raw ); return 'rsssl_'.$key; } /** * Decode a string * @param $string * * @return string */ public function decode($string){ if ( !wp_doing_cron() && !current_user_can('manage_options') ) { return ''; } if (strpos( $string , 'rsssl_') !== FALSE ) { $key = $this->get_key(); $string = str_replace('rsssl_', '', $string); // To decrypt, split the encrypted data from our IV $ivlength = openssl_cipher_iv_length('aes-256-cbc'); $iv = substr(base64_decode($string), 0, $ivlength); $encrypted_data = substr(base64_decode($string), $ivlength); $decrypted = openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv); return $decrypted; } //not encoded, return return $string; } /** * Set a new key * @return string */ private function set_key(){ update_site_option( 'rsssl_key' , time() ); return get_site_option('rsssl_key'); } /** * Get a decode/encode key * @return false|string */ private function get_key() { return get_site_option( 'rsssl_key' ); } } cron.php 0000644 00000005232 15154444756 0006237 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); add_action( 'plugins_loaded', 'rsssl_le_schedule_cron' ); function rsssl_le_schedule_cron() { //only run if SSL is enabled. if ( !RSSSL()->rsssl_front_end->ssl_enabled ) { return; } //only if generated by RSSSL. if ( ! get_option( 'rsssl_le_certificate_generated_by_rsssl' ) ) { return; } $useCron = true; if ( $useCron ) { if ( ! wp_next_scheduled( 'rsssl_le_every_week_hook' ) ) { wp_schedule_event( time(), 'rsssl_le_weekly', 'rsssl_le_every_week_hook' ); } if ( ! wp_next_scheduled( 'rsssl_le_every_day_hook' ) ) { wp_schedule_event( time(), 'rsssl_le_daily', 'rsssl_le_every_day_hook' ); } add_action( 'rsssl_le_every_week_hook', 'rsssl_le_cron_maybe_start_renewal' ); add_action( 'rsssl_le_every_day_hook', 'rsssl_le_check_renewal_status' ); } else { add_action( 'init', 'rsssl_le_cron_maybe_start_renewal' ); add_action( 'init', 'rsssl_le_check_renewal_status' ); } } /** * Check if the certificate is generated by RSSSL. If so, renew if necessary */ function rsssl_le_cron_maybe_start_renewal(){ if ( !rsssl_generated_by_rsssl() ) { return; } if ( RSSSL_LE()->letsencrypt_handler->cron_certificate_needs_renewal() ) { update_option("rsssl_le_start_renewal", true); } if ( RSSSL_LE()->letsencrypt_handler->certificate_install_required() ) { update_option("rsssl_le_start_installation", true); } } function rsssl_le_check_renewal_status(){ if ( !rsssl_generated_by_rsssl() ) { return; } //when DNS validated, without api, we cannot autorenew if ( !RSSSL_LE()->letsencrypt_handler->ssl_generation_can_auto_renew() ) { return; } $renewal_active = get_option("rsssl_le_start_renewal"); $installation_active = get_option("rsssl_le_start_installation"); if ( $renewal_active ) { RSSSL_LE()->letsencrypt_handler->create_bundle_or_renew(); } else if ( $installation_active ) { RSSSL_LE()->letsencrypt_handler->cron_renew_installation(); } } add_filter( 'cron_schedules', 'rsssl_le_filter_cron_schedules' ); function rsssl_le_filter_cron_schedules( $schedules ) { $schedules['rsssl_le_weekly'] = array( 'interval' => WEEK_IN_SECONDS, 'display' => __( 'Once every week' ) ); $schedules['rsssl_le_daily'] = array( 'interval' => DAY_IN_SECONDS, 'display' => __( 'Once every day' ) ); $schedules['rsssl_le_five_minutes'] = array( 'interval' => 5 * MINUTE_IN_SECONDS, 'display' => __( 'Once every 5 minutes' ) ); return $schedules; } register_deactivation_hook( rsssl_file, 'rsssl_le_clear_scheduled_hooks' ); function rsssl_le_clear_scheduled_hooks() { wp_clear_scheduled_hook( 'rsssl_le_every_week_hook' ); wp_clear_scheduled_hook( 'rsssl_le_every_day_hook' ); } functions.php 0000644 00000046225 15154444756 0007315 0 ustar 00 <?php defined( 'ABSPATH' ) or die( "you do not have access to this page!" ); if ( ! function_exists( 'rsssl_user_can_manage' ) ) { function rsssl_user_can_manage() { if ( ! is_user_logged_in() ) { return false; } if ( ! current_user_can( 'manage_options' ) ) { return false; } return true; } } /** * Check if we need to use DNS verification * @return bool */ function rsssl_dns_verification_required(){ /** * If our current hosting provider does not allow or require local SSL certificate generation, * We do not need to DNS verification either. */ if ( !rsssl_do_local_lets_encrypt_generation() ) { return false; } if ( get_option('rsssl_verification_type')==='DNS' ) { return true; } if ( rsssl_wildcard_certificate_required() ) { return true; } return false; } if ( !function_exists('rsssl_is_cpanel')) { /** * Check if we're on CPanel * * @return bool */ function rsssl_is_cpanel() { if (get_option('rsssl_force_cpanel')) { return true; } $open_basedir = ini_get("open_basedir"); if ( empty($open_basedir) && file_exists( "/usr/local/cpanel" ) ) { return true; } else if (rsssl_check_port(2082)) { return true; } else { return false; } } } if (!function_exists('rsssl_cpanel_api_supported')) { /** * Check if CPanel supports the api * * @return bool */ function rsssl_cpanel_api_supported() { return rsssl_is_cpanel() && file_exists( "/usr/local/cpanel/php/cpanel.php" ); } } if (!function_exists('rsssl_activated_by_default')) { /** * Check if the host has ssl, activated by default * * @return bool */ function rsssl_activated_by_default() { $activated_by_default = false; $activated_by_default_hosts = RSSSL_LE()->config->activated_by_default; $current_host = rsssl_get_other_host(); if ( in_array( $current_host, $activated_by_default_hosts ) ) { $activated_by_default = true; } return $activated_by_default; } } if (!function_exists('rsssl_activation_required')) { /** * Check if the host has ssl, activation required * * @return bool */ function rsssl_activation_required() { $dashboard_activation_required = false; $dashboard_activation_required_hosts = RSSSL_LE()->config->dashboard_activation_required; $current_host = rsssl_get_other_host(); if ( in_array( $current_host, $dashboard_activation_required_hosts ) ) { $dashboard_activation_required = true; } return $dashboard_activation_required; } } if (!function_exists('rsssl_paid_only')) { /** * Check if the host has ssl, paid only * * @return bool */ function rsssl_paid_only() { $paid_only = false; $paid_only_hosts = RSSSL_LE()->config->paid_only; $current_host = rsssl_get_other_host(); if ( in_array( $current_host, $paid_only_hosts ) ) { $paid_only = true; } return $paid_only; } } if ( !function_exists('rsssl_is_plesk')) { /** * https://stackoverflow.com/questions/26927248/how-to-detect-servers-control-panel-type-with-php * @return false */ function rsssl_is_plesk() { if (get_option('rsssl_force_plesk')) { return true; } if ( get_option('rsssl_hosting_dashboard')==='plesk' ){ return true; } //cpanel takes precedence, as it's more precise if ( rsssl_is_cpanel() ) { return false; } $open_basedir = ini_get("open_basedir"); if ( empty($open_basedir) && is_dir( '/usr/local/psa' ) ) { return true; } else if (rsssl_check_port(8443)) { return true; } else { return false; } } } if ( !function_exists('rsssl_is_directadmin')) { /** * https://stackoverflow.com/questions/26927248/how-to-detect-servers-control-panel-type-with-php * @return bool */ function rsssl_is_directadmin() { if (get_option('rsssl_force_directadmin')) { return true; } if ( get_option('rsssl_hosting_dashboard')==='directadmin' ){ return true; } //cpanel takes precedence, as it's more precise if ( rsssl_is_cpanel() ) { return false; } if ( rsssl_is_plesk() ) { return false; } if (rsssl_check_port(2222)) { return true; } else { return false; } } } /** * @param int $port * * @return bool */ function rsssl_check_port( $port) { $port_check_status = get_option("rsssl_port_check_$port"); if ( !function_exists('fsockopen') || $port_check_status === 'fail' ) { return false; } $ipAddress = gethostbyname('localhost'); $link = @fsockopen( $ipAddress, $port, $errno, $error, 5 ); if ( $link ) { update_option("rsssl_port_check_$port", 'success'); return true; } update_option("rsssl_port_check_$port", 'fail'); return false; } if ( !function_exists('rsssl_get_other_host') ) { /** * Get the selected hosting provider, if any. * @return bool|string */ function rsssl_get_other_host() { return rsssl_get_value( 'other_host_type', false ); } } if ( !function_exists('rsssl_progress_add')) { /** * @param string $item */ function rsssl_progress_add( $item ) { $progress = get_option( "rsssl_le_installation_progress", array() ); if ( ! in_array( $item, $progress ) ) { $progress[] = $item; update_option( "rsssl_le_installation_progress", $progress ); } } } if ( !function_exists('rsssl_uses_known_dashboard')) { /** * Check if website uses any of the known dashboards. */ function rsssl_uses_known_dashboard( ) { if ( rsssl_is_cpanel() || rsssl_is_plesk() || rsssl_is_directadmin() ) { return true; } else { return false; } } } if ( !function_exists('rsssl_is_ready_for')) { /** * @param string $item */ function rsssl_is_ready_for( $item ) { if ( !rsssl_do_local_lets_encrypt_generation() ) { rsssl_progress_add('directories'); rsssl_progress_add('generation'); rsssl_progress_add('dns-verification'); } if ( !rsssl_dns_verification_required() ) { rsssl_progress_add('dns-verification'); } if (empty(rsssl_get_not_completed_steps($item))){ return true; } else{ return false; } } } function rsssl_get_not_completed_steps($item){ $sequence = array_column( RSSSL_LE()->config->steps['lets-encrypt'], 'id'); //drop all statuses after $item. We only need to know if all previous ones have been completed $index = array_search($item, $sequence); $sequence = array_slice($sequence, 0, $index, true); $not_completed = array(); $finished = get_option("rsssl_le_installation_progress", array()); foreach ($sequence as $status ) { if (!in_array($status, $finished)) { $not_completed[] = $status; } } return $not_completed; } if ( !function_exists('rsssl_progress_remove')) { /** * @param string $item */ function rsssl_progress_remove( $item ) { $progress = get_option( "rsssl_le_installation_progress", array() ); if ( in_array( $item, $progress ) ) { $index = array_search( $item, $progress ); unset( $progress[ $index ] ); update_option( "rsssl_le_installation_progress", $progress ); } } } if ( !function_exists('rsssl_php_requirement_met')) { /** * Get PHP version status for tests * * @return RSSSL_RESPONSE */ function rsssl_php_requirement_met() { if ( version_compare( PHP_VERSION, rsssl_le_php_version, '<' ) ) { rsssl_progress_remove( 'system-status' ); $action = 'stop'; $status = 'error'; $message = sprintf( __( "The minimum requirements for the PHP version have not been met. Please upgrade to %s", "really-simple-ssl" ), rsssl_le_php_version ); } else { $action = 'continue'; $status = 'success'; $message = __( "You have the required PHP version to continue.", "really-simple-ssl" ); } return new RSSSL_RESPONSE( $status, $action, $message ); } } if ( ! function_exists( 'rsssl_get_value' ) ) { /** * Get value for an a rsssl option * For usage very early in the execution order, use the $page option. This bypasses the class usage. * * @param string $fieldname * @param bool $use_default * * @return array|bool|mixed|string */ function rsssl_get_value( $fieldname, $use_default = true ) { $default = false; $fields = get_option( 'rsssl_options_lets-encrypt' ); if ($use_default) { if ( ! isset( RSSSL_LE()->config->fields[ $fieldname ] ) ) { return false; } $default = ( isset( RSSSL_LE()->config->fields[ $fieldname ]['default'] ) ) ? RSSSL_LE()->config->fields[ $fieldname ]['default'] : ''; } $value = isset( $fields[ $fieldname ] ) ? $fields[ $fieldname ] : $default; return $value; } } if ( !function_exists('rsssl_do_local_lets_encrypt_generation')) { /** * Check if the setup requires local certificate generation * @return bool */ function rsssl_do_local_lets_encrypt_generation() { $not_local_cert_hosts = RSSSL_LE()->config->not_local_certificate_hosts; $current_host = rsssl_get_other_host(); if ( in_array( $current_host, $not_local_cert_hosts ) ) { return false; } return true; } } function rsssl_get_manual_instructions_text( $url ){ $default_url = 'https://really-simple-ssl.com/install-ssl-certificate'; $dashboard_activation_required = rsssl_activation_required(); $activated_by_default = rsssl_activated_by_default(); $paid_only = rsssl_paid_only(); $button_activate = '<br><a href="'.$default_url.'" target="_blank" class="button button-primary">'.__("Instructions","really-simple-ssl").'</a> '; $button_complete = '<br><a href="'.$default_url.'" target="_blank" class="button button-primary">'.__("Instructions","really-simple-ssl").'</a> '; if ( $url === $default_url ) { $complete_manually = sprintf(__("Please complete manually in your hosting dashboard.", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>'); $activate_manually = sprintf(__("Please activate it manually on your hosting dashboard.", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>'); } else { $complete_manually = sprintf(__("Please complete %smanually%s", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>'); $activate_manually = sprintf(__("Please activate it on your dashboard %smanually%s", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>'); $button_activate .= '<a href="'.$url.'" target="_blank" class="button button-primary">'.__("Go to activation","really-simple-ssl").'</a>'; $button_complete .= '<a href="'.$url.'" target="_blank" class="button button-primary">'.__("Go to installation","really-simple-ssl").'</a>'; } if ( $activated_by_default ) { $msg = sprintf(__("According to our information, your hosting provider supplies your account with an SSL certificate by default. Please contact your %shosting support%s if this is not the case.","really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>').' '. __("After completing the installation, you can continue to the next step to complete your configuration.","really-simple-ssl"); } else if ( $dashboard_activation_required ) { $msg = __( "You already have free SSL on your hosting environment.", "really-simple-ssl" ).' '. $activate_manually.' '. __("After completing the installation, you can continue to the next step to complete your configuration.","really-simple-ssl") .$button_activate; } else if ( $paid_only ) { $msg = sprintf(__("According to our information, your hosting provider does not allow any kind of SSL installation, other then their own paid certificate. For an alternative hosting provider with SSL, see this %sarticle%s.","really-simple-ssl"), '<a target="_blank" href="https://really-simple-ssl.com/hosting-providers-with-free-ssl">', '</a>'); } else { $msg = __("Your hosting environment does not allow automatic SSL installation.","really-simple-ssl").' '. $complete_manually.' '. sprintf(__("You can follow these %sinstructions%s.","really-simple-ssl"), '<a target="_blank" href="'.$default_url.'">', '</a>').' '. __("After completing the installation, you can continue to the next step to complete your configuration.","really-simple-ssl") .$button_complete; } return $msg; } if ( ! function_exists( 'rsssl_notice' ) ) { /** * Notification without arrow on the left. Should be used outside notifications center * @param string $msg * @param string $type notice | warning | success * @param bool $remove_after_change * @param bool $echo * @param array $condition $condition['question'] $condition['answer'] * * @return string|void */ function rsssl_notice( $msg, $type = 'notice', $remove_after_change = false, $echo = true, $condition = false) { if ( $msg == '' ) { return; } // Condition $condition_check = ""; $condition_question = ""; $condition_answer = ""; $rsssl_hidden = ""; if ($condition) { $condition_check = "condition-check"; $condition_question = "data-condition-question='{$condition['question']}'"; $condition_answer = "data-condition-answer='{$condition['answer']}'"; $args['condition'] = array($condition['question'] => $condition['answer']); $rsssl_hidden = rsssl_field::this()->condition_applies($args) ? "" : "rsssl-hidden";; } // Hide $remove_after_change_class = $remove_after_change ? "rsssl-remove-after-change" : ""; $html = "<div class='rsssl-panel-wrap'><div class='rsssl-panel rsssl-notification rsssl-{$type} {$remove_after_change_class} {$rsssl_hidden} {$condition_check}' {$condition_question} {$condition_answer}><div>{$msg}</div></div></div>"; if ( $echo ) { echo $html; } else { return $html; } } } if ( ! function_exists( 'rsssl_sidebar_notice' ) ) { /** * @param string $msg * @param string $type notice | warning | success * @param bool $echo * @param bool|array $condition $condition['question'] $condition['answer'] * * @return string|void */ function rsssl_sidebar_notice( $msg, $type = 'notice', $echo = true, $condition = false) { if ( $msg == '' ) { return; } // Condition $condition_check = ""; $condition_question = ""; $condition_answer = ""; $rsssl_hidden = ""; if ($condition) { $condition_check = "condition-check"; $condition_question = "data-condition-question='{$condition['question']}'"; $condition_answer = "data-condition-answer='{$condition['answer']}'"; $args['condition'] = array($condition['question'] => $condition['answer']); $rsssl_hidden = rsssl_field::this()->condition_applies($args) ? "" : "rsssl-hidden";; } $html = "<div class='rsssl-help-modal rsssl-notice rsssl-{$type} {$rsssl_hidden} {$condition_check}' {$condition_question} {$condition_answer}>{$msg}</div>"; if ( $echo ) { echo $html; } else { return $html; } } } if (!function_exists('rsssl_read_more')) { /** * Create a generic read more text with link for help texts. * * @param string $url * @param bool $add_space * * @return string */ function rsssl_read_more( $url, $add_space = true ) { $html = sprintf( __( "For more information, please read this %sarticle%s", 'really-simple-ssl' ), '<a target="_blank" href="' . $url . '">', '</a>' ); if ( $add_space ) { $html = ' ' . $html; } return $html; } } register_activation_hook( __FILE__, 'rsssl_set_activation_time_stamp' ); if ( ! function_exists( 'rsssl_set_activation_time_stamp' ) ) { function rsssl_set_activation_time_stamp( $networkwide ) { update_option( 'rsssl_activation_time', time() ); } } if ( ! function_exists( 'rsssl_array_filter_multidimensional' ) ) { function rsssl_array_filter_multidimensional( $array, $filter_key, $filter_value ) { $new = array_filter( $array, function ( $var ) use ( $filter_value, $filter_key ) { return isset( $var[ $filter_key ] ) ? ( $var[ $filter_key ] == $filter_value ) : false; } ); return $new; } } if ( !function_exists('rsssl_is_subdomain') ) { /** * Check if we're on a subdomain. * If this is a www domain, we return false */ function rsssl_is_subdomain(){ $domain = rsssl_get_domain(); if ( strpos($domain, 'www.') !== false ) return false; $root = rsssl_get_root_domain($domain); if ($root === $domain ) { return false; } else { return true; } } } if ( !function_exists('rsssl_get_subdomain') ) { /** * Get root domain of a domain */ function rsssl_get_root_domain($domain){ $sub = strtolower(trim($domain)); $count = substr_count($sub, '.'); if($count === 2){ if(strlen(explode('.', $sub)[1]) > 3) $sub = explode('.', $sub, 2)[1]; } else if($count > 2){ $sub = rsssl_get_root_domain(explode('.', $sub, 2)[1]); } return $sub; } } if ( ! function_exists( 'rsssl_get_domain' ) ) { function rsssl_get_domain() { //Get current domain $domain = site_url(); //Parse to strip off any /subfolder/ $parse = parse_url($domain); $domain = $parse['host']; $domain = str_replace(array('http://', 'https://' ), '', $domain); return $domain; } } function rsssl_insert_after_key($array, $key, $items){ $keys = array_keys($array); $key = array_search($key, $keys); $array = array_slice($array, 0, $key, true) + $items + array_slice($array, 3, count($array)-3, true); return $array; } if ( !function_exists('rsssl_wildcard_certificate_required') ) { /** * Check if the site requires a wildcard * * @return bool */ function rsssl_wildcard_certificate_required() { //if DNS verification, create wildcard. if ( get_option('rsssl_verification_type') === 'DNS' ) { return true; } if ( ! is_multisite() ) { return false; } else { if ( defined( 'SUBDOMAIN_INSTALL' ) && SUBDOMAIN_INSTALL ) { return true; } else { return false; } } } } if ( !function_exists('rsssl_maybe_drop_subdomain_test') ) { function rsssl_maybe_drop_subdomain_test( $steps ) { if ( is_multisite() ) { $index = array_search( 'system-status', array_column( $steps['lets-encrypt'], 'id' ) ); $index ++; $actions = $steps['lets-encrypt'][ $index ]['actions']; //get the is_subdomain_setup $sub_index = array_search( 'is_subdomain_setup', array_column( $actions, 'action' ) ); unset( $actions[ $sub_index ] ); $steps['lets-encrypt'][ $index ]['actions'] = $actions; } return $steps; } add_filter( 'rsssl_steps', 'rsssl_maybe_drop_subdomain_test', 20 ); } if ( !function_exists('rsssl_can_install_shell_addon') ) { function rsssl_can_install_shell_addon(){ //if not cpanel if ( !rsssl_is_cpanel() ) { return false; } //if already installed if (defined('rsssl_shell_path')){ return false; } if ( function_exists('shell_exec') || function_exists('system') || function_exists('passthru') || function_exists('exec') ) { return true; } else { return false; } } } if ( !function_exists('rsssl_generated_by_rsssl')) { /** * If a bundle generation is completed, this value is set to true. * * @return bool */ function rsssl_generated_by_rsssl() { return get_option( 'rsssl_le_certificate_generated_by_rsssl' ); } } composer.json 0000644 00000000141 15154444756 0007301 0 ustar 00 { "require": { "fbett/le_acme2": "^1.5", "plesk/api-php-lib": "^1.0" } } download.php 0000644 00000005215 15154444756 0007106 0 ustar 00 <?php # No need for the template engine define( 'WP_USE_THEMES', false ); #find the base path define( 'BASE_PATH', rsssl_find_wordpress_base_path()."/" ); # Load WordPress Core if ( !file_exists(BASE_PATH . 'wp-load.php') ) { die("WordPress not installed here"); } require_once( BASE_PATH.'wp-load.php' ); require_once( BASE_PATH.'wp-includes/class-phpass.php' ); require_once( BASE_PATH . 'wp-admin/includes/image.php' ); if ( !current_user_can('manage_options') ) { die(); } if ( !isset($_GET["type"]) ) { die(); } if (!isset($_GET['token'])) { die(); } if (!wp_verify_nonce($_GET['token'], 'rsssl_download_cert')){ die(); } $type = sanitize_title($_GET['type']); switch($type) { case 'certificate': $file = get_option('rsssl_certificate_path'); $file_name = 'certificate.cert'; break; case 'private_key': $file = get_option('rsssl_private_key_path'); $file_name = 'private.pem'; break; case 'intermediate': $file = get_option('rsssl_intermediate_path'); $file_name = 'intermediate.pem'; break; default: $file = false; } if (!file_exists($file)) { echo __("File missing. Please retry the previous steps.", "really-simple-ssl"); die(); } else { $content = file_get_contents($file); } $fp = fopen($file, 'rb'); if ($fp) { if (function_exists('mb_strlen')) { $fsize = mb_strlen($content, '8bit'); } else { $fsize = strlen($content); } $path_parts = pathinfo($file); header("Content-type: text/plain"); header("Content-Disposition: attachment; filename=\"".$file_name."\""); header("Content-length: $fsize"); header("Cache-Control: private",false); // required for certain browsers header("Pragma: public"); // required header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Transfer-Encoding: binary"); echo $content; } else { echo "Someting went wrong #2"; } fclose($fp); function rsssl_find_wordpress_base_path() { $path = dirname(__FILE__); do { if (file_exists($path . "/wp-config.php")) { //check if the wp-load.php file exists here. If not, we assume it's in a subdir. if ( file_exists( $path . '/wp-load.php') ) { return $path; } else { //wp not in this directory. Look in each folder to see if it's there. if ( file_exists( $path ) && $handle = opendir( $path ) ) { while ( false !== ( $file = readdir( $handle ) ) ) { if ( $file != "." && $file != ".." ) { $file = $path .'/' . $file; if ( is_dir( $file ) && file_exists( $file . '/wp-load.php') ) { $path = $file; break; } } } closedir( $handle ); } } return $path; } } while ($path = realpath("$path/..")); return false; } vendor/autoload.php 0000644 00000000262 15154444756 0010401 0 ustar 00 <?php // autoload.php @generated by Composer require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4::getLoader(); vendor/plesk/api-php-lib/Dockerfile 0000644 00000000333 15154444756 0013271 0 ustar 00 FROM php:7.3-cli RUN apt-get update \ && apt-get install -y unzip \ && docker-php-ext-install pcntl \ && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer vendor/plesk/api-php-lib/README.md 0000644 00000004252 15154444756 0012562 0 ustar 00 ## PHP library for Plesk XML-RPC API [](https://travis-ci.com/plesk/api-php-lib) [](https://scrutinizer-ci.com/g/plesk/api-php-lib/?branch=master) [](https://styleci.io/repos/26514840) PHP object-oriented library for Plesk XML-RPC API. ## Install Via Composer [Composer](https://getcomposer.org/) is a preferable way to install the library: `composer require plesk/api-php-lib` ## Usage Examples Here is an example on how to use the library and create a customer with desired properties: ```php $client = new \PleskX\Api\Client($host); $client->setCredentials($login, $password); $client->customer()->create([ 'cname' => 'Plesk', 'pname' => 'John Smith', 'login' => 'john', 'passwd' => 'secret', 'email' => 'john@smith.com', ]); ``` It is possible to use a secret key instead of password for authentication. ```php $client = new \PleskX\Api\Client($host); $client->setSecretKey($secretKey) ``` In case of Plesk extension creation one can use an internal mechanism to access XML-RPC API. It does not require to pass authentication because the extension works in the context of Plesk. ```php $client = new \PleskX\Api\InternalClient(); $protocols = $client->server()->getProtos(); ``` For additional examples see tests/ directory. ## How to Run Unit Tests One the possible ways to become familiar with the library is to check the unit tests. To run the unit tests use the following command: `REMOTE_HOST=your-plesk-host.dom REMOTE_PASSWORD=password composer test` To use custom port one can provide a URL (e.g. for Docker container): `REMOTE_URL=https://your-plesk-host.dom:port REMOTE_PASSWORD=password composer test` One more way to run tests is to use Docker: `docker-compose run tests` ## Continuous Testing During active development it could be more convenient to run tests in continuous manner. Here is the way how to achieve it: `REMOTE_URL=https://your-plesk-host.dom:port REMOTE_PASSWORD=password composer test:watch` vendor/plesk/api-php-lib/composer.json 0000644 00000002046 15154444756 0014024 0 ustar 00 { "name": "plesk/api-php-lib", "type": "library", "description": "PHP object-oriented library for Plesk XML-RPC API", "license": "Apache-2.0", "authors": [ { "name": "Alexei Yuzhakov", "email": "sibprogrammer@gmail.com" }, { "name": "Plesk International GmbH.", "email": "plesk-dev-leads@plesk.com" } ], "require": { "php": "^7.3", "ext-curl": "*", "ext-xml": "*", "ext-simplexml": "*" }, "require-dev": { "phpunit/phpunit": "^9", "spatie/phpunit-watcher": "^1.22" }, "config": { "process-timeout": 0 }, "scripts": { "test": "phpunit", "test:watch": "phpunit-watcher watch" }, "autoload": { "psr-4": { "PleskX\\": "src/" } }, "autoload-dev": { "psr-4": { "PleskXTest\\": "tests/" } }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } vendor/plesk/api-php-lib/phpunit-watcher.yml 0000644 00000000067 15154444756 0015150 0 ustar 00 phpunit: arguments: '--stop-on-failure' timeout: 0 vendor/plesk/api-php-lib/.travis.yml 0000644 00000000067 15154444756 0013414 0 ustar 00 services: docker script: - docker-compose run tests vendor/plesk/api-php-lib/docker-compose.yml 0000644 00000000672 15154444756 0014742 0 ustar 00 version: '2' services: plesk: image: plesk/plesk logging: driver: none ports: ["8443:8443"] tests: build: . environment: REMOTE_URL: https://plesk:8443 REMOTE_PASSWORD: changeme1Q** command: bash -c "cd /opt/api-php-lib && composer install && ./wait-for-plesk.sh && composer test -- --testdox" depends_on: - plesk links: - plesk volumes: - .:/opt/api-php-lib vendor/plesk/api-php-lib/phpunit.xml.dist 0000644 00000001426 15154444756 0014456 0 ustar 00 <?xml version="1.0" encoding="UTF-8"?> <!-- Copyright 1999-2020. Plesk International GmbH. --> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" verbose="true" colors="true"> <testsuites> <testsuite name="E2E"> <directory>./tests</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./src</directory> </whitelist> </filter> <php> <ini name="error_reporting" value="-1"/> <env name="REMOTE_URL" value=""/> <env name="REMOTE_PASSWORD" value=""/> </php> </phpunit> vendor/plesk/api-php-lib/.styleci.yml 0000644 00000000150 15154444756 0013551 0 ustar 00 preset: recommended disabled: - align_double_arrow - phpdoc_align - blank_line_after_opening_tag vendor/plesk/api-php-lib/LICENSE 0000644 00000001074 15154444756 0012307 0 ustar 00 Copyright 1999-2020. Plesk International GmbH. Licensed 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. vendor/plesk/api-php-lib/wait-for-plesk.sh 0000644 00000000274 15154444756 0014503 0 ustar 00 #!/bin/bash ### Copyright 1999-2020. Plesk International GmbH. while : ; do curl -ksL https://plesk:8443/ | grep "<title>Plesk" > /dev/null [ $? -eq 0 ] && break sleep 5 done vendor/plesk/api-php-lib/src/Api/InternalClient.php 0000644 00000000753 15154444756 0016231 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api; defined('ABSPATH') or die(); /** * Internal client for Plesk XML-RPC API (via SDK). */ class InternalClient extends Client { public function __construct() { parent::__construct('localhost', 0, 'sdk'); } /** * Setup login to execute requests under certain user. * * @param $login */ public function setLogin($login) { $this->_login = $login; } } vendor/plesk/api-php-lib/src/Api/XmlResponse.php 0000644 00000000632 15154444756 0015571 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api; defined('ABSPATH') or die(); /** * XML wrapper for responses. */ class XmlResponse extends \SimpleXMLElement { /** * Retrieve value by node name. * * @param string $node * * @return string */ public function getValue($node) { return (string) $this->xpath('//'.$node)[0]; } } vendor/plesk/api-php-lib/src/Api/Struct.php 0000644 00000003656 15154444756 0014607 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api; defined('ABSPATH') or die(); abstract class Struct { public function __set($property, $value) { throw new \Exception("Try to set an undeclared property '$property'."); } /** * Initialize list of scalar properties by response. * * @param \SimpleXMLElement $apiResponse * @param array $properties * * @throws \Exception */ protected function _initScalarProperties($apiResponse, array $properties) { foreach ($properties as $property) { if (is_array($property)) { $classPropertyName = current($property); $value = $apiResponse->{key($property)}; } else { $classPropertyName = $this->_underToCamel(str_replace('-', '_', $property)); $value = $apiResponse->$property; } $reflectionProperty = new \ReflectionProperty($this, $classPropertyName); $docBlock = $reflectionProperty->getDocComment(); $propertyType = preg_replace('/^.+ @var ([a-z]+) .+$/', '\1', $docBlock); if ('string' == $propertyType) { $value = (string) $value; } elseif ('int' == $propertyType) { $value = (int) $value; } elseif ('bool' == $propertyType) { $value = in_array((string) $value, ['true', 'on', 'enabled']); } else { throw new \Exception("Unknown property type '$propertyType'."); } $this->$classPropertyName = $value; } } /** * Convert underscore separated words into camel case. * * @param string $under * * @return string */ private function _underToCamel($under) { $under = '_'.str_replace('_', ' ', strtolower($under)); return ltrim(str_replace(' ', '', ucwords($under)), '_'); } } vendor/plesk/api-php-lib/src/Api/Client/Exception.php 0000644 00000000301 15154444756 0016457 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Client; defined('ABSPATH') or die(); /** * Transport layer exception. */ class Exception extends \Exception { } vendor/plesk/api-php-lib/src/Api/Operator.php 0000644 00000005124 15154444756 0015106 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api; defined('ABSPATH') or die(); class Operator { /** @var string|null */ protected $_wrapperTag = null; /** @var \PleskX\Api\Client */ protected $_client; public function __construct($client) { $this->_client = $client; if (is_null($this->_wrapperTag)) { $classNameParts = explode('\\', get_class($this)); $this->_wrapperTag = end($classNameParts); $this->_wrapperTag = strtolower(preg_replace('/([a-z])([A-Z])/', '\1-\2', $this->_wrapperTag)); } } /** * Perform plain API request. * * @param string|array $request * @param int $mode * * @return XmlResponse */ public function request($request, $mode = Client::RESPONSE_SHORT) { $wrapperTag = $this->_wrapperTag; if (is_array($request)) { $request = [$wrapperTag => $request]; } elseif (preg_match('/^[a-z]/', $request)) { $request = "$wrapperTag.$request"; } else { $request = "<$wrapperTag>$request</$wrapperTag>"; } return $this->_client->request($request, $mode); } /** * @param string $field * @param int|string $value * @param string $deleteMethodName * * @return bool */ protected function _delete($field, $value, $deleteMethodName = 'del') { $response = $this->request("$deleteMethodName.filter.$field=$value"); return 'ok' === (string) $response->status; } /** * @param string $structClass * @param string $infoTag * @param string|null $field * @param int|string|null $value * @param callable|null $filter * * @return mixed */ protected function _getItems($structClass, $infoTag, $field = null, $value = null, callable $filter = null) { $packet = $this->_client->getPacket(); $getTag = $packet->addChild($this->_wrapperTag)->addChild('get'); $filterTag = $getTag->addChild('filter'); if (!is_null($field)) { $filterTag->addChild($field, $value); } $getTag->addChild('dataset')->addChild($infoTag); $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); $items = []; foreach ($response->xpath('//result') as $xmlResult) { if (!is_null($filter) && !$filter($xmlResult->data->$infoTag)) { continue; } $items[] = new $structClass($xmlResult->data->$infoTag); } return $items; } } vendor/plesk/api-php-lib/src/Api/Operator/ProtectedDirectory.php 0000644 00000005752 15154444756 0020733 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\ProtectedDirectory as Struct; class ProtectedDirectory extends \PleskX\Api\Operator { protected $_wrapperTag = 'protected-dir'; /** * @param string $name * @param int $siteId * @param string $header * * @return Struct\Info */ public function add($name, $siteId, $header = '') { $packet = $this->_client->getPacket(); $info = $packet->addChild($this->_wrapperTag)->addChild('add'); $info->addChild('site-id', $siteId); $info->addChild('name', $name); $info->addChild('header', $header); return new Struct\Info($this->_client->request($packet)); } /** * @param string $field * @param int|string $value * * @return bool */ public function delete($field, $value) { return $this->_delete($field, $value, 'delete'); } /** * @param string $field * @param int|string $value * * @return Struct\DataInfo|false */ public function get($field, $value) { $items = $this->getAll($field, $value); return reset($items); } /** * @param string $field * @param int|string $value * * @return Struct\DataInfo[] */ public function getAll($field, $value) { $response = $this->_get('get', $field, $value); $items = []; foreach ($response->xpath('//result/data') as $xmlResult) { $items[] = new Struct\DataInfo($xmlResult); } return $items; } /** * @param Struct\Info $protectedDirectory * @param string $login * @param string $password * * @return Struct\UserInfo */ public function addUser($protectedDirectory, $login, $password) { $packet = $this->_client->getPacket(); $info = $packet->addChild($this->_wrapperTag)->addChild('add-user'); $info->addChild('pd-id', $protectedDirectory->id); $info->addChild('login', $login); $info->addChild('password', $password); return new Struct\UserInfo($this->_client->request($packet)); } /** * @param string $field * @param int|string $value * * @return bool */ public function deleteUser($field, $value) { return $this->_delete($field, $value, 'delete-user'); } /** * @param $command * @param $field * @param $value * * @return \PleskX\Api\XmlResponse */ private function _get($command, $field, $value) { $packet = $this->_client->getPacket(); $getTag = $packet->addChild($this->_wrapperTag)->addChild($command); $filterTag = $getTag->addChild('filter'); if (!is_null($field)) { $filterTag->addChild($field, $value); } $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); return $response; } } vendor/plesk/api-php-lib/src/Api/Operator/PhpHandler.php 0000644 00000003010 15154444756 0017123 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Client; use PleskX\Api\Operator; use PleskX\Api\Struct\PhpHandler\Info; class PhpHandler extends Operator { /** * @param string $field * @param int|string $value * * @return Info */ public function get($field, $value) { $packet = $this->_client->getPacket(); $getTag = $packet->addChild($this->_wrapperTag)->addChild('get'); $filterTag = $getTag->addChild('filter'); if (!is_null($field)) { $filterTag->addChild($field, $value); } $response = $this->_client->request($packet, Client::RESPONSE_FULL); $xmlResult = $response->xpath('//result')[0]; return new Info($xmlResult); } /** * @param string|null $field * @param int|string $value * * @return Info[] */ public function getAll($field = null, $value = null) { $packet = $this->_client->getPacket(); $getTag = $packet->addChild($this->_wrapperTag)->addChild('get'); $filterTag = $getTag->addChild('filter'); if (!is_null($field)) { $filterTag->addChild($field, $value); } $response = $this->_client->request($packet, Client::RESPONSE_FULL); $items = []; foreach ($response->xpath('//result') as $xmlResult) { $item = new Info($xmlResult); $items[] = $item; } return $items; } } vendor/plesk/api-php-lib/src/Api/Operator/SiteAlias.php 0000644 00000003677 15154444756 0016777 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\SiteAlias as Struct; class SiteAlias extends \PleskX\Api\Operator { /** * @param array $properties * @param array $preferences * * @return Struct\Info */ public function create(array $properties, array $preferences = []) { $packet = $this->_client->getPacket(); $info = $packet->addChild($this->_wrapperTag)->addChild('create'); if (count($preferences) > 0) { $prefs = $info->addChild('pref'); foreach ($preferences as $key => $value) { $prefs->addChild($key, is_bool($value) ? ($value ? 1 : 0) : $value); } } $info->addChild('site-id', $properties['site-id']); $info->addChild('name', $properties['name']); $response = $this->_client->request($packet); return new Struct\Info($response); } /** * @param string $field * @param int|string $value * * @return Struct\Info */ public function get($field, $value) { $items = $this->getAll($field, $value); return reset($items); } /** * @param string $field * @param int|string $value * * @return Struct\Info[] */ public function getAll($field = null, $value = null) { $packet = $this->_client->getPacket(); $getTag = $packet->addChild($this->_wrapperTag)->addChild('get'); $filterTag = $getTag->addChild('filter'); if (!is_null($field)) { $filterTag->addChild($field, $value); } $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); $items = []; foreach ($response->xpath('//result') as $xmlResult) { $item = new Struct\GeneralInfo($xmlResult->info); $items[] = $item; } return $items; } } vendor/plesk/api-php-lib/src/Api/Operator/Session.php 0000644 00000001421 15154444756 0016525 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\Session as Struct; class Session extends \PleskX\Api\Operator { /** * @return Struct\Info[] */ public function get() { $sessions = []; $response = $this->request('get'); foreach ($response->session as $sessionInfo) { $sessions[(string) $sessionInfo->id] = new Struct\Info($sessionInfo); } return $sessions; } /** * @param string $sessionId * * @return bool */ public function terminate($sessionId) { $response = $this->request("terminate.session-id=$sessionId"); return 'ok' === (string) $response->status; } } vendor/plesk/api-php-lib/src/Api/Operator/EventLog.php 0000644 00000001774 15154444756 0016640 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\EventLog as Struct; class EventLog extends \PleskX\Api\Operator { protected $_wrapperTag = 'event_log'; /** * @return Struct\Event[] */ public function get() { $records = []; $response = $this->request('get'); foreach ($response->event as $eventInfo) { $records[] = new Struct\Event($eventInfo); } return $records; } /** * @return Struct\DetailedEvent[] */ public function getDetailedLog() { $records = []; $response = $this->request('get_events'); foreach ($response->event as $eventInfo) { $records[] = new Struct\DetailedEvent($eventInfo); } return $records; } /** * @return int */ public function getLastId() { return (int) $this->request('get-last-id')->getValue('id'); } } vendor/plesk/api-php-lib/src/Api/Operator/Ip.php 0000644 00000001134 15154444756 0015453 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\Ip as Struct; class Ip extends \PleskX\Api\Operator { /** * @return Struct\Info[] */ public function get() { $ips = []; $packet = $this->_client->getPacket(); $packet->addChild($this->_wrapperTag)->addChild('get'); $response = $this->_client->request($packet); foreach ($response->addresses->ip_info as $ipInfo) { $ips[] = new Struct\Info($ipInfo); } return $ips; } } vendor/plesk/api-php-lib/src/Api/Operator/SecretKey.php 0000644 00000003367 15154444756 0017013 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\SecretKey as Struct; class SecretKey extends \PleskX\Api\Operator { protected $_wrapperTag = 'secret_key'; /** * @param string $ipAddress * * @return string */ public function create($ipAddress) { $packet = $this->_client->getPacket(); $packet->addChild($this->_wrapperTag)->addChild('create')->addChild('ip_address', $ipAddress); $response = $this->_client->request($packet); return (string) $response->key; } /** * @param string $keyId * * @return bool */ public function delete($keyId) { return $this->_delete('key', $keyId, 'delete'); } /** * @param string $keyId * * @return Struct\Info */ public function get($keyId) { $items = $this->_get($keyId); return reset($items); } /** * @return Struct\Info[] */ public function getAll() { return $this->_get(); } /** * @param string|null $keyId * * @return Struct\Info[] */ public function _get($keyId = null) { $packet = $this->_client->getPacket(); $getTag = $packet->addChild($this->_wrapperTag)->addChild('get_info'); $filterTag = $getTag->addChild('filter'); if (!is_null($keyId)) { $filterTag->addChild('key', $keyId); } $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); $items = []; foreach ($response->xpath('//result/key_info') as $keyInfo) { $items[] = new Struct\Info($keyInfo); } return $items; } } vendor/plesk/api-php-lib/src/Api/Operator/Server.php 0000644 00000010122 15154444756 0016346 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\Server as Struct; class Server extends \PleskX\Api\Operator { /** * @return array */ public function getProtos() { $packet = $this->_client->getPacket(); $packet->addChild($this->_wrapperTag)->addChild('get_protos'); $response = $this->_client->request($packet); return (array) $response->protos->proto; } public function getGeneralInfo() { return new Struct\GeneralInfo($this->_getInfo('gen_info')); } public function getPreferences() { return new Struct\Preferences($this->_getInfo('prefs')); } public function getAdmin() { return new Struct\Admin($this->_getInfo('admin')); } /** * @return array */ public function getKeyInfo() { $keyInfo = []; $keyInfoXml = $this->_getInfo('key'); foreach ($keyInfoXml->property as $property) { $keyInfo[(string) $property->name] = (string) $property->value; } return $keyInfo; } /** * @return array */ public function getComponents() { $components = []; $componentsXml = $this->_getInfo('components'); foreach ($componentsXml->component as $component) { $components[(string) $component->name] = (string) $component->version; } return $components; } /** * @return array */ public function getServiceStates() { $states = []; $statesXml = $this->_getInfo('services_state'); foreach ($statesXml->srv as $service) { $states[(string) $service->id] = [ 'id' => (string) $service->id, 'title' => (string) $service->title, 'state' => (string) $service->state, ]; } return $states; } public function getSessionPreferences() { return new Struct\SessionPreferences($this->_getInfo('session_setup')); } /** * @return array */ public function getShells() { $shells = []; $shellsXml = $this->_getInfo('shells'); foreach ($shellsXml->shell as $shell) { $shells[(string) $shell->name] = (string) $shell->path; } return $shells; } /** * @return array */ public function getNetworkInterfaces() { $interfacesXml = $this->_getInfo('interfaces'); return (array) $interfacesXml->interface; } public function getStatistics() { return new Struct\Statistics($this->_getInfo('stat')); } /** * @return array */ public function getSiteIsolationConfig() { $config = []; $configXml = $this->_getInfo('site-isolation-config'); foreach ($configXml->property as $property) { $config[(string) $property->name] = (string) $property->value; } return $config; } public function getUpdatesInfo() { return new Struct\UpdatesInfo($this->_getInfo('updates')); } /** * @param string $login * @param string $clientIp * * @return string */ public function createSession($login, $clientIp) { $packet = $this->_client->getPacket(); $sessionNode = $packet->addChild($this->_wrapperTag)->addChild('create_session'); $sessionNode->addChild('login', $login); $dataNode = $sessionNode->addChild('data'); $dataNode->addChild('user_ip', base64_encode($clientIp)); $dataNode->addChild('source_server'); $response = $this->_client->request($packet); return (string) $response->id; } /** * @param string $operation * * @return \SimpleXMLElement */ private function _getInfo($operation) { $packet = $this->_client->getPacket(); $packet->addChild($this->_wrapperTag)->addChild('get')->addChild($operation); $response = $this->_client->request($packet); return $response->$operation; } } vendor/plesk/api-php-lib/src/Api/Operator/Certificate.php 0000644 00000003031 15154444756 0017323 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\Certificate as Struct; class Certificate extends \PleskX\Api\Operator { /** * @param array $properties * * @return Struct\Info */ public function generate($properties) { $packet = $this->_client->getPacket(); $info = $packet->addChild($this->_wrapperTag)->addChild('generate')->addChild('info'); foreach ($properties as $name => $value) { $info->addChild($name, $value); } $response = $this->_client->request($packet); return new Struct\Info($response); } public function create($properties) { $packet = $this->_client->getPacket(); $info = $packet->addChild($this->_wrapperTag)->addChild('add')->addChild('gen_info'); foreach ($properties as $name => $value) { $info->addChild($name, $value); } $response = $this->_client->request($packet); return new Struct\Info($response); } public function install($domains, $properties) { $packet = $this->_client->getPacket(); foreach ($domains as $domain) { $install = $packet->addChild($this->_wrapperTag)->addChild('install'); $install->addChild('name', $domain); $install->addChild('webspace', $domain); $content = $install->addChild('content'); foreach ($properties as $name => $value) { $content->addChild($name, $value); } } $response = $this->_client->request($packet); return new Struct\Info($response); } } vendor/plesk/api-php-lib/src/Api/Operator/Dns.php 0000644 00000006347 15154444756 0015642 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\Dns as Struct; class Dns extends \PleskX\Api\Operator { /** * @param array $properties * * @return Struct\Info */ public function create($properties) { $packet = $this->_client->getPacket(); $info = $packet->addChild($this->_wrapperTag)->addChild('add_rec'); foreach ($properties as $name => $value) { $info->addChild($name, $value); } return new Struct\Info($this->_client->request($packet)); } /** * Send multiply records by one request. * * @param array $records * * @return \PleskX\Api\XmlResponse[] */ public function bulkCreate(array $records) { $packet = $this->_client->getPacket(); foreach ($records as $properties) { $info = $packet->addChild($this->_wrapperTag)->addChild('add_rec'); foreach ($properties as $name => $value) { $info->addChild($name, $value); } } $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); $items = []; foreach ($response->xpath('//result') as $xmlResult) { $items[] = $xmlResult; } return $items; } /** * @param string $field * @param int|string $value * * @return Struct\Info */ public function get($field, $value) { $items = $this->getAll($field, $value); return reset($items); } /** * @param string $field * @param int|string $value * * @return Struct\Info[] */ public function getAll($field, $value) { $packet = $this->_client->getPacket(); $getTag = $packet->addChild($this->_wrapperTag)->addChild('get_rec'); $filterTag = $getTag->addChild('filter'); if (!is_null($field)) { $filterTag->addChild($field, $value); } $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); $items = []; foreach ($response->xpath('//result') as $xmlResult) { $item = new Struct\Info($xmlResult->data); $item->id = (int) $xmlResult->id; $items[] = $item; } return $items; } /** * @param string $field * @param int|string $value * * @return bool */ public function delete($field, $value) { return $this->_delete($field, $value, 'del_rec'); } /** * Delete multiply records by one request. * * @param array $recordIds * * @return \PleskX\Api\XmlResponse[] */ public function bulkDelete(array $recordIds) { $packet = $this->_client->getPacket(); foreach ($recordIds as $recordId) { $packet->addChild($this->_wrapperTag)->addChild('del_rec') ->addChild('filter')->addChild('id', $recordId); } $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); $items = []; foreach ($response->xpath('//result') as $xmlResult) { $items[] = $xmlResult; } return $items; } } vendor/plesk/api-php-lib/src/Api/Operator/Locale.php 0000644 00000001616 15154444756 0016307 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Operator; defined('ABSPATH') or die(); use PleskX\Api\Struct\Locale as Struct; class Locale extends \PleskX\Api\Operator { /** * @param string|null $id * * @return Struct\Info|Struct\Info[] */ public function get($id = null) { $locales = []; $packet = $this->_client->getPacket(); $filter = $packet->addChild($this->_wrapperTag)->addChild('get')->addChild('filter'); if (!is_null($id)) { $filter->addChild('id', $id); } $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL); foreach ($response->locale->get->result as $localeInfo) { $locales[(string) $localeInfo->info->id] = new Struct\Info($localeInfo->info); } return !is_null($id) ? reset($locales) : $locales; } } vendor/plesk/api-php-lib/src/Api/Exception.php 0000644 00000000301 15154444756 0015241 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api; defined('ABSPATH') or die(); /** * Exceptions for XML-RPC API client. */ class Exception extends \Exception { } vendor/plesk/api-php-lib/src/Api/Struct/PhpHandler/Info.php 0000644 00000001734 15154444756 0017522 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\PhpHandler; defined('ABSPATH') or die(); use PleskX\Api\Struct; class Info extends Struct { /** @var string */ public $id; /** @var string */ public $displayName; /** @var string */ public $fullVersion; /** @var string */ public $version; /** @var string */ public $type; /** @var string */ public $path; /** @var string */ public $clipath; /** @var string */ public $phpini; /** @var string */ public $custom; /** @var string */ public $handlerStatus; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'id', 'display-name', 'full-version', 'version', 'type', 'path', 'clipath', 'phpini', 'custom', 'handler-status', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/Locale/Info.php 0000644 00000000757 15154444756 0016700 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\Locale; defined('ABSPATH') or die(); class Info extends \PleskX\Api\Struct { /** @var string */ public $id; /** @var string */ public $language; /** @var string */ public $country; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'id', ['lang' => 'language'], 'country', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/GeneralInfo.php 0000644 00000000762 15154444756 0020651 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\SiteAlias; defined('ABSPATH') or die(); class GeneralInfo extends \PleskX\Api\Struct { /** @var string */ public $name; /** @var string */ public $asciiName; /** @var string */ public $status; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'name', 'ascii-name', 'status', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/Info.php 0000644 00000000633 15154444756 0017350 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\SiteAlias; defined('ABSPATH') or die(); class Info extends \PleskX\Api\Struct { /** @var string */ public $status; /** @var int */ public $id; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'id', 'status', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/Site/GeneralInfo.php 0000644 00000001167 15154444756 0017677 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\Site; defined('ABSPATH') or die(); class GeneralInfo extends \PleskX\Api\Struct { /** @var string */ public $name; /** @var string */ public $asciiName; /** @var string */ public $guid; /** @var string */ public $status; /** @var string */ public $description; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'name', 'ascii-name', 'status', 'guid', 'description', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/Site/HostingInfo.php 0000644 00000001112 15154444756 0017723 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\Site; defined('ABSPATH') or die(); class HostingInfo extends \PleskX\Api\Struct { /** @var array */ public $properties = []; /** @var string */ public $ipAddress; public function __construct($apiResponse) { foreach ($apiResponse->vrt_hst->property as $property) { $this->properties[(string) $property->name] = (string) $property->value; } $this->_initScalarProperties($apiResponse->vrt_hst, [ 'ip_address', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/Site/Info.php 0000644 00000000622 15154444756 0016374 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\Site; defined('ABSPATH') or die(); class Info extends \PleskX\Api\Struct { /** @var int */ public $id; /** @var string */ public $guid; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'id', 'guid', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/Session/Info.php 0000644 00000001250 15154444756 0017111 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\Session; defined('ABSPATH') or die(); class Info extends \PleskX\Api\Struct { /** @var string */ public $id; /** @var string */ public $type; /** @var string */ public $ipAddress; /** @var string */ public $login; /** @var string */ public $loginTime; /** @var string */ public $idle; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'id', 'type', 'ip-address', 'login', 'login-time', 'idle', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/EventLog/DetailedEvent.php 0000644 00000001352 15154444756 0021036 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\EventLog; defined('ABSPATH') or die(); class DetailedEvent extends \PleskX\Api\Struct { /** @var int */ public $id; /** @var string */ public $type; /** @var int */ public $time; /** @var string */ public $class; /** @var string */ public $objectId; /** @var string */ public $user; /** @var string */ public $host; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'id', 'type', 'time', 'class', ['obj_id' => 'objectId'], 'user', 'host', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/EventLog/Event.php 0000644 00000001025 15154444756 0017377 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\EventLog; defined('ABSPATH') or die(); class Event extends \PleskX\Api\Struct { /** @var string */ public $type; /** @var int */ public $time; /** @var string */ public $class; /** @var string */ public $id; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'type', 'time', 'class', 'id', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/SecretKey/Info.php 0000644 00000001027 15154444756 0017366 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\SecretKey; class Info extends \PleskX\Api\Struct { /** @var string */ public $key; /** @var string */ public $ipAddress; /** @var string */ public $description; /** @var string */ public $login; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'key', 'ip_address', 'description', 'login', ]); } } vendor/plesk/api-php-lib/src/Api/Struct/Certificate/Info.php 0000644 00000000710 15154444756 0017710 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\Certificate; defined('ABSPATH') or die(); class Info extends \PleskX\Api\Struct { /** @var string */ public $request; /** @var string */ public $privateKey; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ ['csr' => 'request'], ['pvt' => 'privateKey'], ]); } } vendor/plesk/api-php-lib/src/Api/Struct/Dns/Info.php 0000644 00000001326 15154444756 0016216 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api\Struct\Dns; defined('ABSPATH') or die(); class Info extends \PleskX\Api\Struct { /** @var int */ public $id; /** @var int */ public $siteId; /** @var int */ public $siteAliasId; /** @var string */ public $type; /** @var string */ public $host; /** @var string */ public $value; /** @var string */ public $opt; public function __construct($apiResponse) { $this->_initScalarProperties($apiResponse, [ 'id', 'site-id', 'site-alias-id', 'type', 'host', 'value', 'opt', ]); } } vendor/plesk/api-php-lib/src/Api/Client.php 0000644 00000032631 15154444756 0014534 0 ustar 00 <?php // Copyright 1999-2020. Plesk International GmbH. namespace PleskX\Api; defined('ABSPATH') or die(); use SimpleXMLElement; /** * Client for Plesk XML-RPC API. */ class Client { const RESPONSE_SHORT = 1; const RESPONSE_FULL = 2; protected $_host; protected $_port; protected $_protocol; protected $_login; protected $_password; protected $_secretKey; protected $_version = ''; protected $_operatorsCache = []; /** * @var callable */ protected $_verifyResponseCallback; /** * Create client. * * @param string $host * @param int $port * @param string $protocol */ public function __construct($host, $port = 8443, $protocol = 'https') { $this->_host = $host; $this->_port = $port; $this->_protocol = $protocol; } /** * Setup credentials for authentication. * * @param string $login * @param string $password */ public function setCredentials($login, $password) { $this->_login = $login; $this->_password = $password; } /** * Define secret key for alternative authentication. * * @param string $secretKey */ public function setSecretKey($secretKey) { $this->_secretKey = $secretKey; } /** * Set default version for requests. * * @param string $version */ public function setVersion($version) { $this->_version = $version; } /** * Set custom function to verify response of API call according your own needs. Default verifying will be used if it is not specified. * * @param callable|null $function */ public function setVerifyResponse(callable $function = null) { $this->_verifyResponseCallback = $function; } /** * Retrieve host used for communication. * * @return string */ public function getHost() { return $this->_host; } /** * Retrieve port used for communication. * * @return int */ public function getPort() { return $this->_port; } /** * Retrieve name of the protocol (http or https) used for communication. * * @return string */ public function getProtocol() { return $this->_protocol; } /** * Retrieve XML template for packet. * * @param string|null $version * * @return SimpleXMLElement */ public function getPacket($version = null) { $protocolVersion = !is_null($version) ? $version : $this->_version; $content = "<?xml version='1.0' encoding='UTF-8' ?>"; $content .= '<packet'.('' === $protocolVersion ? '' : " version='$protocolVersion'").'/>'; return new SimpleXMLElement($content); } /** * Perform API request. * * @param string|array|SimpleXMLElement $request * @param int $mode * * @return XmlResponse */ public function request($request, $mode = self::RESPONSE_SHORT) { if ($request instanceof SimpleXMLElement) { $request = $request->asXml(); } else { $xml = $this->getPacket(); if (is_array($request)) { $request = $this->_arrayToXml($request, $xml)->asXML(); } elseif (preg_match('/^[a-z]/', $request)) { $request = $this->_expandRequestShortSyntax($request, $xml); } } if ('sdk' == $this->_protocol) { $version = ('' == $this->_version) ? null : $this->_version; $requestXml = new SimpleXMLElement((string) $request); $xml = \pm_ApiRpc::getService($version)->call($requestXml->children()[0]->asXml(), $this->_login); } else { $xml = $this->_performHttpRequest($request); } $this->_verifyResponseCallback ? call_user_func($this->_verifyResponseCallback, $xml) : $this->_verifyResponse($xml); return (self::RESPONSE_FULL == $mode) ? $xml : $xml->xpath('//result')[0]; } /** * Perform HTTP request to end-point. * * @param string $request * * @throws Client\Exception * * @return XmlResponse */ private function _performHttpRequest($request) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "$this->_protocol://$this->_host:$this->_port/enterprise/control/agent.php"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_HTTPHEADER, $this->_getHeaders()); curl_setopt($curl, CURLOPT_POSTFIELDS, $request); $result = curl_exec($curl); if (false === $result) { throw new Client\Exception(curl_error($curl), curl_errno($curl)); } curl_close($curl); $xml = new XmlResponse($result); return $xml; } /** * Perform multiple API requests using single HTTP request. * * @param $requests * @param int $mode * * @throws Client\Exception * * @return array */ public function multiRequest($requests, $mode = self::RESPONSE_SHORT) { $requestXml = $this->getPacket(); foreach ($requests as $request) { if ($request instanceof SimpleXMLElement) { throw new Client\Exception('SimpleXML type of request is not supported for multi requests.'); } else { if (is_array($request)) { $request = $this->_arrayToXml($request, $requestXml)->asXML(); } elseif (preg_match('/^[a-z]/', $request)) { $this->_expandRequestShortSyntax($request, $requestXml); } } $responses[] = $this->request($request); } if ('sdk' == $this->_protocol) { throw new Client\Exception('Multi requests are not supported via SDK.'); } else { $responseXml = $this->_performHttpRequest($requestXml->asXML()); } $responses = []; foreach ($responseXml->children() as $childNode) { $xml = $this->getPacket(); $dom = dom_import_simplexml($xml)->ownerDocument; $childDomNode = dom_import_simplexml($childNode); $childDomNode = $dom->importNode($childDomNode, true); $dom->documentElement->appendChild($childDomNode); $response = simplexml_load_string($dom->saveXML()); $responses[] = (self::RESPONSE_FULL == $mode) ? $response : $response->xpath('//result')[0]; } return $responses; } /** * Retrieve list of headers needed for request. * * @return array */ protected function _getHeaders() { $headers = [ 'Content-Type: text/xml', 'HTTP_PRETTY_PRINT: TRUE', ]; if ($this->_secretKey) { $headers[] = "KEY: $this->_secretKey"; } else { $headers[] = "HTTP_AUTH_LOGIN: $this->_login"; $headers[] = "HTTP_AUTH_PASSWD: $this->_password"; } return $headers; } /** * Verify that response does not contain errors. * * @param XmlResponse $xml * * @throws Exception */ protected function _verifyResponse($xml) { if ($xml->system && $xml->system->status && 'error' == (string) $xml->system->status) { throw new Exception((string) $xml->system->errtext, (int) $xml->system->errcode); } if ($xml->xpath('//status[text()="error"]') && $xml->xpath('//errcode') && $xml->xpath('//errtext')) { $errorCode = (int) $xml->xpath('//errcode')[0]; $errorMessage = (string) $xml->xpath('//errtext')[0]; throw new Exception($errorMessage, $errorCode); } } /** * Expand short syntax (some.method.call) into full XML representation. * * @param string $request * @param SimpleXMLElement $xml * * @return string */ protected function _expandRequestShortSyntax($request, SimpleXMLElement $xml) { $parts = explode('.', $request); $node = $xml; foreach ($parts as $part) { @list($name, $value) = explode('=', $part); $node = $node->addChild($name, $value); } return $xml->asXML(); } /** * Convert array to XML representation. * * @param array $array * @param SimpleXMLElement $xml * @param string $parentEl * * @return SimpleXMLElement */ protected function _arrayToXml(array $array, SimpleXMLElement $xml, $parentEl = null) { foreach ($array as $key => $value) { $el = is_int($key) && $parentEl ? $parentEl : $key; if (is_array($value)) { $this->_arrayToXml($value, $this->_isAssocArray($value) ? $xml->addChild($el) : $xml, $el); } else { $xml->addChild($el, $value); } } return $xml; } /** * @param array $array * * @return bool */ protected function _isAssocArray(array $array) { return $array && array_keys($array) !== range(0, count($array) - 1); } /** * @param string $name * * @return \PleskX\Api\Operator */ protected function _getOperator($name) { if (!isset($this->_operatorsCache[$name])) { $className = '\\PleskX\\Api\\Operator\\'.$name; $this->_operatorsCache[$name] = new $className($this); } return $this->_operatorsCache[$name]; } /** * @return Operator\Server */ public function server() { return $this->_getOperator('Server'); } /** * @return Operator\Customer */ public function customer() { return $this->_getOperator('Customer'); } /** * @return Operator\Webspace */ public function webspace() { return $this->_getOperator('Webspace'); } /** * @return Operator\Subdomain */ public function subdomain() { return $this->_getOperator('Subdomain'); } /** * @return Operator\Dns */ public function dns() { return $this->_getOperator('Dns'); } /** * @return Operator\DnsTemplate */ public function dnsTemplate() { return $this->_getOperator('DnsTemplate'); } /** * @return Operator\DatabaseServer */ public function databaseServer() { return $this->_getOperator('DatabaseServer'); } /** * @return Operator\Mail */ public function mail() { return $this->_getOperator('Mail'); } /** * @return Operator\Certificate */ public function certificate() { return $this->_getOperator('Certificate'); } /** * @return Operator\SiteAlias */ public function siteAlias() { return $this->_getOperator('SiteAlias'); } /** * @return Operator\Ip */ public function ip() { return $this->_getOperator('Ip'); } /** * @return Operator\EventLog */ public function eventLog() { return $this->_getOperator('EventLog'); } /** * @return Operator\SecretKey */ public function secretKey() { return $this->_getOperator('SecretKey'); } /** * @return Operator\Ui */ public function ui() { return $this->_getOperator('Ui'); } /** * @return Operator\ServicePlan */ public function servicePlan() { return $this->_getOperator('ServicePlan'); } /** * @return Operator\VirtualDirectory */ public function virtualDirectory() { return $this->_getOperator('VirtualDirectory'); } /** * @return Operator\Database */ public function database() { return $this->_getOperator('Database'); } /** * @return Operator\Session */ public function session() { return $this->_getOperator('Session'); } /** * @return Operator\Locale */ public function locale() { return $this->_getOperator('Locale'); } /** * @return Operator\LogRotation */ public function logRotation() { return $this->_getOperator('LogRotation'); } /** * @return Operator\ProtectedDirectory */ public function protectedDirectory() { return $this->_getOperator('ProtectedDirectory'); } /** * @return Operator\Reseller */ public function reseller() { return $this->_getOperator('Reseller'); } /** * @return Operator\ResellerPlan */ public function resellerPlan() { return $this->_getOperator('ResellerPlan'); } /** * @return Operator\Aps */ public function aps() { return $this->_getOperator('Aps'); } /** * @return Operator\ServicePlanAddon */ public function servicePlanAddon() { return $this->_getOperator('ServicePlanAddon'); } /** * @return Operator\Site */ public function site() { return $this->_getOperator('Site'); } /** * @return Operator\PhpHandler */ public function phpHandler() { return $this->_getOperator('PhpHandler'); } } vendor/fbett/le_acme2/src/LE_ACME2Tests/TestHelper.php 0000644 00000001776 15154444756 0016417 0 ustar 00 <?php namespace LE_ACME2Tests; defined('ABSPATH') or die(); use LE_ACME2\SingletonTrait; class TestHelper { private $_tempPath; private $_nonExistingPath; use SingletonTrait; private function __construct() { $projectPath = realpath($_SERVER[ 'PWD' ]) . '/'; $this->_tempPath = $projectPath . 'temp/'; if( !file_exists($this->_tempPath) ) { mkdir($this->_tempPath); } $this->_nonExistingPath = $this->getTempPath() . 'should-not-exist/'; } public function getTempPath() : string { return $this->_tempPath; } public function getNonExistingPath() : string { return $this->_nonExistingPath; } private $_skipAccountModificationTests = false; public function setSkipAccountModificationTests(bool $value) : void { $this->_skipAccountModificationTests = $value; } public function shouldSkipAccountModificationTests() : bool { return $this->_skipAccountModificationTests; } } vendor/fbett/le_acme2/src/LE_ACME2Tests/Authorizer/HTTPTest.php 0000644 00000002064 15154444756 0020102 0 ustar 00 <?php namespace LE_ACME2Tests\Authorizer; defined('ABSPATH') or die(); use LE_ACME2Tests\AbstractTest; use LE_ACME2Tests\TestHelper; /** * @covers \LE_ACME2\Authorizer\HTTP */ class HTTPTest extends AbstractTest { private $_directoryPath; public function __construct() { parent::__construct(); $this->_directoryPath = TestHelper::getInstance()->getTempPath() . 'acme-challenges/'; } public function testNonExistingDirectoryPath() { $this->assertTrue(\LE_ACME2\Authorizer\HTTP::getDirectoryPath() === null); $this->expectException(\RuntimeException::class); \LE_ACME2\Authorizer\HTTP::setDirectoryPath(TestHelper::getInstance()->getNonExistingPath()); } public function testDirectoryPath() { if(!file_exists($this->_directoryPath)) { mkdir($this->_directoryPath); } \LE_ACME2\Authorizer\HTTP::setDirectoryPath($this->_directoryPath); $this->assertTrue( \LE_ACME2\Authorizer\HTTP::getDirectoryPath() === $this->_directoryPath ); } } vendor/fbett/le_acme2/src/LE_ACME2Tests/AccountTest.php 0000644 00000013102 15154444756 0016556 0 ustar 00 <?php namespace LE_ACME2Tests; defined('ABSPATH') or die(); use LE_ACME2\Exception\InvalidResponse; /** * @covers \LE_ACME2\Account */ class AccountTest extends AbstractTest { private $_commonKeyDirectoryPath; private $_email; public function __construct() { parent::__construct(); $this->_commonKeyDirectoryPath = TestHelper::getInstance()->getTempPath() . 'le-storage/'; $this->_email = 'le_acme2_php_client@test.com'; } public function testNonExistingCommonKeyDirectoryPath() { $this->assertTrue(\LE_ACME2\Account::getCommonKeyDirectoryPath() === null); $notExistingPath = TestHelper::getInstance()->getTempPath() . 'should-not-exist/'; $this->expectException(\RuntimeException::class); \LE_ACME2\Account::setCommonKeyDirectoryPath($notExistingPath); } public function testCommonKeyDirectoryPath() { if(!file_exists($this->_commonKeyDirectoryPath)) { mkdir($this->_commonKeyDirectoryPath); } \LE_ACME2\Account::setCommonKeyDirectoryPath($this->_commonKeyDirectoryPath); $this->assertTrue( \LE_ACME2\Account::getCommonKeyDirectoryPath() === $this->_commonKeyDirectoryPath ); } public function testNonExisting() { if(\LE_ACME2\Account::exists($this->_email)) { $this->markTestSkipped('Skipped: Account does already exist'); } $this->assertTrue(!\LE_ACME2\Account::exists($this->_email)); $this->expectException(\RuntimeException::class); \LE_ACME2\Account::get($this->_email); } public function testCreate() { if(\LE_ACME2\Account::exists($this->_email)) { // Skipping account modification tests, when the account already exists // to reduce the LE api usage while developing TestHelper::getInstance()->setSkipAccountModificationTests(true); $this->markTestSkipped('Account modifications skipped: Account does already exist'); } $this->assertTrue(!\LE_ACME2\Account::exists($this->_email)); $account = \LE_ACME2\Account::create($this->_email); $this->assertTrue(is_object($account)); $this->assertTrue($account->getEmail() === $this->_email); $account = \LE_ACME2\Account::get($this->_email); $this->assertTrue(is_object($account)); $result = $account->getData(); $this->assertTrue($result->getStatus() === \LE_ACME2\Response\Account\AbstractAccount::STATUS_VALID); } public function testInvalidCreate() { if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) { $this->expectNotToPerformAssertions(); return; } $this->expectException(InvalidResponse::class); $this->expectExceptionMessage( 'Invalid response received: ' . 'urn:ietf:params:acme:error:invalidEmail' . ' - ' . 'Error creating new account :: invalid contact domain. Contact emails @example.org are forbidden' ); \LE_ACME2\Account::create('test@example.org'); } public function testModification() { if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) { $this->expectNotToPerformAssertions(); return; } $account = \LE_ACME2\Account::get($this->_email); $this->assertTrue(is_object($account)); $keyDirectoryPath = $account->getKeyDirectoryPath(); $newEmail = 'new-' . $this->_email; // An email from example.org is not allowed $result = $account->update('test@example.org'); $this->assertTrue($result === false); $result = $account->update($newEmail); $this->assertTrue($result === true); $this->assertTrue($account->getKeyDirectoryPath() !== $keyDirectoryPath); $this->assertTrue(file_exists($account->getKeyDirectoryPath())); $result = $account->update($this->_email); $this->assertTrue($result === true); $result = $account->changeKeys(); $this->assertTrue($result === true); } public function testDeactivation() { if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) { $this->expectNotToPerformAssertions(); return; } $account = \LE_ACME2\Account::get($this->_email); $this->assertTrue(is_object($account)); $result = $account->deactivate(); $this->assertTrue($result === true); // The account is already deactivated $result = $account->deactivate(); $this->assertTrue($result === false); // The account is already deactivated $result = $account->changeKeys(); $this->assertTrue($result === false); // The account is already deactivated $this->expectException(\LE_ACME2\Exception\InvalidResponse::class); $account->getData(); } public function testCreationAfterDeactivation() { if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) { $this->expectNotToPerformAssertions(); return; } $account = \LE_ACME2\Account::get($this->_email); $this->assertTrue(is_object($account)); system('rm -R ' . $account->getKeyDirectoryPath()); $this->assertTrue(!\LE_ACME2\Account::exists($this->_email)); $account = \LE_ACME2\Account::create($this->_email); $this->assertTrue(is_object($account)); } public function test() { $account = \LE_ACME2\Account::get($this->_email); $this->assertTrue(is_object($account)); } } vendor/fbett/le_acme2/src/LE_ACME2Tests/AbstractTest.php 0000644 00000000464 15154444756 0016734 0 ustar 00 <?php namespace LE_ACME2Tests; defined('ABSPATH') or die(); use PHPUnit\Framework\TestCase; use LE_ACME2; abstract class AbstractTest extends TestCase { public function __construct() { parent::__construct(); LE_ACME2\Connector\Connector::getInstance()->useStagingServer(true); } } vendor/fbett/le_acme2/src/LE_ACME2/Order.php 0000644 00000033573 15154444756 0014370 0 ustar 00 <?php namespace LE_ACME2; defined('ABSPATH') or die(); use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\Cache; use LE_ACME2\Authorizer; use LE_ACME2\Exception; use LE_ACME2\Utilities; class Order extends AbstractKeyValuable { const CHALLENGE_TYPE_HTTP = 'http-01'; const CHALLENGE_TYPE_DNS = 'dns-01'; /** * @deprecated * @param $directoryPath */ public static function setHTTPAuthorizationDirectoryPath(string $directoryPath) { Authorizer\HTTP::setDirectoryPath($directoryPath); } CONST IDENTRUST_ISSUER_CN = 'DST Root CA X3'; /** @var string|null $_preferredChain */ private static $_preferredChain = null; public static function setPreferredChain(string $issuerCN = null) { self::$_preferredChain = $issuerCN; } protected $_account; protected $_subjects; public function __construct(Account $account, array $subjects) { array_map(function($subject) { if(preg_match_all('~(\*\.)~', $subject) > 1) throw new \RuntimeException('Cannot create orders with multiple wildcards in one domain.'); }, $subjects); $this->_account = $account; $this->_subjects = $subjects; $this->_identifier = $this->_getAccountIdentifier($account) . DIRECTORY_SEPARATOR . 'order_' . md5(implode('|', $subjects)); Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_INFO, get_class() . '::' . __FUNCTION__ . ' "' . implode(':', $this->getSubjects()) . '"' ); Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' path: ' . $this->getKeyDirectoryPath() ); } public function getAccount() : Account { return $this->_account; } public function getSubjects() : array { return $this->_subjects; } /** * @param Account $account * @param array $subjects * @param string $keyType * @return Order * @throws Exception\AbstractException */ public static function create(Account $account, array $subjects, string $keyType = self::KEY_TYPE_RSA) : Order { $order = new self($account, $subjects); return $order->_create($keyType, false); } /** * @param $keyType * @param bool $ignoreIfKeysExist * @return Order * @throws Exception\AbstractException */ protected function _create(string $keyType, bool $ignoreIfKeysExist = false) : Order { $this->_initKeyDirectory($keyType, $ignoreIfKeysExist); $request = new Request\Order\Create($this); try { $response = $request->getResponse(); Cache\OrderResponse::getInstance()->set($this, $response); return $this; } catch(Exception\AbstractException $e) { $this->_clearKeyDirectory(); throw $e; } } public static function exists(Account $account, array $subjects) : bool { $order = new self($account, $subjects); return Cache\OrderResponse::getInstance()->exists($order); } public static function get(Account $account, array $subjects) : Order { $order = new self($account, $subjects); if(!self::exists($account, $subjects)) throw new \RuntimeException('Order does not exist'); return $order; } /** @var Authorizer\AbstractAuthorizer|Authorizer\HTTP|null $_authorizer */ protected $_authorizer = null; /** * @param $type * @return Authorizer\AbstractAuthorizer|Authorizer\HTTP|null * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\ExpiredAuthorization */ protected function _getAuthorizer(string $type) : Authorizer\AbstractAuthorizer { if($this->_authorizer === null) { if($type == self::CHALLENGE_TYPE_HTTP) { $this->_authorizer = new Authorizer\HTTP($this->_account, $this); } else if($type == self::CHALLENGE_TYPE_DNS) { $this->_authorizer = new Authorizer\DNS($this->_account, $this); } else { throw new \RuntimeException('Challenge type not implemented'); } } return $this->_authorizer; } /** * The Authorization has expired, so we clean the complete order to restart again on the next call */ protected function _clearAfterExpiredAuthorization() { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_INFO, get_class() . '::' . __FUNCTION__ . ' "Will clear after expired authorization' ); $this->clear(); } public function clear() { Cache\OrderResponse::getInstance()->set($this, null); $this->_clearKeyDirectory(); } /** * @return bool * @param $type * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function shouldStartAuthorization(string $type) : bool { try { return $this->_getAuthorizer($type)->shouldStartAuthorization(); } catch(Exception\ExpiredAuthorization $e) { $this->_clearAfterExpiredAuthorization(); return false; } } /** * @param $type * @return bool * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\AuthorizationInvalid */ public function authorize(string $type) : bool { try { $authorizer = $this->_getAuthorizer($type); $authorizer->progress(); return $authorizer->hasFinished(); } catch(Exception\ExpiredAuthorization $e) { $this->_clearAfterExpiredAuthorization(); return false; } } /** * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function finalize() { if(!is_object($this->_authorizer) || !$this->_authorizer->hasFinished()) { throw new \RuntimeException('Not all challenges are valid. Please check result of authorize() first!'); } Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_INFO, get_class() . '::' . __FUNCTION__ . ' "Will finalize' ); $orderResponse = Cache\OrderResponse::getInstance()->get($this); if( $orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_PENDING /* DEPRECATED AFTER JULI 5TH 2018 */ || $orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_READY // ACME draft-12 Section 7.1.6 ) { $request = new Request\Order\Finalize($this, $orderResponse); $orderResponse = $request->getResponse(); Cache\OrderResponse::getInstance()->set($this, $orderResponse); } if($orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_VALID) { $request = new Request\Order\GetCertificate($this, $orderResponse); $response = $request->getResponse(); $certificate = $response->getCertificate(); $intermediate = $response->getIntermediate(); //$certificateInfo = openssl_x509_parse($certificate); //$certificateValidToTimeTimestamp = $certificateInfo['validTo_time_t']; $intermediateInfo = openssl_x509_parse($intermediate); if(self::$_preferredChain !== null) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_INFO, 'Preferred chain is set: ' . self::$_preferredChain ); } $found = false; if(self::$_preferredChain !== null && $intermediateInfo['issuer']['CN'] != self::$_preferredChain) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_INFO, 'Default certificate does not satisfy preferred chain, trying to fetch alternative' ); foreach($response->getAlternativeLinks() as $link) { $request = new Request\Order\GetCertificate($this, $orderResponse, $link); $response = $request->getResponse(); $alternativeCertificate = $response->getCertificate(); $alternativeIntermediate = $response->getIntermediate(); $intermediateInfo = openssl_x509_parse($intermediate); if($intermediateInfo['issuer']['CN'] != self::$_preferredChain) { continue; } $found = true; $certificate = $alternativeCertificate; $intermediate = $alternativeIntermediate; break; } if(!$found) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_INFO, 'Preferred chain could not be satisfied, returning default chain' ); } } $this->_saveCertificate($certificate, $intermediate); } } private function _saveCertificate(string $certificate, string $intermediate) : void { $certificateInfo = openssl_x509_parse($certificate); $certificateValidToTimeTimestamp = $certificateInfo['validTo_time_t']; $path = $this->getKeyDirectoryPath() . self::BUNDLE_DIRECTORY_PREFIX . $certificateValidToTimeTimestamp . DIRECTORY_SEPARATOR; mkdir($path); rename($this->getKeyDirectoryPath() . 'private.pem', $path . 'private.pem'); file_put_contents($path . 'certificate.crt', $certificate); file_put_contents($path . 'intermediate.pem', $intermediate); Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Certificate received'); } const BUNDLE_DIRECTORY_PREFIX = 'bundle_'; protected function _getLatestCertificateDirectory() : ?string { $files = scandir($this->getKeyDirectoryPath(), SORT_NUMERIC | SORT_DESC); foreach($files as $file) { if( substr($file, 0, strlen(self::BUNDLE_DIRECTORY_PREFIX)) == self::BUNDLE_DIRECTORY_PREFIX && is_dir($this->getKeyDirectoryPath() . $file) ) { return $file; } } return null; } public function isCertificateBundleAvailable() : bool { return $this->_getLatestCertificateDirectory() !== NULL; } public function getCertificateBundle() : Struct\CertificateBundle { if(!$this->isCertificateBundleAvailable()) { throw new \RuntimeException('There is no certificate available'); } $certificatePath = $this->getKeyDirectoryPath() . $this->_getLatestCertificateDirectory(); return new Struct\CertificateBundle( $certificatePath . DIRECTORY_SEPARATOR, 'private.pem', 'certificate.crt', 'intermediate.pem', self::_getExpireTimeFromCertificateDirectoryPath($certificatePath) ); } /** * @param string $keyType * @param int|null $renewBefore Unix timestamp * @throws Exception\AbstractException */ public function enableAutoRenewal($keyType = self::KEY_TYPE_RSA, int $renewBefore = null) { if($keyType === null) { $keyType = self::KEY_TYPE_RSA; } if(!$this->isCertificateBundleAvailable()) { throw new \RuntimeException('There is no certificate available'); } $orderResponse = Cache\OrderResponse::getInstance()->get($this); if( $orderResponse === null || $orderResponse->getStatus() != Response\Order\AbstractOrder::STATUS_VALID ) { return; } Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_DEBUG,'Auto renewal triggered'); $directory = $this->_getLatestCertificateDirectory(); $expireTime = self::_getExpireTimeFromCertificateDirectoryPath($directory); if($renewBefore === null) { $renewBefore = strtotime('-30 days', $expireTime); } if($renewBefore < time()) { Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO,'Auto renewal: Will recreate order'); $this->_create($keyType, true); } } /** * @param int $reason The reason to revoke the LetsEncrypt Order instance certificate. * Possible reasons can be found in section 5.3.1 of RFC5280. * @return bool * @throws Exception\RateLimitReached */ public function revokeCertificate(int $reason = 0) : bool { if(!$this->isCertificateBundleAvailable()) { throw new \RuntimeException('There is no certificate available to revoke'); } $bundle = $this->getCertificateBundle(); $request = new Request\Order\RevokeCertificate($bundle, $reason); try { /* $response = */ $request->getResponse(); rename( $this->getKeyDirectoryPath(), $this->_getKeyDirectoryPath('-revoked-' . microtime(true)) ); return true; } catch(Exception\InvalidResponse $e) { return false; } } protected static function _getExpireTimeFromCertificateDirectoryPath(string $path) { $stringPosition = strrpos($path, self::BUNDLE_DIRECTORY_PREFIX); if($stringPosition === false) { throw new \RuntimeException('ExpireTime not found in' . $path); } $expireTime = substr($path, $stringPosition + strlen(self::BUNDLE_DIRECTORY_PREFIX)); if( !is_numeric($expireTime) || $expireTime < strtotime('-10 years') || $expireTime > strtotime('+10 years') ) { throw new \RuntimeException('Unexpected expireTime: ' . $expireTime); } return $expireTime; } } vendor/fbett/le_acme2/src/LE_ACME2/Connector/Connector.php 0000644 00000006776 15154444756 0017206 0 ustar 00 <?php namespace LE_ACME2\Connector; defined('ABSPATH') or die(); use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\SingletonTrait; use LE_ACME2\Cache; use LE_ACME2\Utilities; use LE_ACME2\Exception; class Connector { use SingletonTrait; const METHOD_GET = 'GET'; const METHOD_HEAD = 'HEAD'; const METHOD_POST = 'POST'; private function __construct() {} protected $_baseURL = 'https://acme-v02.api.letsencrypt.org'; protected $_stagingBaseURL = 'https://acme-staging-v02.api.letsencrypt.org'; protected $_useStagingServer = true; public function useStagingServer(bool $useStagingServer) { $this->_useStagingServer = $useStagingServer; } public function isUsingStagingServer() : bool { return $this->_useStagingServer; } public function getBaseURL() : string { return $this->_useStagingServer ? $this->_stagingBaseURL : $this->_baseURL; } /** * Makes a Curl request. * * @param string $method The HTTP method to use. Accepting GET, POST and HEAD requests. * @param string $url The URL to make the request to. * @param string $data The body to attach to a POST request. Expected as a JSON encoded string. * * @return RawResponse * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function request(string $method, string $url, string $data = null) : RawResponse { Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'will request from ' . $url, $data); $handle = curl_init(); $headers = array( 'Accept: application/json', 'Content-Type: ' . ($method == self::METHOD_POST ? 'application/jose+json' : 'application/json') // ACME draft-10, section 6.2 ); curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_HTTPHEADER, $headers); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($handle, CURLOPT_HEADER, true); switch ($method) { case self::METHOD_GET: break; case self::METHOD_POST: curl_setopt($handle, CURLOPT_POST, true); curl_setopt($handle, CURLOPT_POSTFIELDS, $data); break; case self::METHOD_HEAD: curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'HEAD'); curl_setopt($handle, CURLOPT_NOBODY, true); break; default: throw new \RuntimeException('HTTP request ' . $method . ' not supported.'); break; } $response = curl_exec($handle); if(curl_errno($handle)) { throw new \RuntimeException('Curl: ' . curl_error($handle)); } $header_size = curl_getinfo($handle, CURLINFO_HEADER_SIZE); $rawResponse = new RawResponse(); $rawResponse->init($method, $url, $response, $header_size); Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, self::class . ': response received', $rawResponse); try { $getNewNonceResponse = new Response\GetNewNonce($rawResponse); Cache\NewNonceResponse::getInstance()->set($getNewNonceResponse); } catch(Exception\InvalidResponse $e) { if($method == self::METHOD_POST) { $request = new Request\GetNewNonce(); Cache\NewNonceResponse::getInstance()->set($request->getResponse()); } } return $rawResponse; } } vendor/fbett/le_acme2/src/LE_ACME2/Connector/RawResponse.php 0000644 00000002323 15154444756 0017504 0 ustar 00 <?php namespace LE_ACME2\Connector; defined('ABSPATH') or die(); class RawResponse { /** @var string */ public $request; /** @var array */ public $header; /** @var array|string */ public $body; public function init(string $method, string $url, string $response, int $headerSize) { $header = substr($response, 0, $headerSize); $body = substr($response, $headerSize); $body_json = json_decode($body, true); $this->request = $method . ' ' . $url; $this->header = array_map(function($line) { return trim($line); }, explode("\n", $header)); $this->body = $body_json === null ? $body : $body_json; } public function toString() : string { return serialize([ 'request' => $this->request, 'header' => $this->header, 'body' => $this->body, ]); } public static function getFromString(string $string) : self { $array = unserialize($string); $rawResponse = new self(); $rawResponse->request = $array['request']; $rawResponse->header = $array['header']; $rawResponse->body = $array['body']; return $rawResponse; } } vendor/fbett/le_acme2/src/LE_ACME2/Account.php 0000644 00000010365 15154444756 0014703 0 ustar 00 <?php namespace LE_ACME2; defined('ABSPATH') or die(); use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\Utilities; use LE_ACME2\Exception; class Account extends AbstractKeyValuable { private $_email = NULL; public function __construct(string $email) { $this->_setEmail($email); Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_INFO, get_class() . '::' . __FUNCTION__ . ' email: "' . $email . '"' ); Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' path: ' . $this->getKeyDirectoryPath() ); } private function _setEmail(string $email) { $this->_email = $email; $this->_identifier = $this->_getAccountIdentifier($this); } public function getEmail() : string { return $this->_email; } /** * @param string $email * @return Account|null * @throws Exception\AbstractException */ public static function create(string $email) : Account { $account = new self($email); $account->_initKeyDirectory(); $request = new Request\Account\Create($account); try { $response = $request->getResponse(); Cache\AccountResponse::getInstance()->set($account, $response); return $account; } catch(Exception\AbstractException $e) { $account->_clearKeyDirectory(); throw $e; } } public static function exists(string $email) : bool { $account = new self($email); return file_exists($account->getKeyDirectoryPath()) && file_exists($account->getKeyDirectoryPath() . 'private.pem') && file_exists($account->getKeyDirectoryPath() . 'public.pem'); } public static function get(string $email) : Account { $account = new self($email); if(!self::exists($email)) throw new \RuntimeException('Keys not found - does this account exist?'); return $account; } /** * @return Response\AbstractResponse|Response\Account\GetData * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getData() : Response\Account\GetData { $request = new Request\Account\GetData($this); return $request->getResponse(); } /** * @param string $email * @return bool * @throws Exception\RateLimitReached */ public function update(string $email) : bool { $request = new Request\Account\Update($this, $email); try { /* $response = */ $request->getResponse(); $previousKeyDirectoryPath = $this->getKeyDirectoryPath(); $this->_setEmail($email); if($previousKeyDirectoryPath != $this->getKeyDirectoryPath()) rename($previousKeyDirectoryPath, $this->getKeyDirectoryPath()); return true; } catch(Exception\InvalidResponse $e) { return false; } } /** * @return bool * @throws Exception\RateLimitReached */ public function changeKeys() : bool { Utilities\KeyGenerator::RSA($this->getKeyDirectoryPath(), 'private-replacement.pem', 'public-replacement.pem'); $request = new Request\Account\ChangeKeys($this); try { /* $response = */ $request->getResponse(); unlink($this->getKeyDirectoryPath() . 'private.pem'); unlink($this->getKeyDirectoryPath() . 'public.pem'); rename($this->getKeyDirectoryPath() . 'private-replacement.pem', $this->getKeyDirectoryPath() . 'private.pem'); rename($this->getKeyDirectoryPath() . 'public-replacement.pem', $this->getKeyDirectoryPath() . 'public.pem'); return true; } catch(Exception\InvalidResponse $e) { return false; } } /** * @return bool * @throws Exception\RateLimitReached */ public function deactivate() : bool { $request = new Request\Account\Deactivate($this); try { /* $response = */ $request->getResponse(); return true; } catch(Exception\InvalidResponse $e) { return false; } } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/AbstractOrder.php 0000644 00000003357 15154444756 0020722 0 ustar 00 <?php namespace LE_ACME2\Response\Order; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; use LE_ACME2\Exception; abstract class AbstractOrder extends AbstractResponse { const STATUS_PENDING = 'pending'; const STATUS_VALID = 'valid'; const STATUS_READY = 'ready'; const STATUS_INVALID = 'invalid'; public function getLocation() : string { $matches = $this->_preg_match_headerLine($this->_pattern_header_location); return trim($matches[1]); } public function getStatus() : string { return $this->_raw->body['status']; } public function getExpires() : string { return $this->_raw->body['expires']; } public function getIdentifiers() : array { return $this->_raw->body['identifiers']; } public function getAuthorizations() : array { return $this->_raw->body['authorizations']; } public function getFinalize() : string { return $this->_raw->body['finalize']; } public function getCertificate() : string { return $this->_raw->body['certificate']; } /** * @return bool * @throws Exception\StatusInvalid */ protected function _isValid(): bool { if(!parent::_isValid()) { return false; } if( $this->getStatus() == AbstractOrder::STATUS_INVALID ) { throw new Exception\StatusInvalid('Order has status "' . AbstractOrder::STATUS_INVALID . '"'. '. Probably all authorizations have failed. ' . PHP_EOL . 'Please see: ' . $this->getLocation() . PHP_EOL . 'Continue by using $order->clear() after getting rid of the problem' ); } return true; } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/GetCertificate.php 0000644 00000002517 15154444756 0021042 0 ustar 00 <?php namespace LE_ACME2\Response\Order; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; class GetCertificate extends AbstractResponse { protected $_pattern = '~(-----BEGIN\sCERTIFICATE-----[\s\S]+?-----END\sCERTIFICATE-----)~i'; public function getCertificate() : string { if(preg_match_all($this->_pattern, $this->_raw->body, $matches)) { return $matches[0][0]; } throw new \RuntimeException('Preg_match_all has returned false - invalid pattern?'); } public function getIntermediate() : string { if(preg_match_all($this->_pattern, $this->_raw->body, $matches)) { $result = ''; for($i=1; $i<count($matches[0]); $i++) { $result .= "\n" . $matches[0][$i]; } return $result; } throw new \RuntimeException('Preg_match_all has returned false - invalid pattern?'); } /** * @return string[] */ public function getAlternativeLinks() : array { $result = []; foreach($this->_raw->header as $line) { $matches = []; preg_match_all('/^link: <(.*)>;rel="alternate"$/', $line, $matches); if(isset($matches[1][0])) { $result[] = $matches[1][0]; } } return $result; } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Finalize.php 0000644 00000000157 15154444756 0017717 0 ustar 00 <?php namespace LE_ACME2\Response\Order; defined('ABSPATH') or die(); class Finalize extends AbstractOrder {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Get.php 0000644 00000001307 15154444756 0016673 0 ustar 00 <?php namespace LE_ACME2\Response\Order; defined('ABSPATH') or die(); use LE_ACME2\Connector\RawResponse; use LE_ACME2\Exception; class Get extends AbstractOrder { /** * Get constructor. * * @param RawResponse $raw * @param $orderURL * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function __construct(RawResponse $raw, string $orderURL) { // Dirty fix: Header of response "Get" does not contain an order url, instead of response "Create" // Is needed on production server, not on staging server - tested: 12.04.2021 $raw->header[] = 'Location: ' . $orderURL; parent::__construct($raw); } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/RevokeCertificate.php 0000644 00000000244 15154444756 0021551 0 ustar 00 <?php namespace LE_ACME2\Response\Order; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; class RevokeCertificate extends AbstractResponse {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Create.php 0000644 00000000155 15154444756 0017357 0 ustar 00 <?php namespace LE_ACME2\Response\Order; defined('ABSPATH') or die(); class Create extends AbstractOrder {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Start.php 0000644 00000000174 15154444756 0021037 0 ustar 00 <?php namespace LE_ACME2\Response\Authorization; defined('ABSPATH') or die(); class Start extends AbstractAuthorization {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/AbstractAuthorization.php 0000644 00000001532 15154444756 0024265 0 ustar 00 <?php namespace LE_ACME2\Response\Authorization; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; use LE_ACME2\Connector\RawResponse; use LE_ACME2\Exception; class AbstractAuthorization extends AbstractResponse { /** * AbstractAuthorization constructor. * @param RawResponse $raw * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\ExpiredAuthorization */ public function __construct(RawResponse $raw) { parent::__construct($raw); } /** * @return bool * @throws Exception\ExpiredAuthorization */ protected function _isValid() : bool { if($this->_preg_match_headerLine('/^HTTP\/.* 404/i') !== null) { throw new Exception\ExpiredAuthorization(); } return parent::_isValid(); } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Get.php 0000644 00000002116 15154444756 0020457 0 ustar 00 <?php namespace LE_ACME2\Response\Authorization; defined('ABSPATH') or die(); use LE_ACME2\Response\Authorization\Struct; class Get extends AbstractAuthorization { public function getIdentifier() : Struct\Identifier { return new Struct\Identifier($this->_raw->body['identifier']['type'], $this->_raw->body['identifier']['value']); } public function getStatus() : string { return $this->_raw->body['status']; } public function getExpires() : string { return $this->_raw->body['expires']; } public function getChallenges() : array { return $this->_raw->body['challenges']; } /** * @param $type * @return Struct\Challenge */ public function getChallenge(string $type) : Struct\Challenge { foreach($this->getChallenges() as $challenge) { if($type == $challenge['type']) return new Struct\Challenge($challenge['type'], $challenge['status'], $challenge['url'], $challenge['token']); } throw new \RuntimeException('No challenge found with given type'); } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Challenge.php 0000644 00000001055 15154444756 0023107 0 ustar 00 <?php namespace LE_ACME2\Response\Authorization\Struct; defined('ABSPATH') or die(); class Challenge { const STATUS_PROGRESSING = 'processing'; const STATUS_PENDING = 'pending'; const STATUS_VALID = 'valid'; const STATUS_INVALID = 'invalid'; public $type; public $status; public $url; public $token; public function __construct(string $type, string $status, string $url, string $token) { $this->type = $type; $this->status = $status; $this->url = $url; $this->token = $token; } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Identifier.php 0000644 00000000424 15154444756 0023306 0 ustar 00 <?php namespace LE_ACME2\Response\Authorization\Struct; defined('ABSPATH') or die(); class Identifier { public $type; public $value; public function __construct(string $type, string $value) { $this->type = $type; $this->value = $value; } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Deactivate.php 0000644 00000000166 15154444756 0020550 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); class Deactivate extends AbstractLocation {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractAccount.php 0000644 00000000574 15154444756 0021562 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; abstract class AbstractAccount extends AbstractResponse { const STATUS_VALID = 'valid'; public function getLocation() : string { $matches = $this->_preg_match_headerLine($this->_pattern_header_location); return trim($matches[1]); } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/ChangeKeys.php 0000644 00000000237 15154444756 0020517 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; class ChangeKeys extends AbstractResponse {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractLocation.php 0000644 00000001361 15154444756 0021731 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; abstract class AbstractLocation extends AbstractResponse { public function getKey() : string { return $this->_raw->body['key']; } public function getContact() : string { return $this->_raw->body['contact']; } public function getAgreement() : string { return $this->_raw->body['agreement']; } public function getInitialIP() : string { return $this->_raw->body['initialIp']; } public function getCreatedAt() : string { return $this->_raw->body['createdAt']; } public function getStatus() : string { return $this->_raw->body['status']; } } vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Update.php 0000644 00000000162 15154444756 0017715 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); class Update extends AbstractLocation {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/GetData.php 0000644 00000000163 15154444756 0020005 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); class GetData extends AbstractLocation {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Create.php 0000644 00000000161 15154444756 0017675 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); class Create extends AbstractAccount {} vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Get.php 0000644 00000000156 15154444756 0017215 0 ustar 00 <?php namespace LE_ACME2\Response\Account; defined('ABSPATH') or die(); class Get extends AbstractAccount {} vendor/fbett/le_acme2/src/LE_ACME2/Response/GetDirectory.php 0000644 00000001674 15154444756 0017514 0 ustar 00 <?php namespace LE_ACME2\Response; defined('ABSPATH') or die(); class GetDirectory extends AbstractResponse { public function getKeyChange() : string { return $this->_raw->body['keyChange']; } public function getNewAccount() : string { return $this->_raw->body['newAccount']; } public function getNewNonce() : string { return $this->_raw->body['newNonce']; } public function getNewOrder() : string { return $this->_raw->body['newOrder']; } public function getRevokeCert() : string { return $this->_raw->body['revokeCert']; } public function getTermsOfService() : string { return $this->_raw->body['meta']['termsOfService']; } public function getWebsite() : string { return $this->_raw->body['meta']['website']; } public function getCaaIdentities() : string { return $this->_raw->body['meta']['caaIdentities']; } } vendor/fbett/le_acme2/src/LE_ACME2/Response/GetNewNonce.php 0000644 00000000671 15154444756 0017260 0 ustar 00 <?php namespace LE_ACME2\Response; defined('ABSPATH') or die(); class GetNewNonce extends AbstractResponse { protected $_pattern = '/^Replay\-Nonce: (\S+)$/i'; protected function _isValid() : bool { return $this->_preg_match_headerLine($this->_pattern) !== null; } public function getNonce() : string { $matches = $this->_preg_match_headerLine($this->_pattern); return trim($matches[1]); } } vendor/fbett/le_acme2/src/LE_ACME2/Response/AbstractResponse.php 0000644 00000003566 15154444756 0020374 0 ustar 00 <?php namespace LE_ACME2\Response; defined('ABSPATH') or die(); use LE_ACME2\Exception; use LE_ACME2\Connector\RawResponse; abstract class AbstractResponse { protected $_raw = NULL; protected $_pattern_header_location = '/^Location: (\S+)$/i'; /** * AbstractResponse constructor. * * @param RawResponse $raw * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function __construct(RawResponse $raw) { $this->_raw = $raw; if($this->_isRateLimitReached()) { $detail = ""; if(isset($raw->body['type']) && $raw->body['type'] == 'urn:ietf:params:acme:error:rateLimited') { $detail = $raw->body['detail']; } throw new Exception\RateLimitReached($raw->request, $detail); } $result = $this->_isValid(); if(!$result) { $responseStatus = $this->_preg_match_headerLine('/^HTTP\/.* [0-9]{3,} /i'); throw new Exception\InvalidResponse( $raw, $responseStatus ? $responseStatus[1] : null ); } } protected function _preg_match_headerLine(string $pattern) : ?array { foreach($this->_raw->header as $line) { if(preg_match($pattern, $line, $matches) === 1) return $matches; } return null; } protected function _isRateLimitReached() : bool { return $this->_preg_match_headerLine('/^HTTP\/.* 429/i') !== null; } protected function _isValid() : bool { return $this->_preg_match_headerLine('/^HTTP\/.* 201/i') !== null || //Created $this->_preg_match_headerLine('/^HTTP\/.* 200/i') !== null || $this->_preg_match_headerLine('/^HTTP\/.* 204/i') !== null; } public function getRaw() : RawResponse { return $this->_raw; } } vendor/fbett/le_acme2/src/LE_ACME2/AbstractKeyValuable.php 0000644 00000005317 15154444756 0017200 0 ustar 00 <?php namespace LE_ACME2; defined('ABSPATH') or die(); use LE_ACME2\Connector\Connector; abstract class AbstractKeyValuable { const KEY_TYPE_RSA = "RSA"; const KEY_TYPE_EC = "EC"; protected $_identifier; protected static $_directoryPath = null; public static function setCommonKeyDirectoryPath(string $directoryPath) { if(!file_exists($directoryPath)) { throw new \RuntimeException('Common Key Directory Path does not exist'); } self::$_directoryPath = realpath($directoryPath) . DIRECTORY_SEPARATOR; } public static function getCommonKeyDirectoryPath() : ?string { return self::$_directoryPath; } protected function _getKeyDirectoryPath(string $appendix = '') : string { return self::$_directoryPath . $this->_identifier . $appendix . DIRECTORY_SEPARATOR; } public function getKeyDirectoryPath() : string { return $this->_getKeyDirectoryPath(''); } protected function _initKeyDirectory(string $keyType = self::KEY_TYPE_RSA, bool $ignoreIfKeysExist = false) { if(!file_exists($this->getKeyDirectoryPath())) { mkdir($this->getKeyDirectoryPath()); } if(!$ignoreIfKeysExist && ( file_exists($this->getKeyDirectoryPath() . 'private.pem') || file_exists($this->getKeyDirectoryPath() . 'public.pem') ) ) { throw new \RuntimeException( 'Keys exist already. Exists the ' . get_class($this) . ' already?' . PHP_EOL . 'Path: ' . $this->getKeyDirectoryPath() ); } if($keyType == self::KEY_TYPE_RSA) { Utilities\KeyGenerator::RSA( $this->getKeyDirectoryPath(), 'private.pem', 'public.pem' ); } else if($keyType == self::KEY_TYPE_EC) { Utilities\KeyGenerator::EC( $this->getKeyDirectoryPath(), 'private.pem', 'public.pem' ); } else { throw new \RuntimeException('Key type "' . $keyType . '" not supported.'); } } protected function _clearKeyDirectory() { if(file_exists($this->getKeyDirectoryPath() . 'private.pem')) { unlink($this->getKeyDirectoryPath() . 'private.pem'); } if(file_exists($this->getKeyDirectoryPath() . 'public.pem')) { unlink($this->getKeyDirectoryPath() . 'public.pem'); } } protected function _getAccountIdentifier(Account $account) : string { $staging = Connector::getInstance()->isUsingStagingServer(); return 'account_' . ($staging ? 'staging_' : 'live_') . $account->getEmail(); } } vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractDNSWriter.php 0000644 00000000663 15154444756 0020750 0 ustar 00 <?php namespace LE_ACME2\Authorizer; defined('ABSPATH') or die(); use LE_ACME2\Order; abstract class AbstractDNSWriter { /** * @param Order $order * @param string $identifier * @param string $digest * * @return bool return true, if the dns configuration is usable and the process should be progressed */ abstract public function write(Order $order, string $identifier, string $digest) : bool; } vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractAuthorizer.php 0000644 00000012016 15154444756 0021256 0 ustar 00 <?php namespace LE_ACME2\Authorizer; defined('ABSPATH') or die(); use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\Cache; use LE_ACME2\Utilities; use LE_ACME2\Exception; use LE_ACME2\Account; use LE_ACME2\Order; abstract class AbstractAuthorizer { protected $_account; protected $_order; /** * AbstractAuthorizer constructor. * * @param Account $account * @param Order $order * * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\ExpiredAuthorization */ public function __construct(Account $account, Order $order) { $this->_account = $account; $this->_order = $order; $this->_fetchAuthorizationResponses(); } /** @var Response\Authorization\Get[] $_authorizationResponses */ protected $_authorizationResponses = []; /** * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\ExpiredAuthorization */ protected function _fetchAuthorizationResponses() { if(!file_exists($this->_order->getKeyDirectoryPath() . 'private.pem')) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' result suppressed (Order has finished already)' ); return; } $orderResponse = Cache\OrderResponse::getInstance()->get($this->_order); foreach($orderResponse->getAuthorizations() as $authorization) { $request = new Request\Authorization\Get($this->_account, $authorization); $this->_authorizationResponses[] = $request->getResponse(); } } protected function _hasValidAuthorizationResponses() : bool { return count($this->_authorizationResponses) > 0; } public function shouldStartAuthorization() : bool { foreach($this->_authorizationResponses as $response) { $challenge = $response->getChallenge($this->_getChallengeType()); if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' "Pending challenge found', $challenge ); return true; } } return false; } abstract protected function _getChallengeType() : string; /** * @throws Exception\AuthorizationInvalid * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\ExpiredAuthorization */ public function progress() { if(!$this->_hasValidAuthorizationResponses()) return; $existsNotValidChallenges = false; foreach($this->_authorizationResponses as $authorizationResponse) { $challenge = $authorizationResponse->getChallenge($this->_getChallengeType()); if($this->_existsNotValidChallenges($challenge, $authorizationResponse)) { $existsNotValidChallenges = true; } } $this->_finished = !$existsNotValidChallenges; } /** * @param Response\Authorization\Struct\Challenge $challenge * @param Response\Authorization\Get $authorizationResponse * @return bool * * @throws Exception\AuthorizationInvalid */ protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge, Response\Authorization\Get $authorizationResponse ) : bool { if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' "Non valid challenge found', $challenge ); return true; } else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PROGRESSING) { // Should come back later return true; } else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_VALID) { } else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) { throw new Exception\AuthorizationInvalid( 'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified' ); } else { throw new \RuntimeException('Challenge status "' . $challenge->status . '" is not implemented'); } return false; } protected $_finished = false; public function hasFinished() : bool { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_called_class() . '::' . __FUNCTION__, $this->_finished ); return $this->_finished; } } vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/DNS.php 0000644 00000004566 15154444756 0016075 0 ustar 00 <?php namespace LE_ACME2\Authorizer; defined('ABSPATH') or die(); use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\Exception; use LE_ACME2\Order; use LE_ACME2\Struct\ChallengeAuthorizationKey; use LE_ACME2\Utilities; class DNS extends AbstractAuthorizer { protected function _getChallengeType(): string { return Order::CHALLENGE_TYPE_DNS; } /** @var AbstractDNSWriter $_dnsWriter */ private static $_dnsWriter = null; public static function setWriter(AbstractDNSWriter $dnsWriter) : void { self::$_dnsWriter = $dnsWriter; } /** * @param Response\Authorization\Struct\Challenge $challenge * @param Response\Authorization\Get $authorizationResponse * @return bool * * @throws Exception\AuthorizationInvalid * @throws Exception\DNSAuthorizationInvalid * @throws Exception\ExpiredAuthorization * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge, Response\Authorization\Get $authorizationResponse ) : bool { if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) { if(self::$_dnsWriter === null) { throw new \RuntimeException('DNS writer is not set'); } if( self::$_dnsWriter->write( $this->_order, $authorizationResponse->getIdentifier()->value, (new ChallengeAuthorizationKey($this->_account))->getEncoded($challenge->token) ) ) { $request = new Request\Authorization\Start($this->_account, $this->_order, $challenge); /* $response = */ $request->getResponse(); } else { Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Pending challenge deferred'); } } if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) { throw new Exception\DNSAuthorizationInvalid( 'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified' ); } return parent::_existsNotValidChallenges($challenge, $authorizationResponse); } } vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/HTTP.php 0000644 00000010043 15154444756 0016213 0 ustar 00 <?php namespace LE_ACME2\Authorizer; defined('ABSPATH') or die(); use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\Struct\ChallengeAuthorizationKey; use LE_ACME2\Utilities; use LE_ACME2\Exception; use LE_ACME2\Order; class HTTP extends AbstractAuthorizer { protected static $_directoryPath = null; public static function setDirectoryPath(string $directoryPath) { if(!file_exists($directoryPath)) { throw new \RuntimeException('HTTP authorization directory path does not exist'); } self::$_directoryPath = realpath($directoryPath) . DIRECTORY_SEPARATOR; } public static function getDirectoryPath() : ?string { return self::$_directoryPath; } protected function _getChallengeType(): string { return Order::CHALLENGE_TYPE_HTTP; } /** * @param Response\Authorization\Struct\Challenge $challenge * @param Response\Authorization\Get $authorizationResponse * @return bool * * @throws Exception\AuthorizationInvalid * @throws Exception\ExpiredAuthorization * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge, Response\Authorization\Get $authorizationResponse ) : bool { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, 'Challenge "' . $challenge->token . '" has status:' . $challenge->status ); if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) { $this->_writeToFile($challenge); if($this->_validateFile($authorizationResponse->getIdentifier()->value, $challenge)) { $request = new Request\Authorization\Start($this->_account, $this->_order, $challenge); /* $response = */ $request->getResponse(); } else { Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Could not validate HTTP Authorization file'); } } if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) { throw new Exception\HTTPAuthorizationInvalid( 'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified' ); } return parent::_existsNotValidChallenges($challenge, $authorizationResponse); } private function _writeToFile(Response\Authorization\Struct\Challenge $challenge) : void { file_put_contents( self::$_directoryPath . $challenge->token, (new ChallengeAuthorizationKey($this->_account))->get($challenge->token) ); } /** * @param string $domain * @param Response\Authorization\Struct\Challenge $challenge * @return bool * * @throws Exception\HTTPAuthorizationInvalid */ private function _validateFile(string $domain, Response\Authorization\Struct\Challenge $challenge) : bool { if ( get_option('rsssl_skip_challenge_directory_request') ) { return true; } $challengeAuthorizationKey = new ChallengeAuthorizationKey($this->_account); $requestURL = 'http://' . $domain . '/.well-known/acme-challenge/' . $challenge->token; $handle = curl_init(); curl_setopt($handle, CURLOPT_URL, $requestURL); curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($handle); $result = !empty($response) && $response == $challengeAuthorizationKey->get($challenge->token); if(!$result) { throw new Exception\HTTPAuthorizationInvalid( 'HTTP challenge for "' . $domain . '"": ' . $domain . '/.well-known/acme-challenge/' . $challenge->token . ' tested, found invalid. CURL response: ' . var_export($response, true) ); } return true; } } vendor/fbett/le_acme2/src/LE_ACME2/Cache/AbstractKeyValuableCache.php 0000644 00000000477 15154444756 0021131 0 ustar 00 <?php namespace LE_ACME2\Cache; defined('ABSPATH') or die(); use LE_ACME2\AbstractKeyValuable; abstract class AbstractKeyValuableCache { protected function __construct() {} protected function _getObjectIdentifier(AbstractKeyValuable $object) : string { return $object->getKeyDirectoryPath(); } } vendor/fbett/le_acme2/src/LE_ACME2/Cache/OrderResponse.php 0000644 00000007465 15154444756 0017113 0 ustar 00 <?php namespace LE_ACME2\Cache; defined('ABSPATH') or die(); use LE_ACME2\Connector; use LE_ACME2\Order; use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\Exception; use LE_ACME2\Utilities; use LE_ACME2\SingletonTrait; class OrderResponse extends AbstractKeyValuableCache { use SingletonTrait; private const _FILE = 'CacheResponse'; private const _DEPRECATED_FILE = 'DirectoryNewOrderResponse'; private $_responses = []; public function exists(Order $order) : bool { $cacheFile = $order->getKeyDirectoryPath() . self::_FILE; $deprecatedCacheFile = $order->getKeyDirectoryPath() . self::_DEPRECATED_FILE; return file_exists($cacheFile) || file_exists($deprecatedCacheFile); } /** * @param Order $order * @return Response\Order\AbstractOrder * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function get(Order $order): Response\Order\AbstractOrder { $accountIdentifier = $this->_getObjectIdentifier($order->getAccount()); $orderIdentifier = $this->_getObjectIdentifier($order); if(!isset($this->_responses[$accountIdentifier])) { $this->_responses[$accountIdentifier] = []; } if(array_key_exists($orderIdentifier, $this->_responses[$accountIdentifier])) { return $this->_responses[ $accountIdentifier ][ $orderIdentifier ]; } $this->_responses[ $accountIdentifier ][ $orderIdentifier ] = null; $cacheFile = $order->getKeyDirectoryPath() . self::_FILE; $deprecatedCacheFile = $order->getKeyDirectoryPath() . self::_DEPRECATED_FILE; if(file_exists($deprecatedCacheFile) && !file_exists($cacheFile)) { rename($deprecatedCacheFile, $cacheFile); } if(file_exists($cacheFile)) { $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile)); $response = new Response\Order\Create($rawResponse); if( $response->getStatus() != Response\Order\AbstractOrder::STATUS_VALID ) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' (cache did not satisfy, status "' . $response->getStatus() . '")' ); $request = new Request\Order\Get($order, $response); $response = $request->getResponse(); $this->set($order, $response); return $response; } Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' (from cache, status "' . $response->getStatus() . '")' ); $this->_responses[$accountIdentifier][$orderIdentifier] = $response; return $response; } throw new \RuntimeException( self::_FILE . ' could not be found for order: ' . '- Path: ' . $order->getKeyDirectoryPath() . PHP_EOL . '- Subjects: ' . var_export($order->getSubjects(), true) . PHP_EOL ); } public function set(Order $order, Response\Order\AbstractOrder $response = null) : void { $accountIdentifier = $this->_getObjectIdentifier($order->getAccount()); $orderIdentifier = $this->_getObjectIdentifier($order); $filePath = $order->getKeyDirectoryPath() . self::_FILE; if($response === null) { unset($this->_responses[$accountIdentifier][$orderIdentifier]); if(file_exists($filePath)) { unlink($filePath); } return; } $this->_responses[$accountIdentifier][$orderIdentifier] = $response; file_put_contents($filePath, $response->getRaw()->toString()); } } vendor/fbett/le_acme2/src/LE_ACME2/Cache/DirectoryResponse.php 0000644 00000003251 15154444756 0017771 0 ustar 00 <?php namespace LE_ACME2\Cache; defined('ABSPATH') or die(); use LE_ACME2\Connector; use LE_ACME2\Account; use LE_ACME2\SingletonTrait; use LE_ACME2\Exception; use LE_ACME2\Request; use LE_ACME2\Response; class DirectoryResponse { use SingletonTrait; private const _FILE = 'DirectoryResponse'; private function __construct() {} private $_responses = []; private $_index = 0; /** * @return Response\GetDirectory * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function get() : Response\GetDirectory { if(array_key_exists($this->_index, $this->_responses)) { return $this->_responses[$this->_index]; } $this->_responses[$this->_index] = null; $cacheFile = Account::getCommonKeyDirectoryPath() . self::_FILE; if(file_exists($cacheFile) && filemtime($cacheFile) > strtotime('-2 days')) { $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile)); try { return $this->_responses[$this->_index] = new Response\GetDirectory($rawResponse); } catch(Exception\AbstractException $e) { unlink($cacheFile); } } $request = new Request\GetDirectory(); $response = $request->getResponse(); $this->set($response); return $response; } public function set(Response\GetDirectory $response) : void { $cacheFile = Account::getCommonKeyDirectoryPath() . self::_FILE; $this->_responses[$this->_index] = $response; file_put_contents($cacheFile, $response->getRaw()->toString()); } } vendor/fbett/le_acme2/src/LE_ACME2/Cache/NewNonceResponse.php 0000644 00000001673 15154444756 0017547 0 ustar 00 <?php namespace LE_ACME2\Cache; defined('ABSPATH') or die(); use LE_ACME2\SingletonTrait; use LE_ACME2\Exception; use LE_ACME2\Request; use LE_ACME2\Response; class NewNonceResponse { use SingletonTrait; private function __construct() {} private $_responses = []; private $_index = 0; /** * @return Response\GetNewNonce * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function get() : Response\GetNewNonce { if(array_key_exists($this->_index, $this->_responses)) { return $this->_responses[$this->_index]; } $this->_responses[$this->_index] = null; $request = new Request\GetNewNonce(); $response = $request->getResponse(); $this->set($response); return $response; } public function set(Response\GetNewNonce $response) : void { $this->_responses[$this->_index] = $response; } } vendor/fbett/le_acme2/src/LE_ACME2/Cache/AccountResponse.php 0000644 00000005041 15154444756 0017420 0 ustar 00 <?php namespace LE_ACME2\Cache; defined('ABSPATH') or die(); use LE_ACME2\Account; use LE_ACME2\Connector; use LE_ACME2\Request; use LE_ACME2\Response; use LE_ACME2\Exception; use LE_ACME2\Utilities; use LE_ACME2\SingletonTrait; class AccountResponse extends AbstractKeyValuableCache { use SingletonTrait; private const _FILE = 'CacheResponse'; private const _DEPRECATED_FILE = 'DirectoryNewAccountResponse'; private $_responses = []; /** * @param Account $account * @return Response\Account\AbstractAccount * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function get(Account $account): Response\Account\AbstractAccount { $accountIdentifier = $this->_getObjectIdentifier($account); if(array_key_exists($accountIdentifier, $this->_responses)) { return $this->_responses[ $accountIdentifier ]; } $this->_responses[ $accountIdentifier ] = null; $cacheFile = $account->getKeyDirectoryPath() . self::_FILE; $deprecatedCacheFile = $account->getKeyDirectoryPath() . self::_DEPRECATED_FILE; if(file_exists($deprecatedCacheFile) && !file_exists($cacheFile)) { rename($deprecatedCacheFile, $cacheFile); } if(file_exists($cacheFile) && filemtime($cacheFile) > strtotime('-7 days')) { $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile)); $response = new Response\Account\Create($rawResponse); $this->_responses[ $accountIdentifier ] = $response; Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, get_class() . '::' . __FUNCTION__ . ' response from cache' ); return $response; } $request = new Request\Account\Get($account); $response = $request->getResponse(); $this->set($account, $response); return $response; } public function set(Account $account, Response\Account\AbstractAccount $response = null) : void { $accountIdentifier = $this->_getObjectIdentifier($account); $filePath = $account->getKeyDirectoryPath() . self::_FILE; if($response === null) { unset($this->_responses[$accountIdentifier]); if(file_exists($filePath)) { unlink($filePath); } return; } $this->_responses[$accountIdentifier] = $response; file_put_contents($filePath, $response->getRaw()->toString()); } } vendor/fbett/le_acme2/src/LE_ACME2/Struct/ChallengeAuthorizationKey.php 0000644 00000002100 15154444756 0021673 0 ustar 00 <?php namespace LE_ACME2\Struct; defined('ABSPATH') or die(); use LE_ACME2\Account; use LE_ACME2\Utilities; class ChallengeAuthorizationKey { private $_account; public function __construct(Account $account) { $this->_account = $account; } public function get(string $token) : string { return $token . '.' . $this->_getDigest(); } public function getEncoded(string $token) : string { return Utilities\Base64::UrlSafeEncode( hash('sha256', $this->get($token), true) ); } private function _getDigest() : string { $privateKey = openssl_pkey_get_private(file_get_contents($this->_account->getKeyDirectoryPath() . 'private.pem')); $details = openssl_pkey_get_details($privateKey); $header = array( "e" => Utilities\Base64::UrlSafeEncode($details["rsa"]["e"]), "kty" => "RSA", "n" => Utilities\Base64::UrlSafeEncode($details["rsa"]["n"]) ); return Utilities\Base64::UrlSafeEncode(hash('sha256', json_encode($header), true)); } } vendor/fbett/le_acme2/src/LE_ACME2/Struct/CertificateBundle.php 0000644 00000001024 15154444756 0020137 0 ustar 00 <?php namespace LE_ACME2\Struct; defined('ABSPATH') or die(); class CertificateBundle { public $path; public $private; public $certificate; public $intermediate; public $expireTime; public function __construct(string $path, string $private, string $certificate, string $intermediate, int $expireTime) { $this->path = $path; $this->private = $private; $this->certificate = $certificate; $this->intermediate = $intermediate; $this->expireTime = $expireTime; } } vendor/fbett/le_acme2/src/LE_ACME2/Exception/StatusInvalid.php 0000644 00000000163 15154444756 0020032 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); class StatusInvalid extends AbstractException {} vendor/fbett/le_acme2/src/LE_ACME2/Exception/DNSAuthorizationInvalid.php 0000644 00000000200 15154444756 0021744 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); class DNSAuthorizationInvalid extends AuthorizationInvalid {} vendor/fbett/le_acme2/src/LE_ACME2/Exception/AbstractException.php 0000644 00000000627 15154444756 0020667 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); use LE_ACME2\Utilities; abstract class AbstractException extends \Exception { public function __construct(string $message) { Utilities\Logger::getInstance()->add( Utilities\Logger::LEVEL_DEBUG, 'Exception "' . get_called_class() . '" thrown ' ); parent::__construct($message); } } vendor/fbett/le_acme2/src/LE_ACME2/Exception/RateLimitReached.php 0000644 00000000542 15154444756 0020407 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); class RateLimitReached extends AbstractException { public function __construct(string $request, string $detail) { parent::__construct( "Invalid response received for request (" . $request . "): " . "rate limit reached - " . $detail ); } } vendor/fbett/le_acme2/src/LE_ACME2/Exception/InvalidResponse.php 0000644 00000002043 15154444756 0020344 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); use LE_ACME2\Connector\RawResponse; class InvalidResponse extends AbstractException { private $_rawResponse; private $_responseStatus; public function __construct(RawResponse $rawResponse, string $responseStatus = null) { $this->_rawResponse = $rawResponse; $this->_responseStatus = $responseStatus; if($responseStatus === '') { $responseStatus = 'Unknown response status'; } if(isset($this->_rawResponse->body['type'])) { $responseStatus = $this->_rawResponse->body['type']; } if(isset($this->_rawResponse->body['detail'])) { $responseStatus .= ' - ' . $this->_rawResponse->body['detail']; } parent::__construct('Invalid response received: ' . $responseStatus); } public function getRawResponse() : RawResponse { return $this->_rawResponse; } public function getResponseStatus() : ?string { return $this->_responseStatus; } } vendor/fbett/le_acme2/src/LE_ACME2/Exception/OpenSSLException.php 0000644 00000000564 15154444756 0020407 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); class OpenSSLException extends AbstractException { public function __construct(string $function) { $errors = []; while(($error = openssl_error_string()) !== false) { $errors[] = $error; } parent::__construct( $function . ' failed - error messages: ' . var_export($errors, true) ); } } vendor/fbett/le_acme2/src/LE_ACME2/Exception/ExpiredAuthorization.php 0000644 00000000345 15154444756 0021423 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); class ExpiredAuthorization extends AbstractException { public function __construct() { parent::__construct("Expired authorization received"); } } vendor/fbett/le_acme2/src/LE_ACME2/Exception/AuthorizationInvalid.php 0000644 00000000172 15154444756 0021407 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); class AuthorizationInvalid extends AbstractException {} vendor/fbett/le_acme2/src/LE_ACME2/Exception/HTTPAuthorizationInvalid.php 0000644 00000000201 15154444756 0022100 0 ustar 00 <?php namespace LE_ACME2\Exception; defined('ABSPATH') or die(); class HTTPAuthorizationInvalid extends AuthorizationInvalid {} vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Certificate.php 0000644 00000003650 15154444756 0017503 0 ustar 00 <?php namespace LE_ACME2\Utilities; defined('ABSPATH') or die(); use LE_ACME2\Order; use LE_ACME2\Exception\OpenSSLException; class Certificate { protected static $_featureOCSPMustStapleEnabled = false; public static function enableFeatureOCSPMustStaple() { self::$_featureOCSPMustStapleEnabled = true; } public static function disableFeatureOCSPMustStaple() { self::$_featureOCSPMustStapleEnabled = false; } /** * @param Order $order * @return string * @throws OpenSSLException */ public static function generateCSR(Order $order) : string { $dn = [ "commonName" => $order->getSubjects()[0] ]; $san = implode(",", array_map(function ($dns) { return "DNS:" . $dns; }, $order->getSubjects()) ); $configFilePath = $order->getKeyDirectoryPath() . 'csr_config'; $config = 'HOME = . RANDFILE = ' . $order->getKeyDirectoryPath() . '.rnd [ req ] default_bits = 4096 default_keyfile = privkey.pem distinguished_name = req_distinguished_name req_extensions = v3_req [ req_distinguished_name ] countryName = Country Name (2 letter code) [ v3_req ] basicConstraints = CA:FALSE subjectAltName = ' . $san . ' keyUsage = nonRepudiation, digitalSignature, keyEncipherment'; if(self::$_featureOCSPMustStapleEnabled) { $config .= PHP_EOL . 'tlsfeature=status_request'; } file_put_contents($configFilePath, $config); $privateKey = openssl_pkey_get_private( file_get_contents($order->getKeyDirectoryPath() . 'private.pem') ); if($privateKey === false) { throw new OpenSSLException('openssl_pkey_get_private'); } $csr = openssl_csr_new( $dn, $privateKey, [ 'config' => $configFilePath, 'digest_alg' => 'sha256' ] ); if($csr === false) { throw new OpenSSLException('openssl_csr_new'); } if(!openssl_csr_export($csr, $csr)) { throw new OpenSSLException('openssl_csr_export'); } unlink($configFilePath); return $csr; } } vendor/fbett/le_acme2/src/LE_ACME2/Utilities/KeyGenerator.php 0000644 00000004504 15154444756 0017657 0 ustar 00 <?php namespace LE_ACME2\Utilities; defined('ABSPATH') or die(); class KeyGenerator { /** * Generates a new RSA keypair and saves both keys to a new file. * * @param string $directory The directory in which to store the new keys. * @param string $privateKeyFile The filename for the private key file. * @param string $publicKeyFile The filename for the public key file. */ public static function RSA(string $directory, string $privateKeyFile = 'private.pem', string $publicKeyFile = 'public.pem') { $res = openssl_pkey_new([ "private_key_type" => OPENSSL_KEYTYPE_RSA, "private_key_bits" => 4096, ]); if(!openssl_pkey_export($res, $privateKey)) throw new \RuntimeException("RSA keypair export failed!"); $details = openssl_pkey_get_details($res); file_put_contents($directory . $privateKeyFile, $privateKey); file_put_contents($directory . $publicKeyFile, $details['key']); if(PHP_MAJOR_VERSION < 8) { // deprecated after PHP 8.0.0 and not needed anymore openssl_pkey_free($res); } } /** * Generates a new EC prime256v1 keypair and saves both keys to a new file. * * @param string $directory The directory in which to store the new keys. * @param string $privateKeyFile The filename for the private key file. * @param string $publicKeyFile The filename for the public key file. */ public static function EC(string $directory, string $privateKeyFile = 'private.pem', string $publicKeyFile = 'public.pem') { if (version_compare(PHP_VERSION, '7.1.0') == -1) throw new \RuntimeException("PHP 7.1+ required for EC keys"); $res = openssl_pkey_new([ "private_key_type" => OPENSSL_KEYTYPE_EC, "curve_name" => "prime256v1", ]); if(!openssl_pkey_export($res, $privateKey)) throw new \RuntimeException("EC keypair export failed!"); $details = openssl_pkey_get_details($res); file_put_contents($directory . $privateKeyFile, $privateKey); file_put_contents($directory . $publicKeyFile, $details['key']); if(PHP_MAJOR_VERSION < 8) { // deprecated after PHP 8.0.0 and not needed anymore openssl_pkey_free($res); } } } vendor/fbett/le_acme2/src/LE_ACME2/Utilities/RequestSigner.php 0000644 00000011037 15154444756 0020057 0 ustar 00 <?php namespace LE_ACME2\Utilities; defined('ABSPATH') or die(); class RequestSigner { /** * Generates a JSON Web Key signature to attach to the request. * * @param array $payload The payload to add to the signature. * @param string $url The URL to use in the signature. * @param string $nonce * @param string $privateKeyDir The directory to get the private key from. Default to the account keys directory given in the constructor. (optional) * @param string $privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional) * * @return array Returns an array containing the signature. */ public static function JWK(array $payload, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : array { Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'JWK sign request for ' . $url, $payload); $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyDir . $privateKeyFile)); $details = openssl_pkey_get_details($privateKey); $protected = [ "alg" => "RS256", "jwk" => [ "kty" => "RSA", "n" => Base64::UrlSafeEncode($details["rsa"]["n"]), "e" => Base64::UrlSafeEncode($details["rsa"]["e"]), ], "nonce" => $nonce, "url" => $url ]; $payload64 = Base64::UrlSafeEncode(str_replace('\\/', '/', json_encode($payload))); $protected64 = Base64::UrlSafeEncode(json_encode($protected)); openssl_sign($protected64.'.'.$payload64, $signed, $privateKey, "SHA256"); $signed64 = Base64::UrlSafeEncode($signed); $data = array( 'protected' => $protected64, 'payload' => $payload64, 'signature' => $signed64 ); return $data; } /** * Generates a JSON Web Key signature to attach to the request. * * @param array $payload The payload to add to the signature. * @param string $url The URL to use in the signature. * @param string $nonce * @param string $privateKeyDir The directory to get the private key from. Default to the account keys directory given in the constructor. (optional) * @param string $privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional) * * @return string Returns a JSON encoded string containing the signature. */ public static function JWKString(array $payload, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : string { $jwk = self::JWK($payload, $url, $nonce, $privateKeyDir, $privateKeyFile); return json_encode($jwk); } /** * Generates a Key ID signature to attach to the request. * * @param array|null $payload The payload to add to the signature. * @param string $kid The Key ID to use in the signature. * @param string $url The URL to use in the signature. * @param string $nonce * @param string $privateKeyDir The directory to get the private key from. * @param string $privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional) * * @return string Returns a JSON encoded string containing the signature. */ public static function KID(?array $payload, string $kid, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : string { Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'KID sign request for ' . $url, $payload); $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyDir . $privateKeyFile)); // TODO: unused - $details = openssl_pkey_get_details($privateKey); $protected = [ "alg" => "RS256", "kid" => $kid, "nonce" => $nonce, "url" => $url ]; Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'KID: ready to sign request for: ' . $url, $protected); $payload = $payload === null ? "" : str_replace('\\/', '/', json_encode($payload)); $payload64 = Base64::UrlSafeEncode($payload); $protected64 = Base64::UrlSafeEncode(json_encode($protected)); openssl_sign($protected64.'.'.$payload64, $signed, $privateKey, "SHA256"); $signed64 = Base64::UrlSafeEncode($signed); $data = [ 'protected' => $protected64, 'payload' => $payload64, 'signature' => $signed64 ]; return json_encode($data); } } vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Base64.php 0000644 00000001667 15154444756 0016313 0 ustar 00 <?php namespace LE_ACME2\Utilities; defined('ABSPATH') or die(); class Base64 { /** * Encodes a string input to a base64 encoded string which is URL safe. * * @param string $input The input string to encode. * @return string Returns a URL safe base64 encoded string. */ public static function UrlSafeEncode(string $input) : string { return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); } /** * Decodes a string that is URL safe base64 encoded. * * @param string $input The encoded input string to decode. * @return string Returns the decoded input string. */ public static function UrlSafeDecode(string $input) : string { $remainder = strlen($input) % 4; if ($remainder) { $padlen = 4 - $remainder; $input .= str_repeat('=', $padlen); } return base64_decode(strtr($input, '-_', '+/')); } } vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Logger.php 0000644 00000003130 15154444756 0016471 0 ustar 00 <?php namespace LE_ACME2\Utilities; defined('ABSPATH') or die(); use LE_ACME2\SingletonTrait; class Logger { use SingletonTrait; const LEVEL_DISABLED = 0; const LEVEL_INFO = 1; const LEVEL_DEBUG = 2; private function __construct() {} protected $_desiredLevel = self::LEVEL_DISABLED; public function setDesiredLevel(int $desiredLevel) { $this->_desiredLevel = $desiredLevel; } /** * @param int $level * @param string $message * @param string|array|object $data */ public function add(int $level, string $message, $data = array()) { if($level > $this->_desiredLevel) return; $e = new \Exception(); $trace = $e->getTrace(); unset($trace[0]); $output = '<b>' . date('d-m-Y H:i:s') . ': ' . $message . '</b><br>' . "\n"; if($this->_desiredLevel == self::LEVEL_DEBUG) { $step = 0; foreach ($trace as $traceItem) { if(!isset($traceItem['class']) || !isset($traceItem['function'])) { continue; } $output .= 'Trace #' . $step . ': ' . $traceItem['class'] . '::' . $traceItem['function'] . '<br/>' . "\n"; $step++; } if ((is_array($data) && count($data) > 0) || !is_array($data)) $output .= "\n" .'<br/>Data:<br/>' . "\n" . '<pre>' . var_export($data, true) . '</pre>'; $output .= '<br><br>' . "\n\n"; } if(PHP_SAPI == 'cli') { $output = strip_tags($output); } echo $output; } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Get.php 0000644 00000002530 15154444756 0020311 0 ustar 00 <?php namespace LE_ACME2\Request\Authorization; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Response; use LE_ACME2\Utilities; use LE_ACME2\Account; class Get extends AbstractRequest { protected $_account; protected $_authorizationURL; public function __construct(Account $account, string $authorizationURL) { $this->_account = $account; $this->_authorizationURL = $authorizationURL; } /** * @return Response\AbstractResponse|Response\Authorization\Get * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\ExpiredAuthorization */ public function getResponse() : Response\AbstractResponse { $kid = Utilities\RequestSigner::KID( null, Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(), $this->_authorizationURL, Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_account->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, $this->_authorizationURL, $kid ); return new Response\Authorization\Get($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Start.php 0000644 00000003176 15154444756 0020676 0 ustar 00 <?php namespace LE_ACME2\Request\Authorization; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Response; use LE_ACME2\Struct\ChallengeAuthorizationKey; use LE_ACME2\Utilities; use LE_ACME2\Account; use LE_ACME2\Order; class Start extends AbstractRequest { protected $_account; protected $_order; protected $_challenge; public function __construct(Account $account, Order $order, Response\Authorization\Struct\Challenge $challenge) { $this->_account = $account; $this->_order = $order; $this->_challenge = $challenge; } /** * @return Response\AbstractResponse|Response\Authorization\Start * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached * @throws Exception\ExpiredAuthorization */ public function getResponse() : Response\AbstractResponse { $payload = [ 'keyAuthorization' => (new ChallengeAuthorizationKey($this->_account))->get($this->_challenge->token) ]; $kid = Utilities\RequestSigner::KID( $payload, Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(), $this->_challenge->url, Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_account->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, $this->_challenge->url, $kid ); return new Response\Authorization\Start($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/AbstractRequest.php 0000644 00000001013 15154444756 0020041 0 ustar 00 <?php namespace LE_ACME2\Request; defined('ABSPATH') or die(); use LE_ACME2\Response\AbstractResponse; use LE_ACME2\Exception; abstract class AbstractRequest { /** * @return AbstractResponse * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ abstract public function getResponse() : AbstractResponse; protected function _buildContactPayload(string $email) : array { $result = [ 'mailto:' . $email ]; return $result; } } vendor/fbett/le_acme2/src/LE_ACME2/Request/GetNewNonce.php 0000644 00000001250 15154444756 0017104 0 ustar 00 <?php namespace LE_ACME2\Request; defined('ABSPATH') or die(); use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; class GetNewNonce extends AbstractRequest { /** * @return Response\AbstractResponse|Response\GetNewNonce * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_HEAD, Cache\DirectoryResponse::getInstance()->get()->getNewNonce() ); return new Response\GetNewNonce($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/RevokeCertificate.php 0000644 00000003441 15154444756 0021405 0 ustar 00 <?php namespace LE_ACME2\Request\Order; defined('ABSPATH') or die(); use LE_ACME2\Response; use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Struct; use LE_ACME2\Utilities; class RevokeCertificate extends AbstractRequest { protected $_certificateBundle; protected $_reason; public function __construct(Struct\CertificateBundle $certificateBundle, $reason) { $this->_certificateBundle = $certificateBundle; $this->_reason = $reason; } /** * @return Response\AbstractResponse|Response\Order\RevokeCertificate * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $certificate = file_get_contents($this->_certificateBundle->path . $this->_certificateBundle->certificate); preg_match('~-----BEGIN\sCERTIFICATE-----(.*)-----END\sCERTIFICATE-----~s', $certificate, $matches); $certificate = trim(Utilities\Base64::UrlSafeEncode(base64_decode(trim($matches[1])))); $payload = [ 'certificate' => $certificate, 'reason' => $this->_reason ]; $jwk = Utilities\RequestSigner::JWKString( $payload, Cache\DirectoryResponse::getInstance()->get()->getRevokeCert(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_certificateBundle->path, $this->_certificateBundle->private ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, Cache\DirectoryResponse::getInstance()->get()->getRevokeCert(), $jwk ); return new Response\Order\RevokeCertificate($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Create.php 0000644 00000003137 15154444756 0017214 0 ustar 00 <?php namespace LE_ACME2\Request\Order; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Utilities; use LE_ACME2\Order; class Create extends AbstractRequest { protected $_order; public function __construct(Order $order) { $this->_order = $order; } /** * @return Response\AbstractResponse|Response\Order\Create * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $identifiers = []; foreach($this->_order->getSubjects() as $subject) { $identifiers[] = [ 'type' => 'dns', 'value' => $subject ]; } $payload = [ 'identifiers' => $identifiers, 'notBefore' => '', 'notAfter' => '', ]; $kid = Utilities\RequestSigner::KID( $payload, Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(), Cache\DirectoryResponse::getInstance()->get()->getNewOrder(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_order->getAccount()->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, Cache\DirectoryResponse::getInstance()->get()->getNewOrder(), $kid ); return new Response\Order\Create($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/GetCertificate.php 0000644 00000003175 15154444756 0020675 0 ustar 00 <?php namespace LE_ACME2\Request\Order; defined('ABSPATH') or die(); use LE_ACME2\Order; use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Utilities; class GetCertificate extends AbstractRequest { protected $_order; protected $_orderResponse; private $_alternativeUrl = null; public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse, string $alternativeUrl = null ) { $this->_order = $order; $this->_orderResponse = $orderResponse; if($alternativeUrl !== null) { $this->_alternativeUrl = $alternativeUrl; } } /** * @return Response\AbstractResponse|Response\Order\GetCertificate * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $url = $this->_alternativeUrl === null ? $this->_orderResponse->getCertificate() : $this->_alternativeUrl; $kid = Utilities\RequestSigner::KID( null, Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(), $url, Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_order->getAccount()->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, $url, $kid ); return new Response\Order\GetCertificate($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Finalize.php 0000644 00000003270 15154444756 0017550 0 ustar 00 <?php namespace LE_ACME2\Request\Order; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Utilities; use LE_ACME2\Order; class Finalize extends AbstractRequest { protected $_order; protected $_orderResponse; public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse) { $this->_order = $order; $this->_orderResponse = $orderResponse; } /** * @return Response\AbstractResponse|Response\Order\Finalize * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $csr = Utilities\Certificate::generateCSR($this->_order); if(preg_match('~-----BEGIN\sCERTIFICATE\sREQUEST-----(.*)-----END\sCERTIFICATE\sREQUEST-----~s', $csr, $matches)) $csr = $matches[1]; $csr = trim(Utilities\Base64::UrlSafeEncode(base64_decode($csr))); $payload = [ 'csr' => $csr ]; $kid = Utilities\RequestSigner::KID( $payload, Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(), $this->_orderResponse->getFinalize(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_order->getAccount()->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, $this->_orderResponse->getFinalize(), $kid ); return new Response\Order\Finalize($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Get.php 0000644 00000002546 15154444756 0016533 0 ustar 00 <?php namespace LE_ACME2\Request\Order; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Utilities; use LE_ACME2\Order; class Get extends AbstractRequest { protected $_order; protected $_orderResponse; public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse) { $this->_order = $order; $this->_orderResponse = $orderResponse; } /** * @return Response\AbstractResponse|Response\Order\Get * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $kid = Utilities\RequestSigner::KID( null, Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(), $this->_orderResponse->getLocation(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_order->getAccount()->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, $this->_orderResponse->getLocation(), $kid ); return new Response\Order\Get($result, $this->_orderResponse->getLocation()); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/GetDirectory.php 0000644 00000001231 15154444756 0017333 0 ustar 00 <?php namespace LE_ACME2\Request; defined('ABSPATH') or die(); use LE_ACME2\Response; use LE_ACME2\Connector\Connector; use LE_ACME2\Exception; class GetDirectory extends AbstractRequest { /** * @return Response\AbstractResponse|Response\GetDirectory * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $connector = Connector::getInstance(); $result = $connector->request( Connector::METHOD_GET, $connector->getBaseURL() . '/directory' ); return new Response\GetDirectory($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/ChangeKeys.php 0000644 00000005513 15154444756 0020353 0 ustar 00 <?php namespace LE_ACME2\Request\Account; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Utilities; use LE_ACME2\Exception; use LE_ACME2\Account; class ChangeKeys extends AbstractRequest { protected $_account; public function __construct(Account $account) { $this->_account = $account; } /** * @return Response\AbstractResponse|Response\Account\ChangeKeys * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $currentPrivateKey = openssl_pkey_get_private( file_get_contents($this->_account->getKeyDirectoryPath() . 'private.pem') ); $currentPrivateKeyDetails = openssl_pkey_get_details($currentPrivateKey); /** * draft-13 Section 7.3.6 * "newKey" is deprecated after August 23rd 2018 */ $newPrivateKey = openssl_pkey_get_private( file_get_contents($this->_account->getKeyDirectoryPath() . 'private-replacement.pem') ); $newPrivateKeyDetails = openssl_pkey_get_details($newPrivateKey); $innerPayload = [ 'account' => Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(), 'oldKey' => [ "kty" => "RSA", "n" => Utilities\Base64::UrlSafeEncode($currentPrivateKeyDetails["rsa"]["n"]), "e" => Utilities\Base64::UrlSafeEncode($currentPrivateKeyDetails["rsa"]["e"]) ], 'newKey' => [ "kty" => "RSA", "n" => Utilities\Base64::UrlSafeEncode($newPrivateKeyDetails["rsa"]["n"]), "e" => Utilities\Base64::UrlSafeEncode($newPrivateKeyDetails["rsa"]["e"]) ] ]; $outerPayload = Utilities\RequestSigner::JWK( $innerPayload, Cache\DirectoryResponse::getInstance()->get()->getKeyChange(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_account->getKeyDirectoryPath(), 'private-replacement.pem' ); $data = Utilities\RequestSigner::KID( $outerPayload, Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(), Cache\DirectoryResponse::getInstance()->get()->getKeyChange(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_account->getKeyDirectoryPath(), 'private.pem' ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, Cache\DirectoryResponse::getInstance()->get()->getKeyChange(), $data ); return new Response\Account\ChangeKeys($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Create.php 0000644 00000002555 15154444756 0017540 0 ustar 00 <?php namespace LE_ACME2\Request\Account; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Utilities; use LE_ACME2\Exception; use LE_ACME2\Account; class Create extends AbstractRequest { protected $_account; public function __construct(Account $account) { $this->_account = $account; } /** * @return Response\AbstractResponse|Response\Account\Create * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $payload = [ 'contact' => $this->_buildContactPayload($this->_account->getEmail()), 'termsOfServiceAgreed' => true, ]; $jwk = Utilities\RequestSigner::JWKString( $payload, Cache\DirectoryResponse::getInstance()->get()->getNewAccount(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_account->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, Cache\DirectoryResponse::getInstance()->get()->getNewAccount(), $jwk ); return new Response\Account\Create($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Get.php 0000644 00000002357 15154444756 0017054 0 ustar 00 <?php namespace LE_ACME2\Request\Account; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Response; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Exception; use LE_ACME2\Utilities; use LE_ACME2\Account; class Get extends AbstractRequest { protected $_account; public function __construct(Account $account) { $this->_account = $account; } /** * @return Response\AbstractResponse|Response\Account\Get * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { $payload = [ 'onlyReturnExisting' => true, ]; $jwk = Utilities\RequestSigner::JWKString( $payload, Cache\DirectoryResponse::getInstance()->get()->getNewAccount(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_account->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, Cache\DirectoryResponse::getInstance()->get()->getNewAccount(), $jwk ); return new Response\Account\Get($result); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Update.php 0000644 00000001467 15154444756 0017560 0 ustar 00 <?php namespace LE_ACME2\Request\Account; defined('ABSPATH') or die(); use LE_ACME2\Response; use LE_ACME2\Exception; use LE_ACME2\Account; class Update extends AbstractLocation { protected $_newEmail; public function __construct(Account $account, $newEmail) { parent::__construct($account); $this->_newEmail = $newEmail; } protected function _getPayload() : array { return [ 'contact' => $this->_buildContactPayload($this->_newEmail), ]; } /** * @return Response\AbstractResponse|Response\Account\Update * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { return new Response\Account\Update($this->_getRawResponse()); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Deactivate.php 0000644 00000001134 15154444756 0020376 0 ustar 00 <?php namespace LE_ACME2\Request\Account; defined('ABSPATH') or die(); use LE_ACME2\Response; use LE_ACME2\Exception; class Deactivate extends AbstractLocation { protected function _getPayload() : array { return [ 'status' => 'deactivated', ]; } /** * @return Response\AbstractResponse|Response\Account\Deactivate * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { return new Response\Account\Deactivate($this->_getRawResponse()); } } vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/AbstractLocation.php 0000644 00000002644 15154444756 0021570 0 ustar 00 <?php namespace LE_ACME2\Request\Account; defined('ABSPATH') or die(); use LE_ACME2\Request\AbstractRequest; use LE_ACME2\Connector; use LE_ACME2\Cache; use LE_ACME2\Utilities; use LE_ACME2\Exception; use LE_ACME2\Account; abstract class AbstractLocation extends AbstractRequest { protected $_account; public function __construct(Account $account) { $this->_account = $account; } /** * @return Connector\RawResponse * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ protected function _getRawResponse() : Connector\RawResponse { $payload = $this->_getPayload(); if(count($payload) == 0) { $payload['rand-' . rand(100000, 1000000)] = 1; } $kid = Utilities\RequestSigner::KID( $payload, Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(), Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(), Cache\NewNonceResponse::getInstance()->get()->getNonce(), $this->_account->getKeyDirectoryPath() ); $result = Connector\Connector::getInstance()->request( Connector\Connector::METHOD_POST, Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(), $kid ); return $result; } abstract protected function _getPayload() : array; } vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/GetData.php 0000644 00000001066 15154444756 0017642 0 ustar 00 <?php namespace LE_ACME2\Request\Account; defined('ABSPATH') or die(); use LE_ACME2\Response; use LE_ACME2\Exception; class GetData extends AbstractLocation { protected function _getPayload() : array { return []; } /** * @return Response\AbstractResponse|Response\Account\GetData * @throws Exception\InvalidResponse * @throws Exception\RateLimitReached */ public function getResponse() : Response\AbstractResponse { return new Response\Account\GetData($this->_getRawResponse()); } } vendor/fbett/le_acme2/src/LE_ACME2/SingletonTrait.php 0000644 00000000534 15154444756 0016252 0 ustar 00 <?php namespace LE_ACME2; defined('ABSPATH') or die(); trait SingletonTrait { private static $_instance = NULL; /** * @return static */ final public static function getInstance(): self { if( self::$_instance === NULL ) { self::$_instance = new self(); } return self::$_instance; } } vendor/fbett/le_acme2/README.md 0000644 00000010431 15154444756 0012111 0 ustar 00 # le-acme2-php LetsEncrypt client library for ACME v2 written in PHP. This library is inspired by [yourivw/LEClient](https://github.com/yourivw/LEClient), completely rewritten and enhanced with some new features: - Support for Composer autoload (including separated Namespaces) - Automatic renewal process - Managed HTTP authentication process - Response caching mechanism - Prevents blocking while waiting for server results - Optional certificate feature "OCSP Must-Staple" - Optional set a preferred chain The aim of this client is to make an easy-to-use and integrated solution to create a LetsEncrypt-issued SSL/TLS certificate with PHP. You have the possibility to use the HTTP authentication: You need to be able to redirect specific requests (see below) You have also the possibility to use DNS authentication: You need to be able to set dynamic DNS configurations. Wildcard certificates can only be requested by using the dns authentication. ## Current version Tested with LetsEncrypt staging and production servers. [Transitioning to ISRG's Root](https://letsencrypt.org/2019/04/15/transitioning-to-isrg-root.html): This library supports it to set a preferred chain in `Order::setPreferredChain($issuerCN))`. If the preferred chain is not set or set to IdenTrust’s chain, this library will try to use the IdenTrust’s chain as long as possible. Please see: https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/ ## Prerequisites The minimum required PHP version is 7.3. This client also depends on cURL and OpenSSL. ## Getting Started Install via composer: ``` composer require fbett/le_acme2 ``` Also have a look at the [LetsEncrypt documentation](https://letsencrypt.org/docs/) for more information and documentation on LetsEncrypt and ACME. ## Example Integration - Create a working directory. Warning: This directory will also include private keys, so i suggest to place this directory somewhere not in the root document path of the web server. Additionally this directory should be protected to be read from other web server users. ``` mkdir /etc/ssl/le-storage/ chown root:root /etc/ssl/le-storage chmod 0600 /etc/ssl/le-storage ``` - (HTTP authorization only) Create a directory for the acme challenges. It must be reachable by http/https. ``` mkdir /var/www/acme-challenges ``` - (HTTP authorization only) Redirect specific requests to your acme-challenges directory Example apache virtual host configuration: ``` <VirtualHost ...> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} off RewriteRule \.well-known/acme-challenge/(.*)$ https://your-domain.com/path/to/acme-challenges/$1 [R=302,L] </IfModule> </VirtualHost> ``` - (DNS authorization only) Set the DNS configuration If `DNSWriter::write(...)` is called, set the DNS configuration like described in: [https://letsencrypt.org/docs/challenge-types/#dns-01-challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) (By adding the digest as a TXT record for the subdomain '_acme-challenge'.) - Use the certificate bundle, if the certificate is issued: ``` if($order->isCertificateBundleAvailable()) { $bundle = $order->getCertificateBundle(); $pathToPrivateKey = $bundle->path . $bundle->private; $pathToCertificate = $bundle->path . $bundle->certificate; $pathToIntermediate = $bundle->path . $bundle->intermediate; $order->enableAutoRenewal(); // If the date of expiration is closer than thirty days, the order will automatically start the renewal process. } ``` If a certificate is renewed, the path will also change. My integrated workflow is the following: - User enables SSL to a specific domain in my control panel - The cronjob of this control panel will detect these changes and tries to create or get an order like in the sample. - The cronjob will fetch the information within the certificate bundle, if the certificate bundle is ready (mostly on the second run for challenge type HTTP and on the third run for challenge type DNS) - The cronjob will also build the Apache virtual host files and will restart the Apache2 service, if the new config file is different. Please take a look on the Samples for a full sample workflow. ## License This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. vendor/fbett/le_acme2/composer.json 0000644 00000000752 15154444756 0013361 0 ustar 00 { "name": "fbett/le_acme2", "description": "Letsencrypt PHP ACME v2 client", "homepage": "https://github.com/fbett/le-acme2-php", "version": "1.5.6", "license": "MIT", "authors": [ { "name": "Fabian Bett", "homepage": "https://www.bett-ingenieure.de", "role": "Developer" } ], "autoload": { "psr-0": { "LE_ACME2": "src/" } }, "require": { "php": ">=7.3", "ext-curl": "*", "ext-openssl": "*", "ext-json": "*" } } vendor/fbett/le_acme2/LICENSE.md 0000644 00000002014 15154444756 0012234 0 ustar 00 MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. vendor/fbett/le_acme2/phpunit.xml.dist 0000644 00000001516 15154444756 0014011 0 ustar 00 <?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" backupGlobals="false" backupStaticAttributes="false" colors="true" forceCoversAnnotation="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="true" bootstrap="../../autoload.php" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" > <coverage processUncoveredFiles="true"> <include> <directory suffix=".php">./src/LE_ACME2</directory> </include> </coverage> <testsuites> <testsuite name="LE_ACME2 Test Suite"> <directory>./src/LE_ACME2Tests</directory> </testsuite> </testsuites> </phpunit> vendor/composer/autoload_namespaces.php 0000644 00000000322 15154444756 0014424 0 ustar 00 <?php // autoload_namespaces.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'LE_ACME2' => array($vendorDir . '/fbett/le_acme2/src'), ); vendor/composer/LICENSE 0000644 00000002056 15154444756 0010717 0 ustar 00 Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. vendor/composer/autoload_real.php 0000644 00000003551 15154444756 0013237 0 ustar 00 <?php // autoload_real.php @generated by Composer class ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4 { private static $loader; public static function loadClassLoader($class) { if ('Composer\Autoload\ClassLoader' === $class) { require __DIR__ . '/ClassLoader.php'; } } /** * @return \Composer\Autoload\ClassLoader */ public static function getLoader() { if (null !== self::$loader) { return self::$loader; } require __DIR__ . '/platform_check.php'; spl_autoload_register(array('ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); spl_autoload_unregister(array('ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); return $loader; } } vendor/composer/platform_check.php 0000644 00000001635 15154444756 0013406 0 ustar 00 <?php // platform_check.php @generated by Composer $issues = array(); if (!(PHP_VERSION_ID >= 70100)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } vendor/composer/autoload_static.php 0000644 00000002546 15154444756 0013606 0 ustar 00 <?php // autoload_static.php @generated by Composer namespace Composer\Autoload; class ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4 { public static $prefixLengthsPsr4 = array ( 'P' => array ( 'PleskX\\' => 7, ), ); public static $prefixDirsPsr4 = array ( 'PleskX\\' => array ( 0 => __DIR__ . '/..' . '/plesk/api-php-lib/src', ), ); public static $prefixesPsr0 = array ( 'L' => array ( 'LE_ACME2' => array ( 0 => __DIR__ . '/..' . '/fbett/le_acme2/src', ), ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixesPsr0; $loader->classMap = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$classMap; }, null, ClassLoader::class); } } vendor/composer/installed.php 0000644 00000001650 15154444756 0012401 0 ustar 00 <?php return array ( 'root' => array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13', 'name' => '__root__', ), 'versions' => array ( '__root__' => array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13', ), 'fbett/le_acme2' => array ( 'pretty_version' => '1.5.6', 'version' => '1.5.6.0', 'aliases' => array ( ), 'reference' => '26b2c421764b173326f6bcb0713a86bd614f77fa', ), 'plesk/api-php-lib' => array ( 'pretty_version' => 'v1.0.7', 'version' => '1.0.7.0', 'aliases' => array ( ), 'reference' => '7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605', ), ), ); vendor/composer/autoload_psr4.php 0000644 00000000317 15154444756 0013201 0 ustar 00 <?php // autoload_psr4.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'PleskX\\' => array($vendorDir . '/plesk/api-php-lib/src'), ); vendor/composer/ClassLoader.php 0000644 00000034037 15154444756 0012623 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier <fabien@symfony.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { private $vendorDir; // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; private static $registeredLoaders = array(); public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } vendor/composer/installed.json 0000644 00000007606 15154444756 0012572 0 ustar 00 { "packages": [ { "name": "fbett/le_acme2", "version": "1.5.6", "version_normalized": "1.5.6.0", "source": { "type": "git", "url": "https://github.com/fbett/le-acme2-php.git", "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/fbett/le-acme2-php/zipball/26b2c421764b173326f6bcb0713a86bd614f77fa", "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-openssl": "*", "php": ">=7.3" }, "time": "2021-05-17T07:08:46+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-0": { "LE_ACME2": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabian Bett", "homepage": "https://www.bett-ingenieure.de", "role": "Developer" } ], "description": "Letsencrypt PHP ACME v2 client", "homepage": "https://github.com/fbett/le-acme2-php", "support": { "issues": "https://github.com/fbett/le-acme2-php/issues", "source": "https://github.com/fbett/le-acme2-php/tree/v1.5.6" }, "install-path": "../fbett/le_acme2" }, { "name": "plesk/api-php-lib", "version": "v1.0.7", "version_normalized": "1.0.7.0", "source": { "type": "git", "url": "https://github.com/plesk/api-php-lib.git", "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/plesk/api-php-lib/zipball/7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605", "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605", "shasum": "" }, "require": { "ext-curl": "*", "ext-simplexml": "*", "ext-xml": "*", "php": "^7.3" }, "require-dev": { "phpunit/phpunit": "^9", "spatie/phpunit-watcher": "^1.22" }, "time": "2020-12-24T07:20:26+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "PleskX\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], "authors": [ { "name": "Alexei Yuzhakov", "email": "sibprogrammer@gmail.com" }, { "name": "Plesk International GmbH.", "email": "plesk-dev-leads@plesk.com" } ], "description": "PHP object-oriented library for Plesk XML-RPC API", "support": { "issues": "https://github.com/plesk/api-php-lib/issues", "source": "https://github.com/plesk/api-php-lib/tree/v1.0.7" }, "install-path": "../plesk/api-php-lib" } ], "dev": true, "dev-package-names": [] } vendor/composer/InstalledVersions.php 0000644 00000011632 15154444756 0014073 0 ustar 00 <?php namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; class InstalledVersions { private static $installed = array ( 'root' => array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13', 'name' => '__root__', ), 'versions' => array ( '__root__' => array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13', ), 'fbett/le_acme2' => array ( 'pretty_version' => '1.5.6', 'version' => '1.5.6.0', 'aliases' => array ( ), 'reference' => '26b2c421764b173326f6bcb0713a86bd614f77fa', ), 'plesk/api-php-lib' => array ( 'pretty_version' => 'v1.0.7', 'version' => '1.0.7.0', 'aliases' => array ( ), 'reference' => '7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605', ), ), ); private static $canGetVendors; private static $installedByVendor = array(); public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } public static function isInstalled($packageName) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return true; } } return false; } public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } public static function getRawData() { return self::$installed; } public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; } } } $installed[] = self::$installed; return $installed; } } vendor/composer/autoload_classmap.php 0000644 00000000350 15154444756 0014111 0 ustar 00 <?php // autoload_classmap.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', ); integrations/integrations.php 0000644 00000001276 15154444756 0012516 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); $other_host = rsssl_get_other_host(); if (file_exists( rsssl_le_path . "integrations/$other_host/$other_host.php" )) { require_once( rsssl_le_path . "integrations/$other_host/$other_host.php" ); } if (file_exists( rsssl_le_path . "integrations/$other_host/functions.php" )){ require_once( rsssl_le_path . "integrations/$other_host/functions.php" ); } if ( rsssl_is_cpanel() ) { require_once( rsssl_le_path . 'integrations/cpanel/cpanel.php' ); } else if ( rsssl_is_plesk() ) { require_once( rsssl_le_path . 'integrations/plesk/plesk.php' ); } else if ( rsssl_is_directadmin() ) { require_once( rsssl_le_path . 'integrations/directadmin/directadmin.php' ); } integrations/directadmin/functions.php 0000644 00000002454 15154444756 0014302 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); function rsssl_install_directadmin(){ if (rsssl_is_ready_for('installation')) { $directadmin = new rsssl_directadmin(); $domains = RSSSL_LE()->letsencrypt_handler->get_subjects(); $response = $directadmin->installSSL($domains); if ( $response->status === 'success' ) { update_option('rsssl_le_certificate_installed_by_rsssl', 'directadmin'); } return $response; } else { $status = 'error'; $action = 'stop'; $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } } function rsssl_directadmin_add_condition_actions($steps){ $directadmin = new rsssl_directadmin(); if ( $directadmin->credentials_available() ) { $index = array_search( 'installation', array_column( $steps['lets-encrypt'], 'id' ) ); $index ++; //clear existing array $steps['lets-encrypt'][ $index ]['actions'] = array(); $steps['lets-encrypt'][ $index ]['actions'][] = array( 'description' => __( "Attempting to install certificate...", "really-simple-ssl" ), 'action' => 'rsssl_install_directadmin', 'attempts' => 1, 'speed' => 'normal', ); } return $steps; } add_filter( 'rsssl_steps', 'rsssl_directadmin_add_condition_actions' ); integrations/directadmin/httpsocket.php 0000644 00000023532 15154444756 0014462 0 ustar 00 <?php /** * Socket communication class. * * Originally designed for use with DirectAdmin's API, this class will fill any HTTP socket need. * * Very, very basic usage: * $Socket = new HTTPSocket; * echo $Socket->get('http://user:pass@somesite.com/somedir/some.file?query=string&this=that'); * * @author Phi1 'l0rdphi1' Stier <l0rdphi1@liquenox.net> * @package HTTPSocket * @version 3.0.4 */ class HTTPSocket { var $version = '3.0.4'; /* all vars are private except $error, $query_cache, and $doFollowLocationHeader */ var $method = 'GET'; var $remote_host; var $remote_port; var $remote_uname; var $remote_passwd; var $result; var $result_header; var $result_body; var $result_status_code; var $lastTransferSpeed; var $bind_host; var $error = array(); var $warn = array(); var $query_cache = array(); var $doFollowLocationHeader = TRUE; var $redirectURL; var $max_redirects = 5; var $ssl_setting_message = 'DirectAdmin appears to be using SSL. Change your script to connect to ssl://'; var $extra_headers = array(); var $proxy = false; var $proxy_headers = array(); /** * Create server "connection". * */ function connect($host, $port = '' ) { if (!is_numeric($port)) { $port = 80; } $this->remote_host = $host; $this->remote_port = $port; } function bind( $ip = '' ) { if ( $ip == '' ) { $ip = $_SERVER['SERVER_ADDR']; } $this->bind_host = $ip; } /** * Change the method being used to communicate. * * @param string|null request method. supports GET, POST, and HEAD. default is GET */ function set_method( $method = 'GET' ) { $this->method = strtoupper($method); } /** * Specify a username and password. * * @param string|null username. defualt is null * @param string|null password. defualt is null */ function set_login( $uname = '', $passwd = '' ) { if ( strlen($uname) > 0 ) { $this->remote_uname = $uname; } if ( strlen($passwd) > 0 ) { $this->remote_passwd = $passwd; } } /** * For pass through, this function writes the data in chunks. */ private function stream_chunk($ch, $data) { echo($data); return strlen($data); } private function stream_header($ch, $data) { if (!preg_match('/^HTTP/i', $data)) { header($data); } return strlen($data); } /** * Query the server * * @param string containing properly formatted server API. See DA API docs and examples. Http:// URLs O.K. too. * @param string|array query to pass to url * @param int if connection KB/s drops below value here, will drop connection */ function query( $request, $content = '', $doSpeedCheck = 0 ) { $this->error = $this->warn = array(); $this->result_status_code = NULL; $is_ssl = FALSE; // is our request a http:// ... ? if (preg_match('!^http://!i',$request) || preg_match('!^https://!i',$request)) { $location = parse_url($request); if (preg_match('!^https://!i',$request)) { $this->connect('https://'.$location['host'],$location['port']); } else $this->connect('http://'.$location['host'],$location['port']); $this->set_login($location['user'],$location['pass']); $request = $location['path']; $content = $location['query']; if ( strlen($request) < 1 ) { $request = '/'; } } if (preg_match('!^ssl://!i', $this->remote_host)) $this->remote_host = 'https://'.substr($this->remote_host, 6); if (preg_match('!^tcp://!i', $this->remote_host)) $this->remote_host = 'http://'.substr($this->remote_host, 6); if (preg_match('!^https://!i', $this->remote_host)) $is_ssl = TRUE; $array_headers = array( 'Host' => ( $this->remote_port == 80 ? $this->remote_host : "$this->remote_host:$this->remote_port" ), 'Accept' => '*/*', 'Connection' => 'Close' ); foreach ( $this->extra_headers as $key => $value ) { $array_headers[$key] = $value; } $this->result = $this->result_header = $this->result_body = ''; // was content sent as an array? if so, turn it into a string if (is_array($content)) { $pairs = array(); foreach ( $content as $key => $value ) { $pairs[] = "$key=".urlencode($value); } $content = join('&',$pairs); unset($pairs); } $OK = TRUE; if ($this->method == 'GET' && isset($content) && $content != '') $request .= '?'.$content; $ch = curl_init($this->remote_host.':'.$this->remote_port.$request); if ($is_ssl) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //1 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //2 //curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); } curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_USERAGENT, "HTTPSocket/$this->version"); curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_HEADER, 1); if ($this->proxy) { curl_setopt($ch, CURLOPT_RETURNTRANSFER,false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLINFO_HEADER_OUT, false); curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); // 8192 curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($this, "stream_chunk")); curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, "stream_header")); } curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 512); curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 120); // instance connection if ($this->bind_host) { curl_setopt($ch, CURLOPT_INTERFACE, $this->bind_host); } // if we have a username and password, add the header if ( isset($this->remote_uname) && isset($this->remote_passwd) ) { curl_setopt($ch, CURLOPT_USERPWD, $this->remote_uname.':'.$this->remote_passwd); } // for DA skins: if $this->remote_passwd is NULL, try to use the login key system if ( isset($this->remote_uname) && $this->remote_passwd == NULL ) { curl_setopt($ch, CURLOPT_COOKIE, "session={$_SERVER['SESSION_ID']}; key={$_SERVER['SESSION_KEY']}"); } // if method is POST, add content length & type headers if ( $this->method == 'POST' ) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $content); //$array_headers['Content-type'] = 'application/x-www-form-urlencoded'; $array_headers['Content-length'] = strlen($content); } curl_setopt($ch, CURLOPT_HTTPHEADER, $array_headers); if( !($this->result = curl_exec($ch)) ) { $this->error[] .= curl_error($ch); $OK = FALSE; } $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $this->result_header = substr($this->result, 0, $header_size); $this->result_body = substr($this->result, $header_size); $this->result_status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $this->lastTransferSpeed = curl_getinfo($ch, CURLINFO_SPEED_DOWNLOAD) / 1024; curl_close($ch); $this->query_cache[] = $this->remote_host.':'.$this->remote_port.$request; $headers = $this->fetch_header(); // did we get the full file? if ( !empty($headers['content-length']) && $headers['content-length'] != strlen($this->result_body) ) { $this->result_status_code = 206; } // now, if we're being passed a location header, should we follow it? if ($this->doFollowLocationHeader) { //dont bother if we didn't even setup the script correctly if (isset($headers['x-use-https']) && $headers['x-use-https']=='yes') die($this->ssl_setting_message); if (isset($headers['location'])) { if ($this->max_redirects <= 0) die("Too many redirects on: ".$headers['location']); $this->max_redirects--; $this->redirectURL = $headers['location']; $this->query($headers['location']); } } } function getTransferSpeed() { return $this->lastTransferSpeed; } /** * The quick way to get a URL's content :) * * @param string URL * @param boolean return as array? (like PHP's file() command) * @return string result body */ function get($location, $asArray = FALSE ) { $this->query($location); if ( $this->get_status_code() == 200 ) { if ($asArray) { return preg_split("/\n/",$this->fetch_body()); } return $this->fetch_body(); } return FALSE; } /** * Returns the last status code. * 200 = OK; * 403 = FORBIDDEN; * etc. * * @return int status code */ function get_status_code() { return $this->result_status_code; } /** * Adds a header, sent with the next query. * * @param string header name * @param string header value */ function add_header($key,$value) { $this->extra_headers[$key] = $value; } /** * Clears any extra headers. * */ function clear_headers() { $this->extra_headers = array(); } /** * Return the result of a query. * * @return string result */ function fetch_result() { return $this->result; } /** * Return the header of result (stuff before body). * * @param string (optional) header to return * @return array result header */ function fetch_header( $header = '' ) { if ($this->proxy) return $this->proxy_headers; $array_headers = preg_split("/\r\n/",$this->result_header); $array_return = array( 0 => $array_headers[0] ); unset($array_headers[0]); foreach ( $array_headers as $pair ) { if ($pair == '' || $pair == "\r\n") continue; list($key,$value) = preg_split("/: /",$pair,2); $array_return[strtolower($key)] = $value; } if ( $header != '' ) { return $array_return[strtolower($header)]; } return $array_return; } /** * Return the body of result (stuff after header). * * @return string result body */ function fetch_body() { return $this->result_body; } /** * Return parsed body in array format. * * @return array result parsed */ function fetch_parsed_body() { parse_str($this->result_body,$x); return $x; } /** * Set a specifc message on how to change the SSL setting, in the event that it's not set correctly. */ function set_ssl_setting_message($str) { $this->ssl_setting_message = $str; } } integrations/directadmin/directadmin.php 0000644 00000010076 15154444756 0014554 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); /** * @package DirectAdmin * @author Rogier Lankhorst * @copyright Copyright (C) 2021, Rogier Lankhorst * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3 * @link https://really-simple-ssl.com * @since Class available since Release 5.0.0 * */ require_once( rsssl_le_path . 'integrations/directadmin/httpsocket.php' ); require_once( rsssl_le_path . 'integrations/directadmin/functions.php' ); class rsssl_directadmin { public $host; private $login; private $password; public $ssl_installation_url; /** * Initiates the directadmin class. * */ public function __construct() { $password = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value( 'directadmin_password' ) ); $host = rsssl_get_value( 'directadmin_host' ); $this->host = str_replace( array( 'http://', 'https://', ':2222' ), '', $host ); $this->login = rsssl_get_value( 'directadmin_username' ); $this->password = $password; $this->ssl_installation_url = 'https://' . $this->host . ""; } /** * Check if all creds are available * @return bool */ public function credentials_available(){ if (!empty($this->host) && !empty($this->password) && !empty($this->login)) { return true; } return false; } public function installSSL( $domains ) { $response = false; if ( is_array($domains) && count($domains)>0 ) { foreach( $domains as $domain ) { $response_item = $this->installSSLPerDomain($domain); //set on first iteration if ( !$response ) { $response = $response_item; } //override if not successfull, to always get the error. if ( $response->status !== 'success' ) { $response = $response_item; } } } if ( !$response ) { $response = new RSSSL_RESPONSE('error', 'stop', __("No valid list of domains.", "really-simple-ssl")); } return $response; } /** * Install certificate * * @param string $domain * * @return RSSSL_RESPONSE */ public function installSSLPerDomain( $domain ) { $key_file = get_option( 'rsssl_private_key_path' ); $cert_file = get_option( 'rsssl_certificate_path' ); $cabundle_file = get_option( 'rsssl_intermediate_path' ); try { $server_ssl=true; $server_port=2222; $sock = new HTTPSocket; if ($server_ssl){ $sock->connect("ssl://".$this->host, $server_port); } else { $sock->connect($this->host, $server_port); } $sock->set_login($this->login, $this->password); $sock->method = "POST"; $sock->query('/CMD_API_SSL', array( 'domain' => $domain, 'action' => 'save', 'type' => 'paste', 'certificate' => file_get_contents( $key_file ) . file_get_contents( $cert_file ) )); $response = $sock->fetch_parsed_body(); error_log( print_r( $response, true ) ); //set a default error response $status = 'warning'; $action = 'continue'; $message = rsssl_get_manual_instructions_text($this->ssl_installation_url); //if successful, proceed to next step if ( empty($response['details']) && stripos($response[0], 'Error' ) ) { $sock->query('/CMD_SSL', array( 'domain' => $domain, 'action' => 'save', 'type' => 'cacert', 'active' => 'yes', 'cacert' => file_get_contents( $cabundle_file ) )); $response = $sock->fetch_parsed_body(); error_log( print_r( $response, true ) ); if ( empty($response['details']) && stripos($response[0], 'Error' ) ) { $status = 'success'; $action = 'finalize'; $message = sprintf(__("SSL successfully installed on %s","really-simple-ssl"), $domain); update_option( 'rsssl_le_certificate_installed_by_rsssl', 'directadmin' ); delete_option( 'rsssl_installation_error' ); } } } catch ( Exception $e ) { error_log( print_r( $e, true ) ); update_option( 'rsssl_installation_error', 'directadmin' ); $status = 'warning'; $action = 'continue'; $message = $e->getMessage(); } return new RSSSL_RESPONSE( $status, $action, $message ); } } integrations/cloudways/cloudways.php 0000644 00000020522 15154444756 0014027 0 ustar 00 <?php /** * @package CloudWays * @author Rogier Lankhorst * @copyright Copyright (C) 2021, Rogier Lankhorst * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3 * @link https://really-simple-ssl.com * @since Class available since Release 5.0.0 * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * */ class rsssl_Cloudways { private $email; private $api_key; public $ssl_installation_url; /** * Initiates the cloudways class. * * @param string $email * @param string $api_key */ public function __construct( ) { $this->email = rsssl_get_value('cloudways_user_email'); $this->api_key = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value('cloudways_api_key') ); $this->ssl_installation_url = ""; } /** * * @param string $method GET|POST|PUT|DELETE * @param string $url relative URL for the call * @param string $accessToken Access token generated using OAuth Call * @param array $post Optional post data for the call * * @return RSSSL_RESPONSE */ private function callCloudwaysAPI( $method, $url, $accessToken, $post = [] ) { $baseURL = 'https://api.cloudways.com/api/v1/'; try { $ch = curl_init(); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, $method ); curl_setopt( $ch, CURLOPT_URL, $baseURL . $url ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); if ( $accessToken ) { curl_setopt( $ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $accessToken ] ); } //ssl_domains[]=fungibleownership.com&ssl_domains[]=www.fungibleownership.com $encoded = ''; if ( count( $post ) ) { foreach ( $post as $name => $value ) { if ( is_array( $value) ) { foreach ( $value as $sub_value ) { $encoded .= $name.'[]='.urlencode( $sub_value) . '&'; } } else { $encoded .= urlencode( $name ) . '=' . urlencode( $value ) . '&'; } } $encoded = substr( $encoded, 0, strlen( $encoded ) - 1 ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $encoded ); curl_setopt( $ch, CURLOPT_POST, 1 ); } $output = curl_exec( $ch ); $httpcode = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); if ($output && isset($output->error_description)) { return new RSSSL_RESPONSE( 'error', 'stop', $output->error_description, false ); } else if ($httpcode != '200' && $output && isset($output->message) ){ return new RSSSL_RESPONSE( 'error', 'stop', $output->message ); } else if ( $httpcode != '200' ) { $message = $httpcode . ' output: ' . substr( $output, 0, 10000 ); error_log(print_r($message, true)); return new RSSSL_RESPONSE( 'error', 'stop', $message ); } curl_close( $ch ); return new RSSSL_RESPONSE( 'success', 'continue', '', json_decode( $output ) ); } catch(Exception $e) { error_log(print_r($e,true)); return new RSSSL_RESPONSE( 'error', 'stop', $e->getMessage() ); } } /** * Get an access token * @return RSSSL_RESPONSE */ private function getAccessToken() { error_log("try retrieving access token"); $accessToken = get_transient('rsssl_cw_t'); if (!$accessToken) { error_log("not found, get new"); $response = $this->callCloudwaysAPI( 'POST', '/oauth/access_token', null, [ 'email' => $this->email, 'api_key' => $this->api_key ] ); error_log("api call output"); error_log(print_r($response, true)); if ($response->status === 'success' ) { $accessToken = $response->output->access_token; set_transient('rsssl_cw_t', $accessToken, 1800); } else { return new RSSSL_RESPONSE( 'error', 'stop', $response->message ); } } return new RSSSL_RESPONSE( 'success', 'continue','', $accessToken ); } /** * @param array $domains * * @return RSSSL_RESPONSE */ public function installSSL($domains){ error_log("starting installation"); $response = $this->getAccessToken(); if ( $response->status !== 'success' ) { return new RSSSL_RESPONSE('error','stop',$response->message); } $accessToken = $response->output; $response = $this->getServerInfo(); if ($response->status === 'success' ) { $server_id = get_transient('rsssl_cw_server_id' ); $app_id = get_transient('rsssl_cw_app_id'); $args = [ 'server_id' => $server_id, 'app_id' => $app_id, 'ssl_email' => $this->email, 'wild_card' => RSSSL_LE()->letsencrypt_handler->is_wildcard(), 'ssl_domains' => $domains, ]; $response = $this->callCloudWaysAPI( 'POST', 'security/lets_encrypt_install', $accessToken, $args ); } return $response; } /** * * @return RSSSL_RESPONSE */ public function enableAutoRenew(){ $response = $this->getAccessToken(); if ( $response->status !== 'success' ) { return new RSSSL_RESPONSE('error','stop', __("Failed retrieving access token","really-simple-ssl")); } $accessToken = $response->output; $response = $this->getServerInfo(); if ($response->status === 'success' ) { $app_id = get_transient('rsssl_cw_app_id'); $server_id = get_transient('rsssl_cw_server_id' ); $response = $this->callCloudWaysAPI( 'POST', 'security/lets_encrypt_auto', $accessToken, [ 'server_id' => $server_id, 'app_id' => $app_id, 'auto' => true, ] ); } if ( $response->status === 'success' ) { $status = 'success'; $action = 'continue'; $message = __("Successfully installed Let's Encrypt","really-simple-ssl"); } elseif ($response->status === 'error') { //in some cases, the process is already started, which also signifies success. if ( strpos($response->message, 'An operation is already in progress for this server')) { $status = 'success'; $action = 'continue'; $message = __("Successfully installed Let's Encrypt","really-simple-ssl"); } else { $status = $response->status; $action = $response->action; $message = $response->message; } } else { $status = $response->status; $action = $response->action; $message = __("Error enabling auto renew for Let's Encrypt","really-simple-ssl"); } return new RSSSL_RESPONSE( $status, $action, $message ); } /** * Get the server id and app id * * @return RSSSL_RESPONSE */ public function getServerInfo(){ if ( get_transient('rsssl_cw_app_id') && get_transient('rsssl_cw_server_id' ) ) { $status = 'success'; $action = 'continue'; $message = __("Successfully retrieved server id and app id","really-simple-ssl"); return new RSSSL_RESPONSE( $status, $action, $message ); } $response = $this->getAccessToken(); if ( $response->status !== 'success' ) { return new RSSSL_RESPONSE('error','stop', $response->message); } $accessToken = $response->output; $response = $this->callCloudwaysAPI('GET', '/server', $accessToken ); $success = false; if ($response->status === 'success') { $serverList = $response->output; $servers = $serverList->servers; error_log(print_r($servers, true)); foreach ($servers as $server ){ $apps = $server->apps; foreach ($apps as $app ){ $app_domain = $app->cname; error_log("app domain ".$app_domain); $this_site_domain = str_replace(array('https://', 'http://', 'www.'), '',site_url()); if (strpos($app_domain, $this_site_domain) !== false ) { $success = true; set_transient('rsssl_cw_app_id', $app->id, WEEK_IN_SECONDS); set_transient('rsssl_cw_server_id', $server->id, WEEK_IN_SECONDS); break 2; } } } } if ( $success ) { $status = 'success'; $action = 'continue'; $message = __("Successfully retrieved server id and app id","really-simple-ssl"); } else { $status = 'error'; $action = 'stop'; if ( isset($serverList->error_description) ) { $message = $serverList->error_description; } else { $message = __("Could not retrieve server list","really-simple-ssl"); } } return new RSSSL_RESPONSE( $status, $action, $message ); } } integrations/cloudways/functions.php 0000644 00000004205 15154444756 0014025 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); function rsssl_cloudways_server_data(){ require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' ); $cloudways = new rsssl_Cloudways(); return $cloudways->getServerInfo(); } function rsssl_cloudways_install_ssl(){ if (rsssl_is_ready_for('installation')) { require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' ); $domains = RSSSL_LE()->letsencrypt_handler->get_subjects(); $cloudways = new rsssl_Cloudways(); $response = $cloudways->installSSL($domains); if ($response->status === 'success') { update_option('rsssl_le_certificate_installed_by_rsssl', 'cloudways'); } return $response; } else { $status = 'error'; $action = 'stop'; $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } } function rsssl_cloudways_auto_renew(){ require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' ); $cloudways = new rsssl_Cloudways(); return $cloudways->enableAutoRenew(); } function rsssl_cloudways_add_condition_actions($steps){ $index = array_search('installation',array_column($steps['lets-encrypt'],'id')); $index++; $steps['lets-encrypt'][$index]['actions'] = array( array( 'description' => __("Retrieving Cloudways server data...", "really-simple-ssl"), 'action'=> 'rsssl_cloudways_server_data', 'attempts' => 5, 'speed' => 'normal', ), array( 'description' => __("Installing SSL certificate...", "really-simple-ssl"), 'action'=> 'rsssl_cloudways_install_ssl', 'attempts' => 5, 'speed' => 'normal', ), array( 'description' => __("Enabling auto renew...", "really-simple-ssl"), 'action'=> 'rsssl_cloudways_auto_renew', 'attempts' => 5, 'speed' => 'normal', ), ); return $steps; } add_filter( 'rsssl_steps', 'rsssl_cloudways_add_condition_actions' ); /** * Drop store credentials field * @param $fields * * @return mixed */ function rsssl_cloudways_fields($fields){ unset($fields['store_credentials']); return $fields; } add_filter( 'rsssl_fields_load_types', 'rsssl_cloudways_fields' ); integrations/plesk/plesk.php 0000644 00000006002 15154444756 0012234 0 ustar 00 <?php /** * @package PLESK * @author Rogier Lankhorst * @copyright Copyright (C) 2021, Rogier Lankhorst * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3 * @link https://really-simple-ssl.com * @since Class available since Release 5.0.0 * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * */ use PleskX\Api\Client; require_once rsssl_le_path . 'vendor/autoload.php'; require_once( rsssl_le_path . 'integrations/plesk/functions.php' ); class rsssl_plesk { public $host; private $login; private $password; public $ssl_installation_url; /** * Initiates the Plesk class. * */ public function __construct() { $password = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value('plesk_password') ); $host = rsssl_get_value('plesk_host'); $this->host = str_replace(array('http://', 'https://', ':8443'), '', $host); $this->login = rsssl_get_value('plesk_username'); $this->password = $password; $this->ssl_installation_url = 'https://'.$this->host.":8443/smb/ssl-certificate/list/id/21"; } /** * Check if all creds are available * @return bool */ public function credentials_available(){ if (!empty($this->host) && !empty($this->password) && !empty($this->login)) { return true; } return false; } /** * Install certificate * @param $domains * * @return RSSSL_RESPONSE */ public function installSSL($domains){ $key_file = get_option('rsssl_private_key_path'); $cert_file = get_option('rsssl_certificate_path'); $cabundle_file = get_option('rsssl_intermediate_path'); try { $client = new Client($this->host); $client->setCredentials($this->login, $this->password); $response = $client->certificate()->install($domains, [ 'csr' => '', 'pvt' => file_get_contents($key_file), 'cert' => file_get_contents($cert_file), 'ca' => file_get_contents($cabundle_file), ]); error_log(print_r($response,true)); update_option('rsssl_le_certificate_installed_by_rsssl', 'plesk'); delete_option('rsssl_installation_error' ); $status = 'success'; $action = 'continue'; $message = __('Successfully installed SSL',"really-simple-ssl"); } catch(Exception $e) { error_log(print_r($e,true)); update_option('rsssl_installation_error', 'plesk'); $status = 'warning'; $action = 'continue'; $message = $e->getMessage(); } return new RSSSL_RESPONSE($status, $action, $message); } } integrations/plesk/functions.php 0000644 00000002502 15154444756 0013127 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); function rsssl_plesk_install(){ if (rsssl_is_ready_for('installation')) { $cpanel = new rsssl_plesk(); $domains = RSSSL_LE()->letsencrypt_handler->get_subjects(); $response = $cpanel->installSSL($domains); if ( $response->status === 'success' ) { update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default'); } return $response; } else { $status = 'error'; $action = 'stop'; $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } } /** * Add the step to install SSL using Plesk * @param $steps * * @return mixed */ function rsssl_plesk_add_installation_step($steps){ $plesk = new rsssl_plesk(); if ( $plesk->credentials_available() ) { $index = array_search( 'installation', array_column( $steps['lets-encrypt'], 'id' ) ); $index ++; $steps['lets-encrypt'][ $index ]['actions'] = array_merge(array( array( 'description' => __("Installing SSL certificate using PLESK API...", "really-simple-ssl"), 'action'=> 'rsssl_plesk_install', 'attempts' => 1, 'speed' => 'normal', ) ) , $steps['lets-encrypt'][ $index ]['actions'] ); } return $steps; } add_filter( 'rsssl_steps', 'rsssl_plesk_add_installation_step' ); integrations/hostgator/hostgator.php 0000644 00000000250 15154444756 0014023 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); /** * On hostgator, we don't have the cpanel api, so remove these steps. * This is managed in the config, in the hosts array */ integrations/cpanel/cpanel.php 0000644 00000023413 15154444756 0012511 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); require_once( rsssl_le_path . 'integrations/cpanel/functions.php' ); /** * Completely rebuilt and improved on the FreeSSL.tech Auto CPanel class by Anindya Sundar Mandal */ class rsssl_cPanel { public $host; private $username; private $password; public $ssl_installation_url; /** * Initiates the cPanel class. */ public function __construct() { $username = rsssl_get_value('cpanel_username'); $password = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value('cpanel_password') ); $host = rsssl_get_value('cpanel_host'); $this->host = str_replace( array('http://', 'https://', ':2083',':'), '', $host ); $this->username = $username; $this->password = $password; $this->ssl_installation_url = 'https://'.$this->host.":2083/frontend/paper_lantern/ssl/install.html"; } /** * Check if all creds are available * @return bool */ public function credentials_available(){ if (!empty($this->host) && !empty($this->password) && !empty($this->username)) { return true; } return false; } /** * Install SSL for all passed domains * @param array $domains * * @return RSSSL_RESPONSE */ public function installSSL($domains) { $response = false; if ( is_array($domains) && count($domains)>0 ) { foreach( $domains as $domain ) { $response_item = $this->installSSLPerDomain($domain); //set on first iteration if ( !$response ) { $response = $response_item; } //override if not successfull, to always get the error. if ( $response->status !== 'success' ) { $response = $response_item; } } } if ( !$response ) { $response = new RSSSL_RESPONSE('error', 'stop', __("No valid list of domains.", "really-simple-ssl")); } if ( $response->status === 'success' ) { update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default'); } return $response; } /** * Install an SSL certificate on the domain provided - using cPanel UAPI. * * @param string $domain * * @return RSSSL_RESPONSE */ public function installSSLPerDomain($domain) { $shell_addon_active = defined('rsssl_shell_path'); $key_file = get_option('rsssl_private_key_path'); $cert_file = get_option('rsssl_certificate_path'); $cabundle_file = get_option('rsssl_intermediate_path'); $request_uri = 'https://'.$this->host.':2083/execute/SSL/install_ssl'; $payload = [ 'domain' => $domain, 'cert' => file_get_contents($cert_file), 'key' => file_get_contents($key_file), 'cabundle' => file_get_contents($cabundle_file), ]; $response = $this->connectUapi($request_uri, $payload); //Validate $response if (empty($response)) { error_log('Not able to login'); update_option('rsssl_installation_error', 'cpanel:default'); $status = 'warning'; $action = $shell_addon_active ? 'skip' : 'continue'; $message = rsssl_get_manual_instructions_text($this->ssl_installation_url); } else if ($response->status) { delete_option('rsssl_installation_error' ); error_log('SSL successfully installed on '.$domain.' successfully.'); $status = 'success'; $action = 'continue'; $message = sprintf(__("SSL successfully installed on %s","really-simple-ssl"), $domain); } else { update_option('rsssl_installation_error', 'cpanel:default'); error_log($response->errors[0]); $status = 'error'; $action = $shell_addon_active ? 'skip' : 'continue'; $message = __("Errors were reported during installation","really-simple-ssl").'<br> '.$response->errors[0]; } return new RSSSL_RESPONSE($status, $action, $message); } /** * @param $domains * * @return RSSSL_RESPONSE */ public function enableAutoSSL($domains){ $domains = implode(',', $domains); $request_uri = 'https://'.$this->host.':2083/execute/SSL/remove_autossl_excluded_domains'; $payload = [ 'domains' => $domains, ]; $response = $this->connectUapi($request_uri, $payload); //Validate $response if (empty($response)) { update_option('rsssl_installation_error', 'cpanel:autossl'); error_log('The install_ssl cURL call did not return valid JSON'); $status = 'error'; $action = 'skip'; $message = rsssl_get_manual_instructions_text($this->ssl_installation_url); } else if ($response->status) { delete_option('rsssl_installation_error'); error_log('Congrats! SSL installed on '.$domains.' successfully.'); $status = 'success'; $action = 'finalize'; $message = __("SSL successfully installed on $domains","really-simple-ssl"); } else { update_option('rsssl_installation_error', 'cpanel:autossl'); error_log('The auto SSL cURL call returned valid JSON, but reported errors:'); error_log($response->errors[0]); $status = 'error'; $action = 'skip';//we try the default next $message = __("Errors were reported during installation.","really-simple-ssl").'<br> '.$response->errors[0]; } return new RSSSL_RESPONSE($status, $action, $message); } /** * Connect to the cPanel using UAPI. * * @param string $request_uri * @param null|array $payload * * @return mixed */ public function connectUapi($request_uri, $payload = null) { // Set up the cURL request object. $ch = curl_init($request_uri); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, $this->username.':'.$this->password); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_BUFFERSIZE, 131072); if (null !== $payload) { // Set up a POST request with the payload. curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Make the call, and then terminate the cURL caller object. $curl_response = curl_exec($ch); error_log(print_r($curl_response, true)); curl_close($ch); // Decode and return output. return json_decode($curl_response); } /** * Set DNS TXT record using Json API through cPanel XMLAPI. * * @param string $domain * @param string $value * * @return RSSSL_RESPONSE */ public function set_txt_record($domain, $value) { $args = [ 'domain' => $domain, 'name' => '_acme-challenge', 'type' => 'TXT', 'txtdata' => $value, 'ttl' => '600', 'class' => 'IN', 'cpanel_jsonapi_user' => $this->username, 'cpanel_jsonapi_module' => 'ZoneEdit', 'cpanel_jsonapi_func' => 'add_zone_record', 'cpanel_jsonapi_apiversion' => '2', ]; $args = http_build_query($args, '', '&'); $url = 'https://'.$this->host.':2083/json-api/cpanel'; $authstr = 'Authorization: Basic '.base64_encode($this->username.':'.$this->password)."\r\n"; $curl = curl_init(); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_BUFFERSIZE, 131072); $header[0] = $authstr. "Content-Type: application/x-www-form-urlencoded\r\n". 'Content-Length: '.\strlen($args)."\r\n"."\r\n".$args; curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_POST, 1); $response = curl_exec($curl); curl_close($curl); if (false === $response) { return new RSSSL_RESPONSE('error', 'stop', __("Unable to connect to cPanel", "really-simple-ssl").' '.curl_error($curl)); } if (true === stristr($response, '<html>')) { return new RSSSL_RESPONSE('error', 'stop', __("Login credentials incorrect", "really-simple-ssl")); } $response_array = json_decode($response, true); if ( isset($response_array['cpanelresult']['data'][0]['result']['status']) ) { if ($response_array['cpanelresult']['data'][0]['result']['status']) { $status = 'success'; $action = 'continue'; $message = __("Successfully added TXT record.","really-simple-ssl"); } else { $status = 'warning'; $action = 'continue'; $message = __("Could not automatically add TXT record. Please proceed manually, following the steps below.","really-simple-ssl"); if (isset($response_array['cpanelresult']['data'][0]['result']['statusmsg'])) { $message .= '<br>'.$response_array['cpanelresult']['data'][0]['result']['statusmsg']; } } return new RSSSL_RESPONSE($status, $action, $message); } $event_result = (bool) $response_array['cpanelresult']['event']['result']; $preevent_result = isset($response_array['cpanelresult']['preevent']) ? (bool) $response_array['cpanelresult']['preevent']['result'] : true; //Some cPanel doesn't provide this key. In that case, ignore it by setting 'true'. $postevent_result = isset($response_array['cpanelresult']['postevent']) ? (bool) $response_array['cpanelresult']['postevent']['result'] : true; //Some cPanel doesn't provide this key. In that case, ignore it by setting 'true'. if ($event_result && $preevent_result && $postevent_result) { $status = 'success'; $action = 'continue'; $message = __("Successfully added TXT record.","really-simple-ssl"); } else { error_log(print_r($response_array, true)); $status = 'warning'; $action = 'continue'; $message = __("Could not automatically add TXT record. Please proceed manually, following the steps below.","really-simple-ssl"); } return new RSSSL_RESPONSE($status, $action, $message); } } integrations/cpanel/functions.php 0000644 00000007231 15154444756 0013257 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); function rsssl_install_cpanel_autossl(){ if (rsssl_is_ready_for('installation')) { $cpanel = new rsssl_cPanel(); $domains = RSSSL_LE()->letsencrypt_handler->get_subjects(); $response = $cpanel->enableAutoSSL($domains); if ( $response->status === 'success' ) { update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:autossl'); } return $response; } else { $status = 'error'; $action = 'stop'; $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } } function rsssl_install_cpanel_default(){ if (rsssl_is_ready_for('installation')) { $cpanel = new rsssl_cPanel(); $domains = RSSSL_LE()->letsencrypt_handler->get_subjects(); $response = $cpanel->installSSL($domains); if ( $response->status === 'success' ) { update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default'); } return $response; } else { $status = 'error'; $action = 'stop'; $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } } function rsssl_cpanel_set_txt_record(){ if ( rsssl_is_ready_for('dns-verification') ) { $cpanel = new rsssl_cPanel(); $tokens = get_option('rsssl_le_dns_tokens'); if ( !$tokens) { $status = 'error'; $action = 'stop'; $message = __('Token not generated. Please complete the previous step.',"really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } foreach ($tokens as $domain => $token){ if (strpos($domain, '*') !== false) continue; $response = $cpanel->set_txt_record($domain, $token); } if ( $response->status === 'success' ) { update_option('rsssl_le_dns_configured_by_rsssl', true); } return $response; } else { $status = 'error'; $action = 'stop'; $message = __("The system is not ready for the DNS verification yet. Please run the wizard again.", "really-simple-ssl"); return new RSSSL_RESPONSE($status, $action, $message); } } function rsssl_cpanel_add_condition_actions($steps){ $cpanel = new rsssl_cPanel(); if ( $cpanel->credentials_available() ) { //this defaults to true, if not known. $auto_ssl = RSSSL_LE()->config->host_api_supported( 'cpanel:autossl' ); $default_ssl = RSSSL_LE()->config->host_api_supported( 'cpanel:default' ); $installation_index = array_search( 'installation', array_column( $steps['lets-encrypt'], 'id' ) ); $dns_index = array_search( 'dns-verification', array_column( $steps['lets-encrypt'], 'id' ) ); $installation_index ++; $dns_index ++; //clear existing array if ($auto_ssl || $default_ssl ) $steps['lets-encrypt'][ $installation_index ]['actions'] = array(); if ( $auto_ssl ) { $steps['lets-encrypt'][ $installation_index ]['actions'][] = array( 'description' => __( "Attempting to install certificate using AutoSSL...", "really-simple-ssl" ), 'action' => 'rsssl_install_cpanel_autossl', 'attempts' => 1, ); } if ( $default_ssl ) { $steps['lets-encrypt'][ $dns_index ]['actions'][] = array( 'description' => __( "Attempting to set DNS txt record...", "really-simple-ssl" ), 'action' => 'rsssl_cpanel_set_txt_record', 'attempts' => 1, ); $steps['lets-encrypt'][ $installation_index ]['actions'][] = array( 'description' => __( "Attempting to install certificate...", "really-simple-ssl" ), 'action' => 'rsssl_install_cpanel_default', 'attempts' => 1, ); } } return $steps; } add_filter( 'rsssl_steps', 'rsssl_cpanel_add_condition_actions' ); wizard/class-wizard.php 0000644 00000123735 15154444756 0011212 0 ustar 00 <?php defined( 'ABSPATH' ) or die( "you do not have access to this page!" ); if ( ! class_exists( "rsssl_wizard" ) ) { class rsssl_wizard{ private static $_this; public $position; public $total_steps = false; public $last_section; public $page_url; public $percentage_complete = false; function __construct() { if ( isset( self::$_this ) ) { wp_die( sprintf( '%s is a singleton class and you cannot create a second instance.', get_class( $this ) ) ); } self::$_this = $this; add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); add_action( 'show_tab_letsencrypt', array($this, 'wizard') ); add_action( 'rsssl_le_installation_step', array( $this, 'installation_progress' ), 10 ); add_action( 'wp_ajax_rsssl_installation_progress', array($this, 'get_installation_progress')); add_action( 'rsssl_after_save_lets-encrypt_option', array( $this, 'after_save_wizard_option' ), 10, 4 ); add_action( 'plugins_loaded', array( $this, 'catch_settings_switches' ), 10 ); //add_filter( 'rsssl_fields_load_types', array( $this, 'maybe_drop_directories_step' ) ); add_filter( 'rsssl_steps', array($this, 'adjust_for_dns_actions') ); add_filter( 'rsssl_steps', array($this, 'maybe_add_multisite_test') ); } static function this() { return self::$_this; } /** * Change the steps in the generation page if DNS verification is enabled * @param $steps * * @return mixed */ public function adjust_for_dns_actions($steps){ $use_dns = rsssl_dns_verification_required(); if ($use_dns) { $index_directories = array_search( 'directories', array_column( $steps['lets-encrypt'], 'id' ) ); $index_directories ++; $challenge_key = array_search( 'check_challenge_directory', array_column( $steps['lets-encrypt'][ $index_directories ]['actions'], 'action' ) ); $challenge_reachable_key = array_search( 'challenge_directory_reachable', array_column( $steps['lets-encrypt'][ $index_directories ]['actions'], 'action' ) ); unset( $steps['lets-encrypt'][ $index_directories ]['actions'][$challenge_key] ); unset( $steps['lets-encrypt'][ $index_directories ]['actions'][$challenge_reachable_key] ); $index = array_search( 'generation', array_column( $steps['lets-encrypt'], 'id' ) ); $index ++; $steps['lets-encrypt'][ $index ]['actions'] = array ( array( 'description' => __("Verifying DNS records...", "really-simple-ssl"), 'action'=> 'verify_dns', 'attempts' => 2, 'speed' => 'slow', ), array( 'description' => __("Generating SSL certificate...", "really-simple-ssl"), 'action'=> 'create_bundle_or_renew', 'attempts' => 4, 'speed' => 'slow', ) ); } return $steps; } /** * In case of multisite, we add a step to test for subdomains * @param $steps * * @return mixed */ public function maybe_add_multisite_test($steps){ if (is_multisite() ) { $index = array_search( 'system-status', array_column( $steps['lets-encrypt'], 'id' ) ); $index ++; $steps['lets-encrypt'][ $index ]['actions'] = array_merge( array( array( 'description' => __("Checking for subdomain setup...", "really-simple-ssl"), 'action'=> 'is_subdomain_setup', 'attempts' => 1, 'speed' => 'normal', ) ) , $steps['lets-encrypt'][ $index ]['actions']); } return $steps; } public function catch_settings_switches(){ if ( !rsssl_user_can_manage() ) { return; } /* * reset all option */ if (isset($_GET['reset-letsencrypt'])) { RSSSL_LE()->letsencrypt_handler->clear_order(); delete_option('rsssl_verification_type'); delete_option('rsssl_skip_dns_check' ); delete_option('rsssl_skip_challenge_directory_request' ); delete_option('rsssl_force_plesk' ); delete_option('rsssl_force_cpanel' ); delete_option('rsssl_create_folders_in_root'); delete_option('rsssl_hosting_dashboard'); wp_redirect(rsssl_letsencrypt_wizard_url().'&step=1'); RSSSL_LE()->letsencrypt_handler->clear_keys_directory(); exit; } if (isset($_POST['rsssl-switch-to-dns'])) { update_option('rsssl_verification_type', 'DNS'); $step = $this->step(); rsssl_progress_add('directories'); //if we're in step directories, skip to DNS step if ( $step == 3) { wp_redirect(rsssl_letsencrypt_wizard_url().'&step=4'); exit; } } if (isset($_POST['rsssl-switch-to-directory'])) { delete_option('rsssl_verification_type' ); } if (isset($_POST['rsssl-skip-dns-check'])) { update_option('rsssl_skip_dns_check', true); } if (isset($_POST['rsssl-skip-challenge-directory-request'])) { update_option('rsssl_skip_challenge_directory_request', true); } if (isset($_POST['rsssl-force-plesk'])) { update_option('rsssl_force_plesk', true); } if (isset($_POST['rsssl-force-cpanel'])) { update_option('rsssl_force_cpanel', true); } } /** * * @param $step */ public function installation_progress(){ $step = $this->calculate_next('step'); if (empty($step)) return; $action_list = RSSSL_LE()->config->steps['lets-encrypt'][$step]['actions']; if (count($action_list)==0) return; $actions = array_column($action_list, 'action'); $attempts = array_column($action_list, 'attempts'); $descriptions = array_column($action_list, 'description'); $speed = array_column($action_list, 'speed'); ?> <script> jQuery(document).ready(function ($) { 'use strict'; var progress = 0; var stored_actions = ['<?php echo implode( "','",$actions) ?>']; var stored_attempts = ['<?php echo implode( "','",$attempts) ?>']; var stored_descriptions = ['<?php echo implode( "','",$descriptions) ?>']; var actions = stored_actions;//enabled us to reset var attempts = stored_attempts;//enabled us to reset var descriptions = stored_descriptions;//enabled us to reset var progress_step = Math.ceil(100/actions.length); var attempt_string = '<?php _e("Attempt %s.", "really-simple-ssl")?>'; var startTime, endTime; var actual_attempts_count = 1; var previous_progress = 0; $('.rsssl_letsencrypt_container').removeClass('rsssl-hidden'); rsssl_process_installation_step(); function rsssl_process_installation_step() { //get next action to process console.log("remaining actions"); console.log(actions); var current_action = actions[0]; var max_attempts = attempts[0]; //set up a counter to slowly increment the progress value until we get a response. clearInterval(window.rsssl_interval); window.rsssl_interval = setInterval(function () { progress += 0.2; if (progress >= 100) { progress = previous_progress; } rsssl_set_progress(); }, 100); rsssl_start(); $.ajax({ type: "GET", url: rsssl_wizard.admin_url, dataType: 'json', data: ({ action: 'rsssl_installation_progress', function: current_action, }), success: function (response) { var elapsedTime = rsssl_elapsed_time(); if (elapsedTime<1000) { rsssl_sleep(1000-elapsedTime); } var msg = response.message; if (actual_attempts_count>1) { msg = attempt_string.replace('%s', actual_attempts_count)+' '+msg; } var current_action_container = $('.rsssl_action_'+current_action); current_action_container.html(msg); current_action_container.addClass('rsssl-'+response.status); var event = new CustomEvent('rsssl_le_response', { detail: response }); document.dispatchEvent(event); if (response.action === 'finalize' ) { rsssl_maybe_show_elements(current_action, response.status); rsssl_set_status(response.status); //do not remove current action //remove remaining list items. for (var action in actions) { if (actions.hasOwnProperty(action)) { if (current_action !== actions[action]) $('.rsssl_action_'+actions[action]).hide(); } } //clear all arrays actions.length = 0; attempts.length = 0; descriptions.length = 0; console.log("action is finalize"); $('.rsssl-next').prop('disabled', false); clearInterval(window.rsssl_interval); window.rsssl_interval = setInterval(function() { progress +=5; rsssl_set_progress(msg); }, 100 ); } else if (response.action === 'continue' || response.action === 'skip' ) { rsssl_maybe_show_elements(current_action, response.status); rsssl_set_status(response.status); //skip: drop previous completely, skip to next. if (response.action === 'skip') { $('.rsssl_action_'+current_action).hide(); } actions.shift(); attempts.shift(); descriptions.shift(); //new action, so reset the attempts count actual_attempts_count = 1; progress = 100 - (progress_step * actions.length); //store last successful progress previous_progress = progress; rsssl_set_progress(100); if ( actions.length == 0 ) { rsssl_stop_progress(response.status); $('.rsssl-next').prop('disabled', false); } else { rsssl_process_installation_step(); } } else if (response.action === 'retry' ) { if ( actual_attempts_count >= max_attempts ) { rsssl_maybe_show_elements(current_action, response.status); progress = 100; rsssl_stop_progress(response.status); } else { actual_attempts_count++; actions = stored_actions; descriptions = stored_descriptions; attempts = stored_attempts; clearInterval(window.rsssl_interval); window.rsssl_interval = setInterval(function() { progress += 10; rsssl_set_progress(msg, true); }, 100 ); } } else if (response.action === 'stop'){ rsssl_maybe_show_elements(current_action, response.status); rsssl_set_status(response.status); actions.shift(); for (var action in actions) { if (actions.hasOwnProperty(action)) { var container = $('.rsssl_action_'+actions[action]); container.html(container.html() ); } } progress = 100; rsssl_stop_progress(response.status); } else { console.log("response.action not found ".response.action); } }, error: function(response) { console.log("error"); console.log(response); rsssl_set_status('error'); $('.rsssl-progress-container ul li:first-of-type').html(response.responseText); rsssl_stop_progress('error'); } }); } function rsssl_set_status(status){ if (status) if ($('.rsssl-'+status).length) { $('.rsssl-'+status).removeClass('rsssl-hidden'); } } function rsssl_maybe_show_elements(action, status){ $('.rsssl-show-on-'+status+'.rsssl-'+action).removeClass('rsssl-hidden'); $('.rsssl-show-on-'+status+'.rsssl-general').removeClass('rsssl-hidden'); } function rsssl_sleep(milliseconds) { const date = Date.now(); let currentDate = null; do { currentDate = Date.now(); } while (currentDate - date < milliseconds); } function rsssl_stop_progress( status ){ var bar = $('.rsssl-installation-progress'); bar.css('width', '100%'); bar.addClass('rsssl-'+status); clearInterval(window.rsssl_interval); } function rsssl_start() { startTime = new Date(); } function rsssl_elapsed_time() { endTime = new Date(); var timeDiff = endTime - startTime; //in ms return Math.round(timeDiff); } function rsssl_set_progress(msg , restart_on_100){ if ( progress>=100 ) progress=100; $('.rsssl-installation-progress').css('width',progress + '%'); if ( progress == 100 ) { clearInterval(window.rsssl_interval); if (typeof restart_on_100 !=='undefined' && restart_on_100){ progress = previous_progress; rsssl_process_installation_step(); } } } }); </script> <div class="field-group"> <div class="rsssl-field"> <div class="rsssl-section"> <div class="rsssl_letsencrypt_container field-group rsssl-hidden"> <div class="rsssl-field"> <div class=" rsssl-wizard-progress-bar"> <div class="rsssl-wizard-progress-bar-value rsssl-installation-progress" style="width:0"></div> </div> </div> </div> <div class="rsssl_letsencrypt_container rsssl-progress-container field-group rsssl-hidden"> <ul> <?php foreach ($action_list as $action){?> <li class="rsssl_action_<?php echo $action['action']?>"> <?php echo $action['description'] ?> </li> <?php } ?> </ul> </div> </div> </div> <div class="rsssl-help-warning-wrap"><?php if ($this->step() === 1) { rsssl_sidebar_notice($this->support_form()); } ?> </div> </div> <?php } public function support_form(){ $url = $this->get_support_url(); ob_start();?> <h2><?php _e("Before you begin!","really-simple-ssl") ?></h2> <p><?php _e("During the SSL generation process you might discover you want to give some feedback about your experiences or need some help. If so, keep our form ready and try to be as complete and precise as possible so we can assist as fast as possible.","really-simple-ssl")?></p> <?php wp_nonce_field('rsssl_save', 'rsssl_le_nonce') ?> <a target="_blank" href="<?php echo $url?>" type="submit" class="button button-default rsssl-priority" name="rsssl-letsencrypt-support"><?php _e("Support","really-simple-ssl")?></a> <?php return ob_get_clean(); } public function get_installation_progress(){ $error = false; $action = ''; $message = ''; $output = ''; $status = 'none'; if ( ! is_user_logged_in() ) { $error = true; } if ( !isset($_GET['function']) ) { $error = true; } if ( !$error ) { $function = sanitize_title($_GET['function']); } if ( !$error ) { if (!function_exists($function) && !method_exists(RSSSL_LE()->letsencrypt_handler, $function)) { $error = true; } } if ( !$error ) { if ( function_exists($function) ){ $response = $function(); } else { $response = RSSSL_LE()->letsencrypt_handler->$function(); } $message = $response->message; $action = $response->action; $status = $response->status; $output = $response->output; } $out = array( 'success' => ! $error, 'message' => $message, 'action' => $action, 'status' => $status, 'output' => $output, ); header( "Content-Type: application/json" ); echo json_encode( $out ); exit; } /** * Initialize a page in the wizard * @param $page */ public function initialize( $page ) { $this->last_section = $this->last_section( $page, $this->step() ); $this->page_url = rsssl_letsencrypt_wizard_url(); } /** * Handle some custom options after saving the wizard options * @param string $fieldname * @param mixed $fieldvalue * @param mixed $prev_value * @param string $type */ public function after_save_wizard_option( $fieldname, $fieldvalue, $prev_value, $type ) { //only run when changes have been made if ( $fieldvalue === $prev_value ) { return; } if ( $fieldname==='other_host_type'){ if ( isset(RSSSL_LE()->config->hosts[$fieldvalue]) ){ $dashboard = RSSSL_LE()->config->hosts[$fieldvalue]['hosting_dashboard']; update_option('rsssl_hosting_dashboard', $dashboard); } } if ( $fieldname === 'email_address'&& is_email($fieldvalue) ) { RSSSL_LE()->letsencrypt_handler->update_account($fieldvalue); } } /** * Get the next step with fields in it * @param string $page * @param int $step * * @return int */ public function get_next_not_empty_step( $page, $step ) { if ( ! RSSSL_LE()->field->step_has_fields( $page, $step ) ) { if ( $step >= $this->total_steps( $page ) ) { return $step; } $step ++; $step = $this->get_next_not_empty_step( $page, $step ); } return $step; } /** * Get the next section which is not empty * @param string $page * @param int $step * @param int $section * * @return int|bool */ public function get_next_not_empty_section( $page, $step, $section ) { if ( ! RSSSL_LE()->field->step_has_fields( $page, $step, $section ) ) { //some keys are missing, so we need to count the actual number of keys. if ( isset( RSSSL_LE()->config->steps[ $page ][ $step ]['sections'] ) ) { $n = array_keys( RSSSL_LE()->config->steps[ $page ][ $step ]['sections'] ); //<---- Grab all the keys of your actual array and put in another array $count = array_search( $section, $n ); //<--- Returns the position of the offset from this array using search //this is the actual list up to section key. $new_arr = array_slice( RSSSL_LE()->config->steps[ $page ][ $step ]['sections'], 0, $count + 1, true );//<--- Slice it with the 0 index as start and position+1 as the length parameter. $section_count = count( $new_arr ) + 1; } else { $section_count = $section + 1; } $section ++; if ( $section_count > $this->total_sections( $page, $step ) ) { return false; } $section = $this->get_next_not_empty_section( $page, $step, $section ); } return $section; } /** * Get previous step which is not empty * * @param string $page * @param int $step * * @return int */ public function get_previous_not_empty_step( $page, $step ) { if ( ! RSSSL_LE()->field->step_has_fields( $page, $step ) ) { if ( $step <= 1 ) { return $step; } $step --; $step = $this->get_previous_not_empty_step( $page, $step ); } return $step; } /** * Get previous section which is not empty * @param string $page * @param int $step * @param int $section * * @return false|int */ public function get_previous_not_empty_section( $page, $step, $section ) { if ( ! RSSSL_LE()->field->step_has_fields( $page, $step, $section ) ) { $section --; if ( $section < 1 ) { return false; } $section = $this->get_previous_not_empty_section( $page, $step, $section ); } return $section; } /** * Lock the wizard for further use while it's being edited by the current user. * * * */ public function lock_wizard() { $user_id = get_current_user_id(); set_transient( 'rsssl_wizard_locked_by_user', $user_id, apply_filters( "rsssl_wizard_lock_time", 2 * MINUTE_IN_SECONDS ) ); } /** * Check if the wizard is locked by another user * * * */ public function wizard_is_locked() { $user_id = get_current_user_id(); $lock_user_id = $this->get_lock_user(); if ( $lock_user_id && $lock_user_id != $user_id ) { return true; } return false; } /** * Get user which is locking the wizard * @return false|int */ public function get_lock_user() { return get_transient( 'rsssl_wizard_locked_by_user' ); } /** * Render wizard * @param string $page * @param string $wizard_title */ public function wizard( ) { if (!rsssl_user_can_manage()) { return; } $page = 'lets-encrypt'; if ($this->wizard_is_locked()) { $user_id = $this->get_lock_user(); $user = get_user_by("id", $user_id); $lock_time = apply_filters("rsssl_wizard_lock_time", 2 * MINUTE_IN_SECONDS) / 60; rsssl_notice(sprintf(__("The wizard is currently being edited by %s", 'really-simple-ssl'), $user->user_nicename) . '<br>' . sprintf(__("If this user stops editing, the lock will expire after %s minutes.", 'really-simple-ssl'), $lock_time), 'warning'); return; } //lock the wizard for other users. $this->lock_wizard(); $this->initialize($page); $step = $this->calculate_next( 'step'); $section = $this->calculate_next('section'); $menu = $this->wizard_menu( $page, '', $step, $section ); $content = $this->wizard_content($page, $step, $section ); $args = array( 'page' => 'lets-encrypt', 'content' => $menu.$content, ); $html = RSSSL()->really_simple_ssl->get_template('admin_wrap.php', $path = rsssl_le_wizard_path, $args ); echo '<div class="wrap">'.$html.'</div>'; } public function calculate_next( $type ){ $step = $this->step(); $section = $this->section(); $page = 'lets-encrypt'; if ($this->section_is_empty($page, $step, $section) || (isset($_POST['rsssl-next']) ) ) { if (RSSSL_LE()->config->has_sections($page, $step) && ($section < $this->last_section) ) { $section++; } else { $step++; $section = $this->first_section($page, $step); } $step = $this->get_next_not_empty_step($page, $step); $section = $this->get_next_not_empty_section($page, $step, $section); //if the last section is also empty, it will return false, so we need to skip the step too. if (!$section) { $section = 1; $step++; } } if (isset($_POST['rsssl-previous'])) { if (RSSSL_LE()->config->has_sections($page, $step) && $section > $this->first_section($page, $step) ) { $section--; } else { $step--; $section = $this->last_section($page, $step); } $step = $this->get_previous_not_empty_step($page, $step); $section = $this->get_previous_not_empty_section($page, $step, $section); } if ($type==='step'){ return $step; } else { return $section; } } /** * Render Wizard menu * @param string $page * @param string $wizard_title * @param int $active_step * @param int $active_section * * @return false|string */ public function wizard_menu( $page, $wizard_title, $active_step, $active_section ) { $args_menu['steps'] = ""; for ($i = 1; $i <= $this->total_steps($page); $i++) { if ($this->step_is_empty($page, $i)) continue; $args['title'] = RSSSL_LE()->config->steps[$page][$i]['title']; $args['active'] = ($i == $active_step) ? 'active' : ''; $args['completed'] = $this->required_fields_completed($page, $i, false) ? 'complete' : 'incomplete'; $args['url'] = '#'; //get id of step based on $i //if this id is in the progress list it has been completed once, we show the url $id = RSSSL_LE()->config->steps['lets-encrypt'][$i]['id']; if ( rsssl_is_ready_for($id) ) { $args['url'] = add_query_arg(array('tab' => 'letsencrypt', 'step' => $i), $this->page_url); } $args['sections'] = ($args['active'] == 'active') ? $this->wizard_sections($page, $active_step, $active_section) : ''; $step_html = RSSSL()->really_simple_ssl->get_template( 'step.php', $path = rsssl_le_wizard_path , $args); $args_menu['steps'] .= $step_html; } $args_menu['percentage-complete'] = $this->wizard_percentage_complete($page, $active_step); $args_menu['title'] = !empty( $wizard_title ) ? '<div class="rsssl-wizard-subtitle"><h2>' . $wizard_title . '</h2></div>': '' ; $html = RSSSL()->really_simple_ssl->get_template( 'menu.php', $path = rsssl_le_wizard_path, $args_menu ); return $html; } /** * @param string $page * @param int $step * @param int $active_section * * @return string */ public function wizard_sections( $page, $step, $active_section ) { $sections = ""; if ( RSSSL_LE()->config->has_sections( $page, $step )) { for ($i = $this->first_section( $page, $step ); $i <= $this->last_section( $page, $step ); $i ++) { $icon = rsssl_icon('check', 'empty'); if ( $this->section_is_empty( $page, $step, $i ) ) continue; if ( $i < $this->get_next_not_empty_section( $page, $step, $i ) ) continue; $active = ( $i == $active_section ) ? 'active' : ''; if ( $active == 'active' ) { $icon = rsssl_icon('arrow-right-alt2', 'success'); } else if ($this->required_fields_completed( $page, $step, $i )) { $icon = rsssl_icon('check', 'success'); } $completed = ( $this->required_fields_completed( $page, $step, $i ) ) ? "rsssl-done" : "rsssl-to-do"; $url = add_query_arg( array('tab' => 'letsencrypt', 'step' => $step, 'section' => $i), $this->page_url ); $title = RSSSL_LE()->config->steps[ $page ][ $step ]['sections'][ $i ]['title']; $args = array( 'active' => $active, 'completed' => $completed, 'icon' => $icon, 'url' => $url, 'title' => $title, ); $section_html = RSSSL()->really_simple_ssl->get_template( 'section.php', $path = rsssl_le_wizard_path, $args ); $sections .= $section_html; } } return $sections; } /** * Render wizard content * @param string $page * @param int $step * @param int $section * * @return false|string */ public function wizard_content( $page, $step, $section ) { $args = array( 'save_notice' => '', 'previous_button' => '', 'next_button' => '', 'save_button' => '', 'intro' => $this->get_intro( $page, $step, $section ), 'page_url' => $this->page_url, 'page' => $page, 'step' => $step, 'section' => $section, ); if (isset(RSSSL_LE()->config->steps[$page][$step]['sections'][$section]['title'])) { $args['title'] = RSSSL_LE()->config->steps[$page][$step]['sections'][$section]['title']; } else { $args['title'] = RSSSL_LE()->config->steps[$page][$step]['title']; } ob_start(); RSSSL_LE()->field->get_fields( $page, $step, $section ); $args['fields'] = ob_get_clean(); if ( $step > 1 || $section > 1 ) { $args['previous_button'] = '<input class="button button-link rsssl-previous" type="submit" name="rsssl-previous" value="'. __( "Previous", 'really-simple-ssl' ) . '">'; } if ( $step < $this->total_steps( $page ) ) { $action_list = RSSSL_LE()->config->steps['lets-encrypt'][$step]['actions']; $disabled = ''; if ( count($action_list)>0 ) { $disabled = 'disabled'; } $args['next_button'] = '<input '.$disabled.' class="button button-primary rsssl-next" type="submit" name="rsssl-next" value="'. __( "Save and continue", 'really-simple-ssl' ) . '">'; } if ( $step > 0 && $step < $this->total_steps( $page )) { $args['save_button'] = RSSSL_LE()->field->save_button(); } elseif ($step === $this->total_steps( $page )) { $args['save_button'] = $this->activate_ssl_buttons(); } $html = RSSSL()->really_simple_ssl->get_template( 'content.php', $path = rsssl_le_wizard_path, $args ); return $html; } public function get_support_url() { $user_info = get_userdata(get_current_user_id()); $email = urlencode($user_info->user_email); $name = urlencode($user_info->display_name); $verification_type = get_option('rsssl_verification_type') === 'DNS' ? 'DNS' : 'DIR'; $skip_dns_check = get_option('rsssl_skip_dns_check' ) ? 'Skip DNS check' : 'Do DNS check'; $skip_directory_check = get_option('rsssl_skip_challenge_directory_request' ) ? 'Skip directory check' : 'Do directory check'; $hosting_company = rsssl_get_other_host(); $dashboard = 'unknown'; if (rsssl_is_cpanel()){ $dashboard = 'cpanel'; } else if(rsssl_is_plesk()){ $dashboard = 'plesk'; } else if (rsssl_is_directadmin()){ $dashboard = 'directadmin'; } $debug_log_contents = RSSSL()->really_simple_ssl->debug_log; $debug_log_contents = str_replace("\n", '--br--', $debug_log_contents ); $debug_log_contents .= 'dashboard '.$dashboard.'--br--'; $debug_log_contents .= 'skip dns check '.$skip_dns_check.'--br--'; $debug_log_contents .= 'skip directory check '.$skip_directory_check.'--br--'; $debug_log_contents .= 'verification type '.$verification_type.'--br--'; $debug_log_contents = urlencode(strip_tags( $debug_log_contents ) ); //Retrieve the domain $domain = site_url(); $url = "https://really-simple-ssl.com/letsencrypt-support/?email=$email&customername=$name&domain=$domain&hosting_company=$hosting_company&debuglog=$debug_log_contents"; return $url; } public function activate_ssl_buttons(){ ob_start(); wp_nonce_field('rsssl_le_nonce', 'rsssl_le_nonce'); ?> <?php $response = RSSSL_LE()->letsencrypt_handler->certificate_status(); $certificate_is_valid = $response->status === 'error'; $already_enabled = RSSSL()->really_simple_ssl->ssl_enabled; if ($certificate_is_valid && $already_enabled){ ?> <a class="button button-default" href="<?php echo esc_url(add_query_arg(array("page"=>"rlrsssl_really_simple_ssl"),admin_url("options-general.php") ) );?>"><?php _e("Go to dashboard", "really-simple-ssl"); ?></a> <?php } else if ( $certificate_is_valid ) {?> <input type="submit" class='button button-primary' value="<?php _e("Go ahead, activate SSL!", "really-simple-ssl"); ?>" id="rsssl_do_activate_ssl" name="rsssl_do_activate_ssl"> <?php } else { ?> <input type="submit" class='button button-default' value="<?php _e("Retry", "really-simple-ssl"); ?>" id="rsssl_recheck_ssl" name="rsssl_recheck_ssl"> <?php }?> <?php if (!defined("rsssl_pro_version") ) { ?> <a class="button button-default" href="<?php echo RSSSL()->really_simple_ssl->pro_url ?>" target="_blank"><?php _e("Get ready with PRO!", "really-simple-ssl"); ?></a> <?php } ?> <?php return ob_get_clean(); } /** * If a section does not contain any fields to be filled, just drop it from the menu. * @return bool * * */ public function section_is_empty( $page, $step, $section ) { $section_compare = $this->get_next_not_empty_section( $page, $step, $section ); if ( $section != $section_compare ) { return true; } return false; } public function step_is_empty( $page, $step ) { $step_compare = $this->get_next_not_empty_step( $page, $step ); if ( $step != $step_compare ) { return true; } return false; } /** * Enqueue assets * @param $hook */ public function enqueue_assets( $hook ) { if (!isset($_GET['tab']) || $_GET['tab']!=='letsencrypt') return; $minified = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; wp_register_style( 'select2', rsssl_le_url . 'wizard/assets/select2/css/select2.min.css', false, rsssl_version ); wp_enqueue_style( 'select2' ); wp_enqueue_script( 'select2', rsssl_le_url . "wizard/assets/select2/js/select2.min.js", array( 'jquery' ), rsssl_version, true ); // Let's encrypt wp_register_style( 'rsssl-wizard', rsssl_le_url . "wizard/assets/css/wizard.css", false, rsssl_version ); wp_enqueue_style( 'rsssl-wizard' ); // @todo admin css in wizard.less wp_register_style( 'rsssl-wizard-admin', rsssl_le_url . "wizard/assets/css/admin.css", false, rsssl_version ); wp_enqueue_style( 'rsssl-wizard-admin' ); wp_enqueue_script( 'rsssl-wizard', rsssl_le_url . "wizard/assets/js/wizard$minified.js", array( 'jquery', 'select2' ), rsssl_version.time(), true ); wp_localize_script( 'rsssl-wizard', 'rsssl_wizard', array( 'admin_url' => admin_url( 'admin-ajax.php' ), 'no_results' => __("I don't know, or not listed, proceed with installation","really-simple-ssl"), ) ); } /** * Foreach required field, check if it's been answered * if section is false, check all fields of the step. * @param string $page * @param int $step * @param int $section * * @return bool */ public function required_fields_completed( $page, $step, $section ) { //get all required fields for this section, and check if they're filled in $fields = RSSSL_LE()->config->fields( $page, $step, $section ); $fields = rsssl_array_filter_multidimensional( $fields, 'required', true ); foreach ( $fields as $fieldname => $args ) { //if a condition exists, only check for this field if the condition applies. if ( isset( $args['condition'] ) || isset( $args['callback_condition'] ) && ! RSSSL_LE()->field->condition_applies( $args ) ) { continue; } $value = RSSSL_LE()->field->get_value( $fieldname ); if ( empty( $value ) ) { return false; } } return true; } public function all_required_fields_completed_wizard(){ return $this->all_required_fields_completed('lets-encrypt'); } /** * Check if all required fields are filled * @return bool * * */ public function all_required_fields_completed( $page ) { for ( $step = 1; $step <= $this->total_steps( $page ); $step ++ ) { if ( RSSSL_LE()->config->has_sections( $page, $step ) ) { for ( $section = $this->first_section( $page, $step ); $section <= $this->last_section( $page, $step ); $section ++ ) { if ( ! $this->required_fields_completed( $page, $step, $section ) ) { return false; } } } else { if ( ! $this->required_fields_completed( $page, $step, false ) ) { return false; } } } return true; } /** * Get a notice style header with an intro above a step or section * * @param string $page * @param int $step * @param int $section * * @return string */ public function get_intro( $page, $step, $section ) { //only show when in action $intro = ''; if ( RSSSL_LE()->config->has_sections( $page, $step ) ) { if ( isset( RSSSL_LE()->config->steps[ $page ][ $step ]['sections'][ $section ]['intro'] ) ) { $intro .= RSSSL_LE()->config->steps[ $page ][ $step ]['sections'][ $section ]['intro']; } } else { if ( isset( RSSSL_LE()->config->steps[ $page ][ $step ]['intro'] ) ) { $intro .= RSSSL_LE()->config->steps[ $page ][ $step ]['intro']; } } if ( strlen( $intro ) > 0 ) { $intro = '<div class="rsssl-wizard-intro">' . $intro . '</div>'; } return $intro; } public function get_type( $post_id = false ) { $page = false; if ( $post_id ) { $post_type = get_post_type( $post_id ); $page = str_replace( 'rsssl-', '', $post_type ); } if ( isset( $_GET['page'] ) ) { $page = str_replace( 'rsssl-', '', sanitize_title( $_GET['page'] ) ); } return $page; } public function step( $page = false ) { $step = 1; if ( ! $page ) { $page = 'lets-encrypt'; } $total_steps = $this->total_steps( $page ); if ( isset( $_GET["step"] ) ) { $step = intval( $_GET['step'] ); } if ( isset( $_POST["step"] ) ) { $step = intval( $_POST['step'] ); } if ( $step > $total_steps ) { $step = $total_steps; } if ( $step <= 1 ) { $step = 1; } return $step; } public function section() { $section = 1; if ( isset( $_GET["section"] ) ) { $section = intval( $_GET['section'] ); } if ( isset( $_POST["section"] ) ) { $section = intval( $_POST['section'] ); } if ( $section > $this->last_section ) { $section = $this->last_section; } if ( $section <= 1 ) { $section = 1; } return $section; } /** * Get total number of steps for a page * * @param $page * * @return int */ public function total_steps( $page ) { return count( RSSSL_LE()->config->steps[ $page ] ); } public function total_sections( $page, $step ) { if ( ! isset( RSSSL_LE()->config->steps[ $page ][ $step ]['sections'] ) ) { return 0; } return count( RSSSL_LE()->config->steps[ $page ][ $step ]['sections'] ); } public function last_section( $page, $step ) { if ( ! isset( RSSSL_LE()->config->steps[ $page ][ $step ]["sections"] ) ) { return 1; } $array = RSSSL_LE()->config->steps[ $page ][ $step ]["sections"]; return max( array_keys( $array ) ); } public function first_section( $page, $step ) { if ( ! isset( RSSSL_LE()->config->steps[ $page ][ $step ]["sections"] ) ) { return 1; } $arr = RSSSL_LE()->config->steps[ $page ][ $step ]["sections"]; $first_key = key( $arr ); return $first_key; } /** * * Check which percentage of the wizard is completed * @param bool $count_warnings * * @return int * */ public function wizard_percentage_complete( $page, $step ) { //store to make sure it only runs once. if ( $this->percentage_complete !== false ) { return $this->percentage_complete; } $total_steps = $this->total_steps( 'lets-encrypt' ); $percentage = round( 100 * ( $step / $total_steps ) + 0.45 ); $this->percentage_complete = $percentage; return $percentage; } } } //class closure wizard/assets/css/variables.css 0000644 00000000000 15154444756 0012625 0 ustar 00 wizard/assets/css/wizard.css 0000644 00000146245 15154444756 0012203 0 ustar 00 .rsssl-certificate-data { right: 10000px; position: absolute; background-color: #fff; padding: 0; white-space: nowrap; } .rsssl-copied-feedback-container { padding: 20px; color: #61ce70; } .rsssl-section .rsssl_letsencrypt_container a.button { margin-top: 15px; } /** * class to add a triangle pointer to each div */ .rsssl-pointer { position: relative; } .rsssl-pointer:after { content: " "; position: absolute; left: -15px; top: 15px; border-top: 15px solid transparent; border-right: 15px solid black; border-left: none; border-bottom: 15px solid transparent; } #rsssl-content-area { display: grid; grid-template-columns: 225px auto; } #rsssl-content-area h1 { padding: 0; } #rsssl-content-area .rsssl-wizard-title { padding: 20px; border-bottom: 1px solid #eeeeee; display: flex; justify-content: space-between; align-content: center; } #rsssl-content-area .rsssl-wizard-title h1 { font-size: 18px; } #rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header { border-bottom: 1px solid #e6e6e6; } #rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header h1 { font-weight: normal; } #rsssl-content-area .rsssl-wizard-subtitle h2 { margin: 20px 20px 0 20px; font-size: 14px; } #rsssl-content-area .rsssl-wizard-progress-bar { background: #eeeeee; height: 15px; margin: 20px 0 0 0; } #rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value { transition: width 0.5s; -webkit-transition: width 0.5s; height: 100%; background: #61ce70; border-radius: 4px; } #rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value.rsssl-error { background-color: #D7263D; } #rsssl-content-area .rsssl-priority { background-color: #000; color: #fff; border-color: #000; margin-top: 10px; } #rsssl-content-area .rsssl-wizard-menu { background-color: white; margin: 10px; margin-bottom: 0; padding-bottom: 20px; box-shadow: 0 0 5px 5px rgba(222, 222, 222, 0.2); } #rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-menu h1 { font-weight: bold; } #rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-progress-bar { margin: 20px; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header { text-decoration: none; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.incomplete a h2 { color: #c6c6c6; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a { display: inline-block; padding: 5px 20px; text-decoration: none; width: calc(100% - (20px + 20px)); } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a h2 { font-size: 15px; margin: 0; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active a h2 { color: #c6c6c6 !important; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header:hover a h2 { text-decoration: underline; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active:hover a { background: white; pointer-events: none; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section { display: grid; grid-template-columns: 20px 1fr; margin: 0 20px; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section span { align-self: center; justify-self: center; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a { display: inline-block; text-decoration: none; padding: 3px 5px; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3 { color: #c6c6c6; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a:visited h3 { color: initial; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3 { font-size: 12px; font-weight: normal; margin: 0; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active a h3 { color: grey; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section:hover a h3 { text-decoration: underline; } #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active:hover a { background: white; pointer-events: none; } #rsssl-content-area .rsssl-section-content { margin: 10px; } #rsssl-content-area .rsssl-section-content p { margin: 0; } #rsssl-content-area .rsssl-section-content p:not(:first-child) { margin-top: 1em; } #rsssl-content-area .rsssl-section-content form { display: grid; grid-template-columns: auto 325px; grid-column-gap: 15px; } #rsssl-content-area .rsssl-section-content form .rsssl-section-content-title-header { background-color: white; } #rsssl-content-area .rsssl-section-content form .rsssl-wizard-intro, #rsssl-content-area .rsssl-section-content form .rsssl-template-intro .rsssl-master-label { grid-column-start: 1; background-color: white; padding: 20px 20px 0 20px; } #rsssl-content-area .rsssl-section-content form .rsssl-field .rsssl-wizard-intro { padding: 0 0 20px 0; } #rsssl-content-area .rsssl-section-content form .rsssl-button { background-color: white; grid-column-start: 1; padding: 20px 20px 0 20px; } #rsssl-content-area .rsssl-section-content form .field-group { grid-column: span 2; display: grid; grid-template-columns: auto 325px; grid-column-gap: 15px; } #rsssl-content-area .rsssl-section-content form .field-group .rsssl-field { grid-column-start: 1; } #rsssl-content-area .rsssl-section-content form .field-group .rsssl-help-warning-wrap { margin-top: -20px; } #rsssl-content-area .rsssl-section-content form .rsssl-section-footer { grid-column-start: 1; background-color: white; padding: 20px; display: grid; align-items: center; grid-template-columns: 1fr auto; } #rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container { grid-column-start: 2; } #rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container input + input { margin-left: 20px; } #rsssl-content-area .rsssl-add-pages-table { display: grid; grid-template-columns: auto auto auto; grid-gap: 5px; align-items: center; margin-bottom: 20px; } #rsssl-content-area .rsssl-add-pages-table span { justify-self: end; text-align: justify; } #rsssl-content-area .rsssl-link-to-menu-table { display: grid; grid-template-columns: 30% 30%; grid-gap: 5px; align-items: center; } #rsssl-content-area .rsssl-link-to-menu-table h3 { grid-column: span 2; margin-top: 20px; margin-bottom: 5px; } #rsssl-content-area .rsssl-link-to-menu-table h3:first-child { margin-top: 0; } #rsssl-content-area .rsssl-link-to-menu-table select { grid-column-start: 2; } #rsssl-content-area .rsssl-cookies-table h2 { font-weight: normal; font-size: 15px; } #rsssl-content-area .rsssl-cookies-table .rsssl-cookies-table-body { border-radius: 5px; display: grid; grid-template-columns: 1fr; padding: 10px; background-color: #f0f2f8; } #rsssl-wizard { /* ----------- Icons ----------- */ /* ----------- Fields ----------- */ /* Checkbox */ /* Disabled option */ /* Customize the label (the container) */ /* Radio */ /* Customize the label (the container) */ /* Text & Email Validation */ /* Text, Email, Select(2), Textarea Style */ /* Placeholders */ /* Labels */ /* Firefox */ } #rsssl-wizard .rsssl-icon { margin: 0 5px; width: initial; border-radius: 50%; } #rsssl-wizard .rsssl-icon.rsssl-empty { visibility: hidden; } #rsssl-wizard .rsssl-icon.rsssl-success { color: #f8be2e; } #rsssl-wizard .rsssl-icon.rsssl-success svg { fill: #f8be2e; stroke: #f8be2e; } #rsssl-wizard .rsssl-icon.rsssl-green { color: #61ce70; } #rsssl-wizard .rsssl-icon.rsssl-green svg { fill: #61ce70; stroke: #61ce70; } #rsssl-wizard .rsssl-icon.rsssl-disabled { color: #ababab; } #rsssl-wizard .rsssl-icon.rsssl-disabled svg { fill: #ababab; stroke: #ababab; } #rsssl-wizard .rsssl-icon.rsssl-error { color: #d7263d; } #rsssl-wizard .rsssl-icon.rsssl-error svg { fill: #d7263d; stroke: #d7263d; } #rsssl-wizard .rsssl-icon.arrow-right-alt2::before { font-size: 14px; } #rsssl-wizard .rsssl-circle-green { height: 12px; width: 12px; border-radius: 12px; background-color: #61ce70; } #rsssl-wizard .rsssl-circle-red { height: 12px; width: 12px; border-radius: 12px; background-color: #d7263d; } #rsssl-wizard .rsssl-not-allowed { cursor: not-allowed; } #rsssl-wizard .rsssl-checkbox .rsssl-field { display: flex; align-items: center; } #rsssl-wizard .rsssl-checkbox .rsssl-field .rsssl-wizard-settings-text { margin-left: 20px; margin-top: 5px; } #rsssl-wizard .rsssl-checkbox-container { display: block; position: relative; padding-left: 35px; /* Hide the browser's default checkbox */ /* Create a custom checkbox */ /* Checkmark (hidden when not checked) */ /* Show the checkmark when checked */ /* Style the checkmark/indicator */ /* Show the default checkmark when default */ /* Disabled option */ } #rsssl-wizard .rsssl-checkbox-container input { position: absolute; opacity: 0; cursor: pointer; height: 0; width: 0; } #rsssl-wizard .rsssl-checkbox-container .checkmark { position: absolute; top: -2px; left: 0; height: 20px; width: 20px; border-radius: 5px; border: 1px solid #dadada; } #rsssl-wizard .rsssl-checkbox-container .checkmark svg { content: ""; position: absolute; display: none; } #rsssl-wizard .rsssl-checkbox-container input:checked ~ .checkmark svg { display: block; fill: #f8be2e; stroke: #f8be2e; } #rsssl-wizard .rsssl-checkbox-container .checkmark svg { left: 2.5px; top: 2px; width: 15px; height: 15px; } #rsssl-wizard .rsssl-checkbox-container .checkmark.rsssl-default svg { display: block; fill: #eee; stroke: #eee; } #rsssl-wizard .rsssl-checkbox-container.rsssl-disabled { pointer-events: none; } #rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark { background-color: #eee; } #rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark svg { stroke: #eee !important; fill: #eee !important; } #rsssl-wizard .rsssl-radio-container { display: block; position: relative; padding-left: 35px; /* Hide the browser's default checkbox */ /* Create a custom radio */ /* Check icon (hidden when not checked) */ /* Show check icon when checked */ /* Style the check icon */ /* Show the default checkmark when default */ /* Disabled option */ } #rsssl-wizard .rsssl-radio-container input { position: absolute; opacity: 0; cursor: pointer; height: 0; width: 0; } #rsssl-wizard .rsssl-radio-container .radiobtn { position: absolute; top: -2px; left: 0; height: 20px; width: 20px; border-radius: 20px; border: 1px solid #dadada; } #rsssl-wizard .rsssl-radio-container .radiobtn div { content: ""; position: absolute; display: none; } #rsssl-wizard .rsssl-radio-container input:checked ~ .radiobtn .rsssl-icon { display: block; background-color: #f8be2e; } #rsssl-wizard .rsssl-radio-container .radiobtn .rsssl-icon { left: 5px; top: 3px; width: 10px; height: 10px; } #rsssl-wizard .rsssl-radio-container .radiobtn.rsssl-default .rsssl-icon { display: block; background-color: #eee; } #rsssl-wizard .rsssl-radio-container.rsssl-disabled { pointer-events: none; } #rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn { background-color: #eee; } #rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn .rsssl-icon { background-color: #eee !important; } #rsssl-wizard textarea.validation, #rsssl-wizard input[type="text"].validation, #rsssl-wizard input[type="password"].validation, #rsssl-wizard input[type="email"].validation, #rsssl-wizard input[type="text"].rsssl-valid-page, #rsssl-wizard input[type="text"].rsssl-deleted-page { position: relative; padding-left: 30px; } #rsssl-wizard textarea.validation ~ span .rsssl-icon, #rsssl-wizard input[type="text"].validation ~ span .rsssl-icon, #rsssl-wizard input[type="password"].validation ~ span .rsssl-icon, #rsssl-wizard input[type="email"].validation ~ span .rsssl-icon, #rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon, #rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon { display: block; position: absolute; padding-left: 7px; margin-top: -25px; z-index: 1; } #rsssl-wizard textarea.validation ~ span .rsssl-icon svg, #rsssl-wizard input[type="text"].validation ~ span .rsssl-icon svg, #rsssl-wizard input[type="password"].validation ~ span .rsssl-icon svg, #rsssl-wizard input[type="email"].validation ~ span .rsssl-icon svg, #rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon svg, #rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon svg { width: 15px; height: 15px; } #rsssl-wizard textarea.validation:invalid ~ span .rsssl-icon, #rsssl-wizard textarea.validation:valid ~ span .rsssl-icon { margin-top: -143px; } #rsssl-wizard textarea.validation:valid ~ span .rsssl-failed, #rsssl-wizard input[type="text"].validation:valid ~ span .rsssl-failed, #rsssl-wizard input[type="password"].validation:valid ~ span .rsssl-failed, #rsssl-wizard input[type="email"].validation:valid ~ span .rsssl-failed { display: none; } #rsssl-wizard textarea.validation:invalid ~ span .rsssl-success, #rsssl-wizard input[type="text"].validation:invalid ~ span .rsssl-success, #rsssl-wizard input[type="password"].validation:invalid ~ span .rsssl-success, #rsssl-wizard input[type="email"].validation:invalid ~ span .rsssl-success { display: none; } #rsssl-wizard input:disabled { background-color: #F2F2F2; } #rsssl-wizard input[type="text"], #rsssl-wizard input[type="password"], #rsssl-wizard input[type="email"], #rsssl-wizard select, #rsssl-wizard .select2, #rsssl-wizard textarea, #rsssl-wizard input[type="number"] { margin-bottom: 2px; } #rsssl-wizard textarea { padding: 10px; width: 100%; height: 100px; margin: 20px 0; } #rsssl-wizard ::placeholder { color: #dadada; } #rsssl-wizard ::placeholder { color: #dadada; } #rsssl-wizard ::-moz-placeholder { color: #dadada; } #rsssl-wizard :-ms-input-placeholder { color: #dadada; } #rsssl-wizard :-moz-placeholder { color: #dadada; } #rsssl-wizard .rsssl-master-label h2 { padding: 20px 20px 0 20px !important; } #rsssl-wizard .rsssl-footer-contents { border-top: none; } #rsssl-wizard .rsssl-grid.rsssl-gridless { display: flex; flex-wrap: wrap; height: inherit !important; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item { position: relative; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-help-warning-wrap { display: none; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-comment { display: none; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header { height: initial; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container { display: flex; justify-content: space-between; align-content: center; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container .rsssl-grid-controls { margin: auto 0; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container { height: calc(100% - 20px); width: calc(100% - 20px); margin-left: 10px; display: grid; grid-template-rows: auto 1fr auto; background-color: white; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container .item-content { padding: 10px 0 0 0; margin: 0; clear: none; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-footer { background-color: white; height: initial; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-checkbox .rsssl-field { display: flex; justify-content: space-between; align-content: center; padding: 20px 20px 0 20px; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big .item-container .item-content { display: grid; grid-auto-flow: row dense; grid-template-columns: 50% 50%; grid-auto-rows: minmax(min-content, max-content); } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big.rsssl-customization .item-container .item-content { grid-auto-flow: row; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field { grid-column: span 2; display: grid; grid-template-columns: 100px 100px; grid-column-gap: 20px; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field .rsssl-label { grid-column: span 2; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field { grid-column: span 2; display: grid; grid-template-columns: 100px 100px 100px; grid-column-gap: 20px; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field .rsssl-label { grid-column: span 3; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field, #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field { display: grid; grid-template-columns: 50px 50px 50px 50px 50px; grid-column-gap: 10px; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field .rsssl-label, #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field .rsssl-label { grid-column: span 5; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap { display: grid; grid-template-rows: 16px 16px; padding-top: 16px; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap .rsssl-grey { color: darkgrey; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap span { cursor: pointer; } #rsssl-wizard .rsssl-grid.rsssl-gridless select { width: 100%; } #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group { grid-column: span 2; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-field { padding: 10px 20px 0 20px; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius, #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth { grid-column: span 1; } #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-1 { grid-column: span 1; } #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-2 { grid-column: span 2; } #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-1 { grid-column-start: 1; } #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-2 { grid-column-start: 2; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-master-label h2 { grid-column: span 2; margin: 0; padding: 20px 20px 0 20px; font-size: 18px; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-sublabel label { color: darkgrey; font-size: 13px; } #rsssl-wizard .rsssl-grid.rsssl-gridless label .rsssl-icon { display: inline; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-switch { margin-top: 0; } #rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-input-wrap:not(.hidden) { display: block; position: absolute; z-index: 10; } #rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-holder { position: absolute; top: 132px; z-index: 10; } #rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-clear { position: absolute; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field { padding: 0; } #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field .rsssl-label { margin: 0; } #rsssl-wizard input::-webkit-outer-spin-button, #rsssl-wizard input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } #rsssl-wizard input[type=number] { -moz-appearance: textfield; } .rsssl-multiple-field-button-footer { display: flex; align-items: center; } .rsssl-multiple-field-button-footer .rsssl-edit-item { margin-right: 5px; } .rsssl-hidden { display: none !important; } /* START TOOLTIP STYLES */ [rsssl-tooltip] { position: relative; /* opinion 1 */ margin-left: 5px; } /* Applies to all tooltips */ [rsssl-tooltip]::before, [rsssl-tooltip]::after { text-transform: none; /* opinion 2 */ font-size: 1em; /* opinion 3 */ line-height: 1; user-select: none; pointer-events: none; position: absolute; display: none; opacity: 0; } [rsssl-tooltip]::before { content: ''; border: 5px solid transparent; /* opinion 4 */ z-index: 1001; /* absurdity 1 */ } [rsssl-tooltip]::after { content: attr(rsssl-tooltip); /* magic! */ min-width: 3em; font-weight: normal; overflow: hidden; text-overflow: ellipsis; padding: 1ch 1.5ch; border-radius: 0.3ch; box-shadow: 0 1em 2em -0.5em rgba(0, 0, 0, 0.35); background: #333; color: #fff; z-index: 1000; /* absurdity 2 */ } /* Make the tooltips respond to hover */ [rsssl-tooltip]:hover::before, [rsssl-tooltip]:hover::after { display: block; } /* don't show empty tooltips */ [rsssl-tooltip='']::before, [rsssl-tooltip='']::after { display: none !important; } /* FLOW: UP */ [rsssl-tooltip]:not([flow])::before, [rsssl-tooltip][flow^="up"]::before { bottom: 100%; border-bottom-width: 0; border-top-color: #333; } [rsssl-tooltip]:not([flow])::after, [rsssl-tooltip][flow^="up"]::after { bottom: calc(100% + 5px); } [rsssl-tooltip]:not([flow])::before, [rsssl-tooltip]:not([flow])::after, [rsssl-tooltip][flow^="up"]::before, [rsssl-tooltip][flow^="up"]::after { left: 50%; transform: translate(-50%, -0.5em); } /* FLOW: DOWN */ [rsssl-tooltip][flow^="down"]::before { top: 100%; border-top-width: 0; border-bottom-color: #333; } [rsssl-tooltip][flow^="down"]::after { top: calc(100% + 5px); } [rsssl-tooltip][flow^="down"]::before, [rsssl-tooltip][flow^="down"]::after { left: 50%; transform: translate(-50%, 0.5em); } /* FLOW: LEFT */ [rsssl-tooltip][flow^="left"]::before { top: 50%; border-right-width: 0; border-left-color: #333; left: calc(0em - 5px); transform: translate(-0.5em, -50%); } [rsssl-tooltip][flow^="left"]::after { top: 50%; right: calc(100% + 5px); transform: translate(-0.5em, -50%); } /* FLOW: RIGHT */ [rsssl-tooltip][flow^="right"]::before { top: 50%; border-left-width: 0; border-right-color: #333; right: calc(0em - 19px); transform: translate(0.5em, -50%); } [rsssl-tooltip][flow^="right"]::after { top: 50%; left: calc(100% + 19px); transform: translate(0.5em, -50%); min-width: 300px; } /* KEYFRAMES */ @keyframes tooltips-vert { to { opacity: 0.9; transform: translate(-50%, 0); } } @keyframes tooltips-horz { to { opacity: 0.9; transform: translate(0, -50%); } } /* FX All The Things */ [rsssl-tooltip]:not([flow]):hover::before, [rsssl-tooltip]:not([flow]):hover::after, [rsssl-tooltip][flow^="up"]:hover::before, [rsssl-tooltip][flow^="up"]:hover::after, [rsssl-tooltip][flow^="down"]:hover::before, [rsssl-tooltip][flow^="down"]:hover::after { animation: tooltips-vert 300ms ease-out forwards; } [rsssl-tooltip][flow^="left"]:hover::before, [rsssl-tooltip][flow^="left"]:hover::after, [rsssl-tooltip][flow^="right"]:hover::before, [rsssl-tooltip][flow^="right"]:hover::after { animation: tooltips-horz 300ms ease-out forwards; } #rsssl-header { font-size: 16px; } #rsssl-header .button-black { background-color: black; color: white; border-color: black; padding: 0 25px; } #rsssl-header .link-black { color: black; padding: 5px 5px; } .wp-editor-wrap iframe { height: initial !important; } .rsssl-help-warning-wrap .rsssl-help-modal { position: relative; position: absolute; z-index: 99; margin: 0 0 0 20px; padding: 10px 15px; color: #fff; background-color: #f8be2e; text-align: left; } .rsssl-help-warning-wrap .rsssl-help-modal h2 { margin-top: -5px; } .rsssl-help-warning-wrap .rsssl-help-modal:after { content: " "; position: absolute; left: -15px; top: 15px; border-top: 15px solid transparent; border-right: 15px solid black; border-left: none; border-bottom: 15px solid transparent; } .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice { background-color: #f8be2e; color: black; padding: 20px; } .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice:after { border-right: 15px solid #f8be2e; top: calc(50% - 15px); } .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-success { background-color: white; color: #61ce70; border: none; padding: 0; } .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning { color: #333333; background-color: #f8be2e; border-color: #f8be2e; } .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning:after { border-right: 15px solid #f8be2e; } .rsssl-help-warning-wrap .rsssl-help-modal:empty { background-color: #f1f1f1; } .rsssl-help-warning-wrap .rsssl-help-modal a { color: #333; } a:active, a:hover { color: #333; } a.button.rsssl-open-modal { font-size: 9px; line-height: 13px; height: 15px; min-height: 15px; padding: 1px 3px; margin-left: 10px; } .rsssl-panel-link { text-decoration: none; display: inline-block; width: 80%; } #rsssl_language { font-size: 15px; } #rsssl_language.rsssl_cookie_language_selector { margin-bottom: 0; } .multiple-field div { margin-top: 8px; } .multiple-field div:last-child { margin-bottom: 8px; } .rsssl-list-container { margin-bottom: 25px; } .rsssl-list-container .rsssl-cookie-field > div, .rsssl-list-container .rsssl-service-field > div { margin-top: 8px; } .rsssl-list-container .rsssl-cookie-field > div:last-child, .rsssl-list-container .rsssl-service-field > div:last-child { margin-bottom: 8px; } .rsssl-list-container .rsssl-disabled label, .rsssl-list-container .rsssl-disabled span { color: #ababab !important; } .rsssl-list-container .rsssl-service-cookie-list { margin-bottom: 20px; } .rsssl-list-container .rsssl-service-cookie-list:last-child { margin-bottom: 0px; } .rsssl-list-container .rsssl-service-divider { font-size: 15px; margin-bottom: 10px; } .rsssl-legenda { padding: 10px 10px 0 10px; display: grid; grid-template-columns: 25px 200px 25px 300px; grid-column-gap: 10px; align-items: center; } .rsssl-panel { font-size: 13px !important; color: #383d41; background-color: #F2F2F2; border: 1px solid #d6d8db; padding: 10px 15px; border-radius: 0px; margin: 0; } .rsssl-panel.rsssl-toggle-disabled { color: #aca5a5; } .rsssl-panel.rsssl-deleted { background-color: #FFa5aa; } .rsssl-panel .rsssl-panel-title { cursor: pointer; } .rsssl-panel .rsssl-field > div { margin: 10px 0; } .rsssl-panel .rsssl-multiple-field-validation { float: right; } .rsssl-panel.rsssl-slide-panel, .rsssl-panel.rsssl-link-panel { padding: 0; } .rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle, .rsssl-panel.rsssl-link-panel .rsssl-panel-toggle { display: flex; align-items: center; } .rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle span, .rsssl-panel.rsssl-link-panel .rsssl-panel-toggle span { padding-left: 10px; } .rsssl-panel.rsssl-slide-panel .rsssl-panel-title, .rsssl-panel.rsssl-link-panel .rsssl-panel-title { display: grid; grid-template-columns: 50% 10% 40%; align-items: center; padding: 10px 15px 8px 0; } .rsssl-panel.rsssl-slide-panel .rsssl-panel-title span.rsssl-panel-toggle, .rsssl-panel.rsssl-link-panel .rsssl-panel-title span.rsssl-panel-toggle { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type, .rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type { display: flex; align-content: center; justify-content: flex-end; } .rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type svg, .rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type svg { width: 18px; height: 18px; padding-top: 1px; } .rsssl-panel.rsssl-slide-panel .rsssl-add-to-policy, .rsssl-panel.rsssl-link-panel .rsssl-add-to-policy { text-decoration: underline; } .rsssl-panel.rsssl-link-panel.selected, .rsssl-panel.rsssl-link-panel:hover { box-shadow: 0 5px 5px rgba(0, 0, 0, 0.2), 0 3px 5px rgba(0, 0, 0, 0.13); } .rsssl-panel .rsssl-panel-content { display: none; background-color: #fff; border: 1px solid #d6d8db; border-top: 0; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; padding: 10px 15px; } .rsssl-panel h1 { font-size: 22px; } .rsssl-panel p { font-size: 13px !important; } .rsssl-panel.rsssl-notice { background-color: #fff; border: 0; color: black; padding: 20px 20px 0 20px; } .rsssl-panel.rsssl-success { background-color: white; color: #61ce70; border: none; padding: 0; } .rsssl-panel.rsssl-warning { position: relative; color: #333333; background-color: #f8be2e; border-color: #f8be2e; margin: 10px 0 10px 0; } .rsssl-panel.rsssl-warning:after { content: " "; position: absolute; left: -15px; top: 15px; border-top: 15px solid transparent; border-right: 15px solid black; border-left: none; border-bottom: 15px solid transparent; } .rsssl-panel.rsssl-warning:after { border-right: 15px solid #f8be2e; } .rsssl-panel ul { list-style-type: disc; margin-left: 22px; } input[type="text"], input[type="password"], input[type="email"], input[type="number"] { width: 100%; } /* cool checkbox sliders */ .rsssl-switch { position: relative; display: inline-block; width: 40px; height: 21px; } .rsssl-switch input { display: none !important; } .rsssl-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: 0.4s; transition: 0.4s; } .rsssl-slider:before { position: absolute; content: ""; height: 15px; width: 15px; left: 4px; bottom: 3px; background-color: white; -webkit-transition: 0.4s; transition: 0.4s; } .rsssl-slider.rsssl-round { border-radius: 20px; } .rsssl-slider.rsssl-round:before { border-radius: 50%; } .rsssl-slider-na { padding: 2px 8px; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: 0.4s; transition: 0.4s; } .rsssl-slider-na:before { position: absolute; content: "N/A"; color: white; } .rsssl-slider-na.rsssl-round { border-radius: 20px; } input:checked + .rsssl-slider { background-color: #f8be2e; } input:checked + .rsssl-slider:before { -webkit-transform: translateX(17px); -ms-transform: translateX(17px); transform: translateX(17px); } input:checked:disabled + .rsssl-slider { background-color: #fffbf3; } input:focus + .rsssl-slider { box-shadow: 0 0 1px #f8be2e; } #complete_wizard_first_notice { position: fixed; /* Sit on top of the page content */ width: 100%; /* Full width (cover the whole page) */ height: 100%; /* Full height (cover the whole page) */ top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.7); /* Black background with opacity */ z-index: 99; } #complete_wizard_first_notice p { border-radius: 0px; font-size: 16px; background-color: #f8be2e; color: white; position: relative; /* height: 100px; */ top: 150px; padding: 30px; width: 300px; text-align: center; margin: auto; } html .mceContentBody { max-width: 100% !important; } .cookie-warning textarea { width: 100%; height: 100px; } .rsssl-comment { font-size: 11px; margin-top: 10px; } .rsssl-cookie-field .rsssl-cookie-header { border-bottom: 1px solid #b6b7b8; margin-bottom: 25px; } #rsssl-send-data input[type=text] { width: 60%; } #rsssl-start-mail, #rsssl_close_tb_window { margin-right: 15px; margin-top: 15px; } #rsssl-wizard { /*body */ } #rsssl-wizard h1, #rsssl-wizard h2, #rsssl-wizard h3, #rsssl-wizard h4, #rsssl-wizard .rsssl-menu-item, #rsssl-wizard .rsssl-step-title, #rsssl-wizard .rsssl-button { font-variant: normal; } #rsssl-wizard h2, #rsssl-wizard h3 { font-size: 15px; } #rsssl-wizard h3 { font-weight: 400; } #rsssl-wizard label { font-size: 13px; } #rsssl-wizard .field-group { position: relative; } #rsssl-wizard .field-group .rsssl-field { padding: 0 20px 0 20px; background-color: white; } #rsssl-wizard .field-group .rsssl-field .rsssl-template-intro { margin-top: 15px; } #rsssl-wizard .field-group .rsssl-title-wrap { font-size: 15px; font-weight: 700; padding-top: 15px; } #rsssl-wizard .field-group .rsssl-label { margin-bottom: 10px; } #rsssl-wizard .field-group .rsssl-label label { display: flex; flex-direction: column; font-size: 15px; cursor: default; } #rsssl-wizard .field-group .rsssl-label label .rsssl-label-wrap { display: flex; margin-top: 15px; font-weight: 700; } #rsssl-wizard .field-group .rsssl-label label .rsssl-subtitle-wrap { font-size: 0.9em; margin: 5px 5px 0 0; } #rsssl-wizard .field-group.rsssl-editor .rsssl-label { margin-bottom: 0; } #rsssl-wizard .field-group .rsssl-field .field-group { grid-column: 1; display: block; } #rsssl-wizard .field-group .rsssl-field .rsssl-field { padding: 0; } #rsssl-wizard .rsssl-body, #rsssl-wizard #rsssl-content-area { /* Styling for the previous and next buttons */ /* CSS for the sections menu */ } #rsssl-wizard .rsssl-body input[type="text"].rsssl-document-custom-url, #rsssl-wizard #rsssl-content-area input[type="text"].rsssl-document-custom-url { width: 250px; } #rsssl-wizard .rsssl-body .rsssl-document-custom-url, #rsssl-wizard #rsssl-content-area .rsssl-document-custom-url, #rsssl-wizard .rsssl-body .rsssl-document-custom-page, #rsssl-wizard #rsssl-content-area .rsssl-document-custom-page { margin-top: 5px; } #rsssl-wizard .rsssl-body input.button, #rsssl-wizard #rsssl-content-area input.button { min-width: 100px; } #rsssl-wizard .rsssl-body input.button.button-red, #rsssl-wizard #rsssl-content-area input.button.button-red { background-color: red; color: white; border-color: red; } #rsssl-wizard .rsssl-body input.button.button-black, #rsssl-wizard #rsssl-content-area input.button.button-black { background-color: black; color: white; border-color: black; } #rsssl-wizard .rsssl-body input.button.button-link, #rsssl-wizard #rsssl-content-area input.button.button-link { text-align: center; min-width: initial; } #rsssl-wizard .rsssl-body input.button.button-link:hover, #rsssl-wizard #rsssl-content-area input.button.button-link:hover { background-color: initial; text-decoration: none; } #rsssl-wizard .rsssl-body button.button-red, #rsssl-wizard #rsssl-content-area button.button-red { background-color: red; color: white; border-color: red; } #rsssl-wizard .rsssl-body .rsssl-master-label h2, #rsssl-wizard #rsssl-content-area .rsssl-master-label h2 { margin: 0; padding: 20px 20px 0 0; font-size: 18px; background-color: white; } #rsssl-wizard .rsssl-body .rsssl-remove, #rsssl-wizard #rsssl-content-area .rsssl-remove { margin-bottom: 12px; } #rsssl-wizard .rsssl-body .rsssl-rescan, #rsssl-wizard #rsssl-content-area .rsssl-rescan { padding: 0 10px 0 10px; } #rsssl-wizard .rsssl-body .rsssl-menu-item.active i, #rsssl-wizard #rsssl-content-area .rsssl-menu-item.active i { color: black; font-size: 1.35em; float: left; } #rsssl-wizard .rsssl-body .rsssl-menu-item.active a, #rsssl-wizard #rsssl-content-area .rsssl-menu-item.active a { color: #000; font-weight: 900; padding-left: 7px; text-decoration: underline; } #rsssl-wizard .rsssl-body .rsssl-done a, #rsssl-wizard #rsssl-content-area .rsssl-done a { text-decoration: none; color: white; font-size: 15px; } #rsssl-wizard .rsssl-body .rsssl-to-do a, #rsssl-wizard #rsssl-content-area .rsssl-to-do a { color: white; font-size: 15px; text-decoration: none; opacity: 0.6; } @media screen and (max-width: 782px) { #rsssl-wizard .rsssl-body input, #rsssl-wizard #rsssl-content-area input { vertical-align: top !important; } } .rsssl-field { /* Define the styling of the text input fields */ } .rsssl-field label { font-weight: normal; margin: 10px 0 2px; } .rsssl-field .rsssl-color-picker.wp-color-picker { margin-top: -11px !important; } .rsssl-field input[type="text"], .rsssl-field input[type="email"], .rsssl-field input[type="number"] { border-color: #dadada; } .rsssl-field select { border-color: #F1F1F1; vertical-align: initial; } .rsssl-field textarea.validation:invalid, .rsssl-field textarea.validation:valid { background-position: 0.5% 1.5%; border-color: #dadada; } .rsssl-field textarea { min-height: 150px; width: 100%; } .rsssl-field input[type=radio]:checked:before { content: "\2022"; text-indent: -9999px; border-radius: 50px; font-size: 24px; width: 6px; height: 6px; margin: 4px; line-height: 16px; background-color: #1e8cbe; } .rsssl-field .rsssl-panel.rsssl-notice { padding: 0 0 10px 0; } .rsssl-field .rsssl-buttons-row-left { display: flex; align-items: center; height: auto; margin-bottom: 10px; } .rsssl-field .rsssl-buttons-row-left input, .rsssl-field .rsssl-buttons-row-left select, .rsssl-field .rsssl-buttons-row-left div { margin-right: 20px; } .rsssl-field button[name=rsssl_add_multiple] { margin-top: 20px; } a.rsssl.button, button.rsssl.button, input.rsssl.button { margin-left: 15px; box-shadow: 0 0 0 #fff; background-color: #f8be2e; color: #fff; padding-right: 20px; border: 0; border-radius: 50px; padding-top: 2px; } a.rsssl.button:hover, button.rsssl.button:hover, input.rsssl.button:hover { background-color: #facd5f; color: white; } a.rsssl.button .fa-angle-right, button.rsssl.button .fa-angle-right, input.rsssl.button .fa-angle-right { font-weight: 900; position: absolute; font-size: 1.8em; margin-top: 1px; margin-left: 5px; } #rsssl-wizard .dashboard .fa-times { color: black; } #rsssl-wizard .dashboard .fa-check { color: #f8be2e; } /* building our new structured css here */ .rsssl-dashboard-container .rsssl-dashboard-title { padding-top: 22px; font-weight: 600; font-size: 24px; line-height: 30px; margin-bottom: 20px; } @media screen and (max-width: 720px) { .rsssl-dashboard-container .rsssl-dashboard-title { padding-bottom: 0px; } } .rsssl-dashboard-header .rsssl-header-top { min-height: 60px; } .rsssl-header-top { grid-area: header-top; background-color: #F2F2F2; min-height: 30px; padding-top: 25px; } .rsssl-header-top .rsssl-premium-cta { width: 150px; float: right; border-color: #f8be2e; color: #f8be2e; text-transform: uppercase; display: flex; } .rsssl-dashboard-container { background-color: white; display: flex; flex-wrap: wrap; } .rsssl-dashboard-container .rsssl-dashboard-header { margin-bottom: -270px; width: 100%; min-height: 220px; background-color: #f8be2e; background-repeat: no-repeat; background-attachment: scroll; background-position: bottom center; } .rsssl-dashboard-container .rsssl-dashboard-header .rsssl-header-text { display: flex; align-items: center; } .rsssl-dashboard-container .rsssl-dashboard-item { background-color: #fff; width: 450px; margin-top: 10px; border: 2px solid; flex: 0 0 450px; flex-shrink: 1; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 0px; border-color: #f2f2f2; overflow: hidden; } .rsssl-dashboard-container .rsssl-dashboard-item .rsssl-top h1 { font-weight: 600; font-size: 2.5em; padding: 25px; } .rsssl-dashboard-container .rsssl-dashboard-content-container { margin: 0 auto; display: grid; grid-template-areas: 'header-top header-top header-top header-top' 'text-completed text-completed text-completed text-completed' 'progress progress support support' 'progress progress documents documents' 'footer footer footer footer'; grid-gap: 10px; padding: 10px; } @media screen and (max-width: 1210px) { .rsssl-dashboard-container .rsssl-dashboard-content-container { grid-template-areas: 'header-top header-top' 'text-completed text-completed' 'progress progress' 'support support' 'documents documents' 'footer footer' 'footer footer'; } } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-logo { display: flex; align-items: center; font-size: 1.5em; font-weight: 600; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-header-text { display: flex; align-items: center; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text { display: flex; align-items: center; margin-top: 35px; grid-area: text-completed; font-size: 24px; color: white; } @media screen and (max-width: 720px) { .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text button { width: 100px; } } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-info { font-size: 19px; font-weight: bold; padding-top: 20px; padding-bottom: 10px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text { color: black; font-weight: 400; padding: 15px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text li { border-bottom: 1px solid; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text .fa-plus { margin-right: 8px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text.free { background-color: #000; color: #fff; min-height: 40px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress { grid-area: progress; } @media screen and (max-width: 1210px) { .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress { margin: 0 auto; } } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top { background-color: #F2F2F2; min-height: 170px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text { display: inline-grid; font-size: 18px; line-height: 22px; max-width: 60%; float: left; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text .rsssl-dashboard-top-text-subtitle { color: #f8be2e; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn { padding-top: 125px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn button { text-align: -webkit-left; border-radius: 50px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-percentage-complete { margin-top: 20px; float: right; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table { padding-top: 10px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .i.fa.fa-check { color: black; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-success, .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-error { color: black; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support { width: 450px; grid-area: support; } @media screen and (max-width: 1210px) { .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support { margin: 0 auto; } } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=text], .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=email], .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea, .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit] { width: 425px; margin-bottom: 5px; margin-top: 5px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea { min-height: 100px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit] { margin: auto; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents { grid-area: documents; margin-top: 10px; } @media screen and (max-width: 1210px) { .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents { margin: 0 auto; } } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table { padding-bottom: 15px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fas { margin-right: 8px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table ul { margin: 5px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table li { border-bottom: 2px solid; margin-bottom: 5px; text-indent: 5px; display: flex; vertical-align: middle; margin-left: 8px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fa-plus { color: #f8be2e; font-size: 1.5em; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom { color: white; background-color: black; min-height: 70px; font-size: 14px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom div { margin-bottom: 10px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer { grid-area: footer; display: flex; flex-shrink: 1; flex-grow: 1; margin-top: 20px; flex-wrap: wrap; justify-content: center; padding-bottom: 20px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block { position: relative; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 0px; background-color: #F2F2F2; width: 205px; min-height: 70px; margin: 5px auto; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block a { position: absolute; top: 5px; right: 5px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-title { margin-top: 9px; margin-left: 9px; font-weight: 900; font-size: 1.2em; margin-right: 35px; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-description { width: 70%; margin-left: 9px; font-size: 0.8em; display: flex; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn { text-align: center; border-radius: 7px; color: #f8be2e; width: 25px; height: 20px; float: right; } .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn .fa-angle-right { font-size: 1.5em; vertical-align: middle; margin-left: 2px; } /*skeleton*/ .rsssl-skeleton:empty { margin: auto; margin-bottom: 25px; width: 100%; height: 235px; /* change height to see repeat-y behavior */ background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5) 70%, rgba(255, 255, 255, 0.5) 15%), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0); background-repeat: repeat-y; background-size: 50px 200px, /* highlight */ 100% 117px, 100% 117px, 100% 117px, 100% 117px; background-position: 0 0, /* highlight */ 1px 1px, 1px 40px, 1px 79px, 1px 118px; background-color: #d6d8db; animation: shine 2.5s infinite; } @keyframes shine { to { background-position: 100% 0, /* move highlight to right */ 1px 1px, 1px 40px, 1px 79px, 1px 118px; } } @-webkit-keyframes sk-stretchdelay { 0%, 40%, 100% { -webkit-transform: scaleY(0.4); } 20% { -webkit-transform: scaleY(1); } } @keyframes sk-stretchdelay { 0%, 40%, 100% { transform: scaleY(0.4); -webkit-transform: scaleY(0.4); } 20% { transform: scaleY(1); -webkit-transform: scaleY(1); } } .rsssl-wizard-menu-menus { padding-top: 10px; } .rsssl-scroll { overflow: scroll; scroll-behavior: smooth; overflow-x: hidden; } #wpbody-content { padding-bottom: 0; } #customization { z-index: 10; } .cc-window { right: 1em; } .cc-window.cc-center { transform: translate(0%, -50%); left: initial; } .cc-window.cc-left { left: initial; } @keyframes slideInUpCenter { from { -webkit-transform: translate3d(0, 150%, 0); transform: translate3d(0, 150%, 0); } to { -webkit-transform: translate3d(0, -50%, 0); transform: translate3d(0, -50%, 0); } } @keyframes slideOutUpCenter { to { -webkit-transform: translate3d(0, 150%, 0); transform: translate3d(0, 150%, 0); opacity: 1; } from { -webkit-transform: translate3d(0, -50%, 0); transform: translate3d(0, -50%, 0); opacity: 1; } } .rsssl-wizard-wrap { margin: 0; } #rsssl-proof-of-consent #rsssl-content-area, #rsssl-cookie-banner #rsssl-content-area { display: block; } #rsssl-proof-of-consent #rsssl-content-area h1, #rsssl-cookie-banner #rsssl-content-area h1 { background-color: white; padding: 20px; border-bottom: 1px solid #eeeeee; } #rsssl-proof-of-consent #rsssl-content-area .rsssl-panel, #rsssl-cookie-banner #rsssl-content-area .rsssl-panel { padding: 20px; margin-bottom: 20px; } #rsssl-proof-of-consent #rsssl-content-area .rsssl-notice, #rsssl-cookie-banner #rsssl-content-area .rsssl-notice { background-color: white; } #rsssl-proof-of-consent #rsssl-content-area input[name=rsssl_generate_snapshot], #rsssl-cookie-banner #rsssl-content-area input[name=rsssl_generate_snapshot] { width: 120px; } #rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select, #rsssl-cookie-banner #rsssl-content-area .rsssl-month-select, #rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select, #rsssl-cookie-banner #rsssl-content-area .rsssl-year-select, #rsssl-proof-of-consent #rsssl-content-area #post-query-submit, #rsssl-cookie-banner #rsssl-content-area #post-query-submit { float: right; margin-top: -50px; width: 120px; } #rsssl-proof-of-consent #rsssl-content-area #post-query-submit, #rsssl-cookie-banner #rsssl-content-area #post-query-submit { margin-right: 0; } #rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select, #rsssl-cookie-banner #rsssl-content-area .rsssl-month-select { margin-right: 290px; } #rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select, #rsssl-cookie-banner #rsssl-content-area .rsssl-year-select { margin-right: 145px; } #rsssl-proof-of-consent #rsssl-content-area .tablenav, #rsssl-cookie-banner #rsssl-content-area .tablenav { display: none; } #rsssl-proof-of-consent #rsssl-content-area #rsssl-cookiestatement-snapshot-filter, #rsssl-cookie-banner #rsssl-content-area #rsssl-cookiestatement-snapshot-filter { padding-top: 20px; } #rsssl-proof-of-consent #rsssl-content-area .wp-list-table, #rsssl-cookie-banner #rsssl-content-area .wp-list-table { font-weight: bold; } #rsssl-proof-of-consent #rsssl-content-area .wp-list-table th, #rsssl-cookie-banner #rsssl-content-area .wp-list-table th { font-weight: bold; } #rsssl-proof-of-consent #rsssl-content-area .wp-list-table th a, #rsssl-cookie-banner #rsssl-content-area .wp-list-table th a { padding: 15px; } #wpbody-content .update-nag { display: none; } #wpbody-content .subsubsub { display: none; } #wpbody-content .wp-heading-inline { padding: 20px 0; } #wpbody-content .rsssl-document-button { margin-top: 22px; margin-left: 15px; } #wpbody-content .cookie-warning .rsssl-document-button { margin-top: 0; } #wpbody-content #rsssl-region-select { margin-top: -6px; margin-left: 15px; width: 100px; } #posts-filter .bulkactions, #posts-filter .tablenav-pages, #posts-filter .search-box { display: none; } #posts-filter .tablenav.top { margin-top: 0; padding-top: 0; } #posts-filter .wp-list-table { font-weight: bold; } #posts-filter .wp-list-table th { font-weight: bold; } #posts-filter .wp-list-table th a { padding: 15px; } /*# sourceMappingURL=wizard.css.map */ wizard/assets/css/admin.css.map 0000644 00000002666 15154444756 0012545 0 ustar 00 {"version":3,"sources":["admin.less"],"names":[],"mappings":"AAKA;EACE,gBAAA;EACA,yBAAA;;AACA,4BAAC;EACC,gBAAA;EACA,eAAA;EACA,kBAAA;;AAGJ;EACE,yBAAA;EACA,WAAA;EACA,mBAAA;EACA,UAAA;EACA,aAAA;EACA,cAAA;EACA,gBAAA;;AAEF;EACE,iBAAA;EACA,gBAAA;EACA,gBAAA;EACA,UAAA;;AAEF,mBAAoB;EAClB,iBAAA;;AADF,mBAAoB,GAElB;EACE,mBAAA;;;AACA,mBAJgB,GAElB,GAEG;EACC,yBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,SAAS,EAAT;EACA,kBAAA;EACA,eAAA;EACA,kBAAA;;AAGF,mBAhBgB,GAElB,GAcG,cAAc;EACb,yBAAA;;AAGF,mBApBgB,GAElB,GAkBG,YAAY;EACX,yBAAA;;AAGF,mBAxBgB,GAElB,GAsBG,cAAc;EACb,yBAAA;;AAzBN,mBAAoB,GAElB,GA2BE,GAAG,GAAE;EACH,sBAAA;EACA,WAAA;EACA,WAAA;EACA,UAAA;EACA,kBAAA;EACA,SAAS,EAAT;EACA,kBAAA;EACA,eAAA;EACA,kBAAA;;AAMN;EACE,aAAA;;;;;AAOA,MAAC,IAAI;AAAL,OAAC,IAAI;AAAL,WAAC,IAAI;AAAL,YAAC,IAAI;EACH,wBAAA;;AAIJ;;;;;AAAA,aACE;EACE,0BAAA;;EACA,wBAAA;;EACA,uBAAA;;EACA,qBAAA;;EACA,oBAAA;;EACA,gBAAA;;;AAPJ,aAUE;EACE,aAAA;EACA,8BAAA;EAQA,aAAA;EACA,sBAAA;;AArBJ,aAUE,cAIE;EACE,iBAAA;EACA,YAAA;EACA,YAAA;;AAjBN,aAUE,cAaE;EACE,aAAA;EACA,mBAAA;;AAzBN,aAUE,cAaE,oBAGE;EACE,kBAAA;;AA3BR,aAgCE;EACE,YAAA;;AAII,aAFN,eACE,eACK;EACC,gBAAA;;AAtCV,aA6CE;EACE,eAAA;;AACA,aAFF,YAEG;EACC,cAAA;;AADF,aAFF,YAEG,cAEC;EACE,eAAA;EACA,aAAA;;AAEF,aARJ,YAEG,cAME;EACC,WAAA;;AAGJ,aAZF,YAYG;EACC,cAAA;;AADF,aAZF,YAYG,eAEC;EACE,eAAA;EACA,aAAA;;AAIJ,aApBF,YAoBG;EACC,WAAA;;AAGF,aAxBF,YAwBG;EACC,YAAA;EACA,WAAA;EACA,eAAA;;AACA,aA5BJ,YAwBG,aAIE;EACC,yBAAA;;AAGF,aAhCJ,YAwBG,aAQE;EACC,yBAAA","file":"admin.css"} wizard/assets/css/admin.less 0000644 00000006316 15154444756 0012143 0 ustar 00 @import 'variables.less'; @brand-primary: @rsp-yellow; @color-success:@rsp-green; @color-disabled: #d7d7d7; @light-grey:#eeeeee; .rsssl_letsencrypt_container { margin-top:@big-margin; background-color: @grey-lighter; &.rsssl-progress-container { margin: 20px 0 0; padding: 10px 0; border-radius: 5px; } } .rsssl-dns-field { border: 1px solid @input-border-color; float: left; margin-bottom: 10px; width: 50%; padding: 10px; margin-left: 0; margin-top: 10px; } .rsssl-dns-label { font-weight: bold; margin-top: 25px; margin-bottom: 0; width:50%; } #rsssl-lets-encrypt ul { margin-left:50px; li { padding-right:10px; &:before { background-color: @grey-light; color: #fff; height: 10px; width: 10px; border-radius: 50%; content: ''; position: absolute; margin-top: 5px; margin-left: -30px; } &.rsssl-warning:before { background-color: @brand-primary; } &.rsssl-error:before { background-color: @color-warning; } &.rsssl-success:before { background-color: @color-success; } /*Nested li */ ul li:before { background-color: @grey-dark; color: #fff; height: 6px; width: 6px; border-radius: 50%; content: ''; position: absolute; margin-top: 7px; margin-left: -19px; } } } //wordpress inserts notices after the first h1 or h2. To prevent breaking layout we insert an empty h1 tag at the start of our page, where WP can insert the notice. .rsssl-notice-hook-element { display:none; } /* Hide nags from other plugins */ .error, .notice, .update-nag, .notice-info { &:not(.really-simple-plugins) { display: none !important; } } #rsssl-wizard { .rsssl-selectable { -webkit-touch-callout: all; /* iOS Safari */ -webkit-user-select: all; /* Safari */ -khtml-user-select: all; /* Konqueror HTML */ -moz-user-select: all; /* Firefox */ -ms-user-select: all; /* Internet Explorer/Edge */ user-select: all; /* Chrome and Opera */ } #rsssl-header { display: flex; justify-content: space-between; img { margin-left:@default-margin; width: 120px; height:28px; } padding: @default-padding; background-color: #fff; .rsssl-header-right { display: flex; align-items: center; a { margin-right: @default-margin; } } } #rsssl-content-area { margin: 10px; } .rsssl-section { .rsssl-success { &.check{ margin-left:5px; } } } /** icons */ .rsssl-icon { height:initial; &.rsssl-success { color:@color-success; svg { stroke:@color-success;; fill:@color-success;; } &.documents-shortcode { color:#000; } } &.rsssl-disabled { color:@color-disabled; svg { stroke:@color-disabled;; fill:@color-disabled;; } } &:hover { color: #000; } &.rsssl-bullet { height: 11px; width: 11px; margin-top:2px; &.rsssl-disabled { background-color: @color-disabled; } &.rsssl-success { background-color: #27ADEA; } } } } wizard/assets/css/wizard.less 0000644 00000126137 15154444756 0012357 0 ustar 00 // out: wizard.css, sourcemap: false, compress: false @import 'variables.less'; @brand-primary: @rsp-yellow; @brand-secondary: #61ce70; @brand-tertiary: #29B6F6; @border-radius: 25px; @input-background-color: #F1F1F1; @input-border-color: #dadada; @gray-light: #dadada; @gray: #c6c6c6; @gray-dark: #888; @red-gap: 15px; @green-gap: 20px; @color-disabled: #F2F2F2; .rsssl-certificate-data { right:10000px; position:absolute; background-color:#fff; padding: 0; white-space: nowrap; } .rsssl-copied-feedback-container{ padding:@default-padding; color:@rsp-green; } .rsssl-section .rsssl_letsencrypt_container { a.button { margin-top:15px; } } /** * class to add a triangle pointer to each div */ .rsssl-pointer { position:relative; &:after { content: " "; position: absolute; left: -15px; top: 15px; border-top: 15px solid transparent; border-right: 15px solid black; border-left: none; border-bottom: 15px solid transparent; } } #rsssl-content-area { display: grid; grid-template-columns: 225px auto; //grid-gap: @red-gap; h1 { padding: 0; } .rsssl-wizard-title { padding: @green-gap; border-bottom: 1px solid #eeeeee; display: flex; h1 { font-size: 18px; } justify-content: space-between; align-content: center; &.rsssl-section-content-notifications-header { border-bottom: 1px solid #e6e6e6; h1 { font-weight: normal; } } } .rsssl-wizard-subtitle h2 { margin: @green-gap @green-gap 0 @green-gap; font-size: 14px; } .rsssl-wizard-progress-bar { background: #eeeeee; height: 15px; margin: @green-gap 0 0 0; .rsssl-wizard-progress-bar-value { transition: width 0.5s; -webkit-transition: width 0.5s; height: 100%; background: @rsp-green; border-radius: 4px; &.rsssl-error { background-color: @rsp-red; } } } .rsssl-priority { background-color: #000; color:#fff; border-color:#000; margin-top:10px; } .rsssl-wizard-menu { background-color: white; margin: 0.5 * @green-gap; margin-bottom: 0; padding-bottom: @green-gap; box-shadow: 0 0 5px 5px rgba(222, 222, 222, 0.2); .rsssl-wizard-menu h1 { font-weight: bold; } .rsssl-wizard-progress-bar { margin: @green-gap; } .rsssl-step { .rsssl-step-header { &.incomplete a h2 { color: @gray; } text-decoration: none; a { display: inline-block; padding: 5px @green-gap; text-decoration: none; width: calc(100% - (@green-gap + @green-gap)); h2 { font-size: 15px; margin: 0; } } &.active a h2 { color: @gray !important; } &:hover a { h2 { text-decoration: underline; } } &.active:hover a { background: white; pointer-events: none; } } .rsssl-section { display: grid; grid-template-columns: @green-gap 1fr; span { align-self: center; justify-self: center; } margin: 0 @green-gap; a { h3 { color: @gray; } &:visited h3 { color: initial; } display: inline-block; text-decoration: none; padding: 3px 5px; h3 { font-size: 12px; font-weight: normal; margin: 0; } } &.active a h3 { color: grey; } &:hover a { h3 { text-decoration: underline; } } &.active:hover a { background: white; pointer-events: none; } } } } .rsssl-section-content { margin: 0.5 * @green-gap; p { margin: 0; } p:not(:first-child) { margin-top: 1em; } form { display: grid; grid-template-columns: auto 325px; grid-column-gap: @red-gap; .rsssl-section-content-title-header { background-color: white; } .rsssl-wizard-intro, .rsssl-template-intro .rsssl-master-label { grid-column-start: 1; background-color: white; padding: @green-gap @green-gap 0 @green-gap; } //if an intro is nested in a field, we don't need the padding, as the field already has padding .rsssl-field .rsssl-wizard-intro { padding: 0 0 @green-gap 0; } .rsssl-button { background-color: white; grid-column-start: 1; padding: @green-gap @green-gap 0 @green-gap; } .field-group { grid-column: span 2; display: grid; grid-template-columns: auto 325px; grid-column-gap: @red-gap; .rsssl-field { grid-column-start: 1; } .rsssl-help-warning-wrap { margin-top: -20px; } } .rsssl-section-footer { grid-column-start: 1; background-color: white; padding: @green-gap; display: grid; align-items: center; grid-template-columns: 1fr auto; .rsssl-buttons-container { grid-column-start: 2; input +input { margin-left: @green-gap; } } } } } .rsssl-add-pages-table { display: grid; grid-template-columns: auto auto auto; grid-gap: 5px; align-items: center; margin-bottom: @green-gap; span { justify-self: end; text-align: justify; } } .rsssl-link-to-menu-table { display: grid; grid-template-columns: 30% 30%; grid-gap: 5px; align-items: center; h3 { grid-column: span 2; margin-top: @green-gap; margin-bottom: 5px; &:first-child { margin-top: 0; } } select { grid-column-start: 2; } } .rsssl-cookies-table { h2 { font-weight: normal; font-size: 15px; } .rsssl-cookies-table-body { border-radius: 5px; display: grid; grid-template-columns: 1fr; padding: 10px; background-color: #f0f2f8; } } } #rsssl-wizard { /* ----------- Icons ----------- */ .rsssl-icon { margin:0 5px; width:initial; border-radius: 50%; &.rsssl-empty { visibility:hidden; } &.rsssl-success { color: @brand-primary; svg { fill: @brand-primary; stroke: @brand-primary; } } &.rsssl-green { color: #61ce70; svg { fill: #61ce70; stroke: #61ce70; } } &.rsssl-disabled { color: #ababab; svg { fill: #ababab; stroke: #ababab; } } &.rsssl-error { color: #d7263d; svg { fill: #d7263d; stroke: #d7263d; } } &.arrow-right-alt2::before { font-size: 14px; } } .rsssl-circle-green { height: 12px; width: 12px; border-radius: 12px; background-color: #61ce70; } .rsssl-circle-red { height: 12px; width: 12px; border-radius: 12px; background-color: #d7263d; } /* ----------- Fields ----------- */ /* Checkbox */ /* Disabled option */ .rsssl-not-allowed { cursor: not-allowed; } .rsssl-checkbox { .rsssl-field { display: flex; align-items: center; .rsssl-wizard-settings-text { margin-left: 20px; margin-top:5px; } } } /* Customize the label (the container) */ .rsssl-checkbox-container { display: block; position: relative; padding-left: 35px; /* Hide the browser's default checkbox */ input { position: absolute; opacity: 0; cursor: pointer; height: 0; width: 0; } /* Create a custom checkbox */ .checkmark { position: absolute; top: -2px; left: 0; height: 20px; width: 20px; border-radius: 5px; border: 1px solid @gray-light; } /* Checkmark (hidden when not checked) */ .checkmark svg { content: ""; position: absolute; display: none; } /* Show the checkmark when checked */ input:checked ~ .checkmark svg { display: block; fill: @brand-primary; stroke: @brand-primary; } /* Style the checkmark/indicator */ .checkmark svg { left: 2.5px; top: 2px; width: 15px; height: 15px; } /* Show the default checkmark when default */ .checkmark.rsssl-default svg { display: block; fill: #eee; stroke: #eee; } /* Disabled option */ &.rsssl-disabled { pointer-events: none; .checkmark { background-color: #eee; svg { stroke: #eee !important; fill: #eee !important; } } } } /* Radio */ /* Customize the label (the container) */ .rsssl-radio-container { display: block; position: relative; padding-left: 35px; /* Hide the browser's default checkbox */ input { position: absolute; opacity: 0; cursor: pointer; height: 0; width: 0; } /* Create a custom radio */ .radiobtn { position: absolute; top: -2px; left: 0; height: 20px; width: 20px; border-radius: 20px; border: 1px solid @input-border-color; } /* Check icon (hidden when not checked) */ .radiobtn div { content: ""; position: absolute; display: none; } /* Show check icon when checked */ input:checked ~ .radiobtn .rsssl-icon { display: block; background-color: @brand-primary; } /* Style the check icon */ .radiobtn .rsssl-icon { left: 5px; top: 3px; width: 10px; height: 10px; } /* Show the default checkmark when default */ .radiobtn.rsssl-default .rsssl-icon { display: block; background-color: #eee; } /* Disabled option */ &.rsssl-disabled { pointer-events: none; .radiobtn { background-color: #eee; .rsssl-icon { background-color: #eee !important; } } } } /* Text & Email Validation */ textarea.validation, input[type="text"].validation, input[type="password"].validation, input[type="email"].validation, input[type="text"].rsssl-valid-page, input[type="text"].rsssl-deleted-page { position: relative; padding-left: 30px; ~ span .rsssl-icon { display: block; position: absolute; padding-left: 7px; margin-top: -25px; z-index: 1; svg { width: 15px; height: 15px; } } } textarea.validation { &:invalid ~ span .rsssl-icon, &:valid ~ span .rsssl-icon { margin-top:-143px; } } textarea.validation, input[type="text"].validation, input[type="password"].validation, input[type="email"].validation { &:valid ~ span .rsssl-failed { display: none; } &:invalid ~ span .rsssl-success { display: none; } } input:disabled { background-color: @color-disabled; } /* Text, Email, Select(2), Textarea Style */ input[type="text"], input[type="password"], input[type="email"], select, .select2, textarea, input[type="number"] { // box-shadow: // 0 1px 1px rgba(0,0,0,0.06), // 0 2px 2px rgba(0,0,0,0.06); margin-bottom: 2px; } textarea { padding:10px; width:100%; height: 100px; margin: 20px 0; } /* Placeholders */ ::placeholder { color: @gray-light; } ::placeholder/* Chrome/Opera/Safari */ { color: @gray-light; } ::-moz-placeholder /* Firefox 19+ */ { color: @gray-light; } :-ms-input-placeholder /* IE 10+ */ { color: @gray-light; } :-moz-placeholder /* Firefox 18- */ { color: @gray-light; } /* Labels */ .rsssl-master-label h2 { padding: @green-gap @green-gap 0 @green-gap !important; } .rsssl-footer-contents { border-top: none; } .rsssl-grid.rsssl-gridless { display: flex; flex-wrap: wrap; height: inherit !important; .rsssl-grid-item { position: relative; //padding: 0 20px 20px 0; .rsssl-help-warning-wrap { display: none; } .rsssl-comment { display: none; } .rsssl-grid-header { height: initial; } .rsssl-grid-header-container { display: flex; justify-content: space-between; align-content: center; .rsssl-grid-controls { margin: auto 0; } } .item-container { height: calc(100% - 20px); width: calc(100% - 20px); margin-left: 10px; //margin-top: 10px; display: grid; grid-template-rows: auto 1fr auto; background-color: white; } .item-container .item-content { padding: 10px 0 0 0; margin: 0; clear: none; } .item-footer { background-color: white; height: initial; } .rsssl-checkbox .rsssl-field { display: flex; justify-content: space-between; align-content: center; padding: @green-gap @green-gap 0 @green-gap; } } .rsssl-grid-item.big { .item-container .item-content { display: grid; grid-auto-flow: row dense; grid-template-columns: 50% 50%; grid-auto-rows: minmax(min-content, max-content); } &.rsssl-customization .item-container .item-content { grid-auto-flow: row; } } .rsssl-cols-2 .rsssl-field { grid-column: span 2; display: grid; grid-template-columns: 100px 100px; grid-column-gap: 20px; .rsssl-label { grid-column: span 2; } } .rsssl-cols-3 .rsssl-field { grid-column: span 2; display: grid; grid-template-columns: 100px 100px 100px; grid-column-gap: 20px; .rsssl-label { grid-column: span 3; } } .rsssl-borderradius.rsssl-cols-5 .rsssl-field, .rsssl-borderwidth.rsssl-cols-5 .rsssl-field { display: grid; grid-template-columns: 50px 50px 50px 50px 50px; grid-column-gap: 10px; .rsssl-label { grid-column: span 5; } } .rsssl-border-input-type-wrap { display: grid; grid-template-rows: 16px 16px; padding-top: 16px; .rsssl-grey { color: darkgrey; } span { cursor: pointer; } } select { width: 100%; } .field-group { grid-column: span 2; } .rsssl-field { padding: 10px @green-gap 0 @green-gap; } .rsssl-borderradius, .rsssl-borderwidth { grid-column: span 1; } .field-group.rsssl-colspan-1 { grid-column: span 1; } .field-group.rsssl-colspan-2 { grid-column: span 2; } .field-group.rsssl-col-1 { grid-column-start: 1; } .field-group.rsssl-col-2 { grid-column-start: 2; } .rsssl-master-label h2 { grid-column: span 2; margin: 0; padding: @green-gap @green-gap 0 @green-gap; font-size: 18px; } .rsssl-sublabel label { color: darkgrey; font-size: 13px; } label .rsssl-icon { display: inline; } .rsssl-switch { margin-top: 0; } .wp-picker-input-wrap:not(.hidden) { display: block; position: absolute; z-index: 10; } .wp-picker-holder { position: absolute; top: 132px; z-index: 10; } .wp-picker-clear { position: absolute; } .rsssl-grid-controls .rsssl-field { padding: 0; .rsssl-label { margin: 0; } } } input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } /* Firefox */ input[type=number] { -moz-appearance: textfield; } } .rsssl-multiple-field-button-footer { display: flex; align-items: center; .rsssl-edit-item { margin-right: 5px; } } .rsssl-hidden { display: none !important; } /* START TOOLTIP STYLES */ [rsssl-tooltip] { position: relative; /* opinion 1 */ margin-left: 5px; } /* Applies to all tooltips */ [rsssl-tooltip]::before, [rsssl-tooltip]::after { text-transform: none; /* opinion 2 */ font-size: 1em; /* opinion 3 */ line-height: 1; user-select: none; pointer-events: none; position: absolute; display: none; opacity: 0; } [rsssl-tooltip]::before { content: ''; border: 5px solid transparent; /* opinion 4 */ z-index: 1001; /* absurdity 1 */ } [rsssl-tooltip]::after { content: attr(rsssl-tooltip); /* magic! */ min-width: 3em; font-weight:normal; overflow: hidden; text-overflow: ellipsis; padding: 1ch 1.5ch; border-radius: .3ch; box-shadow: 0 1em 2em -.5em rgba(0, 0, 0, 0.35); background: #333; color: #fff; z-index: 1000; /* absurdity 2 */ } /* Make the tooltips respond to hover */ [rsssl-tooltip]:hover::before, [rsssl-tooltip]:hover::after { display: block; } /* don't show empty tooltips */ [rsssl-tooltip='']::before, [rsssl-tooltip='']::after { display: none !important; } /* FLOW: UP */ [rsssl-tooltip]:not([flow])::before, [rsssl-tooltip][flow^="up"]::before { bottom: 100%; border-bottom-width: 0; border-top-color: #333; } [rsssl-tooltip]:not([flow])::after, [rsssl-tooltip][flow^="up"]::after { bottom: calc(100% + 5px); } [rsssl-tooltip]:not([flow])::before, [rsssl-tooltip]:not([flow])::after, [rsssl-tooltip][flow^="up"]::before, [rsssl-tooltip][flow^="up"]::after { left: 50%; transform: translate(-50%, -.5em); } /* FLOW: DOWN */ [rsssl-tooltip][flow^="down"]::before { top: 100%; border-top-width: 0; border-bottom-color: #333; } [rsssl-tooltip][flow^="down"]::after { top: calc(100% + 5px); } [rsssl-tooltip][flow^="down"]::before, [rsssl-tooltip][flow^="down"]::after { left: 50%; transform: translate(-50%, .5em); } /* FLOW: LEFT */ [rsssl-tooltip][flow^="left"]::before { top: 50%; border-right-width: 0; border-left-color: #333; left: calc(0em - 5px); transform: translate(-.5em, -50%); } [rsssl-tooltip][flow^="left"]::after { top: 50%; right: calc(100% + 5px); transform: translate(-.5em, -50%); } /* FLOW: RIGHT */ [rsssl-tooltip][flow^="right"]::before { top: 50%; border-left-width: 0; border-right-color: #333; right: calc(0em - 19px); transform: translate(.5em, -50%); } [rsssl-tooltip][flow^="right"]::after { top: 50%; left: calc(100% + 19px); transform: translate(.5em, -50%); min-width:300px; } /* KEYFRAMES */ @keyframes tooltips-vert { to { opacity: .9; transform: translate(-50%, 0); } } @keyframes tooltips-horz { to { opacity: .9; transform: translate(0, -50%); } } /* FX All The Things */ [rsssl-tooltip]:not([flow]):hover::before, [rsssl-tooltip]:not([flow]):hover::after, [rsssl-tooltip][flow^="up"]:hover::before, [rsssl-tooltip][flow^="up"]:hover::after, [rsssl-tooltip][flow^="down"]:hover::before, [rsssl-tooltip][flow^="down"]:hover::after { animation: tooltips-vert 300ms ease-out forwards; } [rsssl-tooltip][flow^="left"]:hover::before, [rsssl-tooltip][flow^="left"]:hover::after, [rsssl-tooltip][flow^="right"]:hover::before, [rsssl-tooltip][flow^="right"]:hover::after { animation: tooltips-horz 300ms ease-out forwards; } #rsssl-header { font-size:16px; .button-black { background-color: black; color: white; border-color: black; padding: 0 25px; } .link-black { color: black; padding: 5px 5px; } } .wp-editor-wrap iframe { height: initial !important; } .rsssl-help-warning-wrap { .rsssl-help-modal { h2 { margin-top:-5px; } .rsssl-pointer; position:absolute; z-index:99; &.rsssl-notice { background-color: @brand-primary; &:after { border-right: 15px solid @brand-primary; top: calc(50% - 15px); } color: black; padding: @green-gap; } &.rsssl-success { background-color: white; color: #61ce70; border: none; padding: 0; } &.rsssl-warning { &:after { border-right: 15px solid #f8be2e; } color: #333333; background-color: #f8be2e; border-color: #f8be2e; } margin: 0 0 0 @green-gap; padding: 10px 15px; color: #fff; background-color: @brand-primary; text-align: left; &:empty { background-color: #f1f1f1; } a { color: #333; } } } a:active, a:hover { color: #333; } a.button.rsssl-open-modal { font-size: 9px; line-height: 13px; height: 15px; min-height: 15px; padding: 1px 3px; margin-left: 10px; } .rsssl-panel-link { text-decoration: none; display: inline-block; width: 80%; } #rsssl_language { font-size: 15px; &.rsssl_cookie_language_selector { margin-bottom: 0; } } .multiple-field { div { margin-top: 8px; &:last-child { margin-bottom: 8px; } } } .rsssl-list-container { margin-bottom: 25px; .rsssl-cookie-field > div, .rsssl-service-field > div { margin-top: 8px; &:last-child { margin-bottom: 8px; } } .rsssl-disabled label, .rsssl-disabled span { color: #ababab !important; } .rsssl-service-cookie-list { margin-bottom: @green-gap; &:last-child { margin-bottom: 0px; } } .rsssl-service-divider { font-size: 15px; margin-bottom: 10px; } } .rsssl-legenda { padding: 10px 10px 0 10px; display: grid; grid-template-columns: 25px 200px 25px 300px; grid-column-gap: 10px; align-items: center; } .rsssl-panel { &.rsssl-toggle-disabled { color: #aca5a5; } &.rsssl-deleted { background-color: #FFa5aa; } .rsssl-panel-title { cursor: pointer; } .rsssl-field > div { margin: 10px 0; } .rsssl-multiple-field-validation { float: right; } &.rsssl-slide-panel, &.rsssl-link-panel { padding: 0; .rsssl-panel-toggle { display: flex; align-items: center; span { padding-left: 10px; } } .rsssl-panel-title { display: grid; grid-template-columns: 50% 10% 40%; align-items: center; span { &.rsssl-panel-toggle { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } &:last-of-type { display: flex; align-content: center; justify-content: flex-end; svg { width: 18px; height: 18px; padding-top: 1px; } } } padding: 10px 15px 8px 0; } .rsssl-add-to-policy { text-decoration: underline; } } &.rsssl-link-panel { &.selected, &:hover { box-shadow: 0 5px 5px rgba(0, 0, 0, 0.2), 0 3px 5px rgba(0, 0, 0, 0.13); } } .rsssl-panel-content { display: none; background-color: #fff; border: 1px solid #d6d8db; border-top: 0; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; padding: 10px 15px; } h1 { font-size: 22px; } font-size: 13px !important; p { font-size: 13px !important; } color: #383d41; background-color: #F2F2F2; border: 1px solid #d6d8db; padding: 10px 15px; border-radius: 0px; margin: 0; &.rsssl-notice { background-color: #fff; border: 0; color: black; padding: @green-gap @green-gap 0 @green-gap; } &.rsssl-success { background-color: white; color: #61ce70; border: none; padding: 0; } &.rsssl-warning { .rsssl-pointer; &:after { border-right: 15px solid #f8be2e; } color: #333333; background-color: #f8be2e; border-color: #f8be2e; margin: 10px 0 10px 0; } ul { list-style-type: disc; margin-left: 22px; } } input[type="text"], input[type="password"], input[type="email"], input[type="number"] { width: 100%; } /* cool checkbox sliders */ .rsssl-switch { input { display: none !important; } position: relative; display: inline-block; width: 40px; height: 21px; } .rsssl-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; &:before { position: absolute; content: ""; height: 15px; width: 15px; left: 4px; bottom: 3px; background-color: white; -webkit-transition: .4s; transition: .4s; } &.rsssl-round { border-radius: 20px; } &.rsssl-round:before { border-radius: 50%; } } .rsssl-slider-na { padding: 2px 8px; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; &:before { position: absolute; content: "N/A"; color: white; } &.rsssl-round { border-radius: 20px; } } input:checked + .rsssl-slider { background-color: @brand-primary; &:before { -webkit-transform: translateX(17px); -ms-transform: translateX(17px); transform: translateX(17px); } } //input:disabled + .rsssl-slider { // background-color: lighten(#ccc, 40%); // &:before{ // //background-color:#c6c6c6; // } //} input:checked:disabled + .rsssl-slider { background-color: lighten(@brand-primary, 40%); &:before { //background-color:#c6c6c6; } } input:focus + .rsssl-slider { box-shadow: 0 0 1px @brand-primary; } #complete_wizard_first_notice { position: fixed; /* Sit on top of the page content */ width: 100%; /* Full width (cover the whole page) */ height: 100%; /* Full height (cover the whole page) */ top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.7); /* Black background with opacity */ z-index: 99; p { border-radius: 0px; font-size: 16px; background-color: @brand-primary; color: white; position: relative; /* height: 100px; */ top: 150px; padding: 30px; width: 300px; text-align: center; margin: auto; } } //prevent a too small editor width html .mceContentBody { max-width: 100% !important; } .cookie-warning { textarea { width: 100%; height: 100px; } } .rsssl-comment { font-size:11px; margin-top: 10px; } .rsssl-cookie-field { .rsssl-cookie-header { border-bottom: 1px solid #b6b7b8; margin-bottom: 25px; } } #rsssl-send-data { input[type=text] { width: 60%; } } #rsssl-start-mail, #rsssl_close_tb_window { margin-right: 15px; margin-top: 15px; } #rsssl-wizard { h1, h2, h3, h4, .rsssl-menu-item, .rsssl-step-title, .rsssl-button { font-variant: normal; } h2, h3 { font-size:15px; } h3 { font-weight: 400; } label { font-size: 13px; } .field-group { position: relative; .rsssl-field { padding: 0 @green-gap 0 @green-gap; background-color: white; .rsssl-template-intro { margin-top: @red-gap; } } .rsssl-title-wrap { font-size: 15px; font-weight: 700; padding-top: @red-gap; } .rsssl-label { margin-bottom: 10px; label { display:flex; flex-direction: column; font-size:15px; cursor: default; .rsssl-label-wrap { display: flex; margin-top: @red-gap; font-weight: 700; } .rsssl-subtitle-wrap { font-size: 0.9em; margin: 5px 5px 0 0; } } } //less margin when it's the editor &.rsssl-editor .rsssl-label { margin-bottom:0; } .rsssl-field { .field-group { grid-column:1; display:block; } .rsssl-field { padding:0; } } } /*body */ .rsssl-body, #rsssl-content-area { input[type="text"].rsssl-document-custom-url { width: 250px; } .rsssl-document-custom-url, .rsssl-document-custom-page { margin-top: 5px; } input.button { min-width: 100px; &.button-red { background-color: red; color: white; border-color: red; } &.button-black { background-color: black; color: white; border-color: black; } &.button-link { text-align: center; min-width:initial; &:hover { background-color:initial; text-decoration: none; } } } button { &.button-red { background-color: red; color: white; border-color: red; } } /* Styling for the previous and next buttons */ .rsssl-master-label h2 { margin: 0; padding: @green-gap @green-gap 0 0; font-size: 18px; background-color: white; } //Add some styling to the remove, rescan and add new cookie buttons to override the default WordPress button styling .rsssl-remove { margin-bottom: 12px; } .rsssl-rescan { padding: 0 10px 0 10px; } /* CSS for the sections menu */ .rsssl-menu-item.active { i { color: black; font-size: 1.35em; float: left; } a { color: #000; font-weight: 900; padding-left: 7px; text-decoration: underline; } } .rsssl-done a { text-decoration: none; color: white; font-size: 15px; } .rsssl-to-do a { color: white; font-size: 15px; text-decoration: none; opacity: 0.6; } //Reset the vertical-align: middle that WordPress applies. The vertical-align middle presses the next and previous icons downwards @media screen and (max-width: 782px) { input { vertical-align: top !important; } } } } //Dashboard .rsssl-field { /* Define the styling of the text input fields */ label { font-weight: normal; margin: 10px 0 2px; } .rsssl-color-picker.wp-color-picker { margin-top: -11px !important; } input[type="text"], input[type="email"], input[type="number"] { //max-width: 500px; border-color: @input-border-color; } select { border-color: @input-background-color; vertical-align: initial; } textarea.validation:invalid, textarea.validation:valid { background-position: 0.5% 1.5%; border-color: @input-border-color; } textarea { min-height: 150px; width:100%; } input[type=radio]:checked:before { content: "\2022"; text-indent: -9999px; border-radius: 50px; font-size: 24px; width: 6px; height: 6px; margin: 4px; line-height: 16px; background-color: #1e8cbe; } .rsssl-panel { &.rsssl-notice { padding: 0 0 10px 0; } } .rsssl-buttons-row-left { display: flex; align-items: center; height: auto; input, select, div { margin-right: 20px; } margin-bottom: 10px; } button[name=rsssl_add_multiple] { margin-top: @green-gap; } } //Button styling a.rsssl.button, button.rsssl.button, input.rsssl.button { margin-left:15px; box-shadow: 0 0 0 #fff; background-color: @brand-primary; color: #fff; padding-right: 20px; border: 0; border-radius: 50px; padding-top: 2px; &:hover { background-color: lighten(@brand-primary, 10%); color: white; } .fa-angle-right { font-weight: 900; position: absolute; font-size: 1.8em; margin-top: 1px; margin-left: 5px; } } //Icon override #rsssl-wizard .dashboard .fa-times { color: black; } #rsssl-wizard .dashboard .fa-check { color: @brand-primary; } /* building our new structured css here */ .rsssl-dashboard-container { .rsssl-dashboard-title { padding-top: 22px; font-weight: 600; font-size: 24px; line-height: 30px; margin-bottom: 20px; @media screen and (max-width: 720px) { padding-bottom: 0px; } } } .rsssl-dashboard-header .rsssl-header-top { min-height: 60px; } .rsssl-header-top { grid-area: header-top; background-color: #F2F2F2; min-height: 30px; padding-top: 25px; .rsssl-premium-cta { width: 150px; float: right; border-color: @brand-primary; color: @brand-primary; text-transform: uppercase; display: flex; } } .rsssl-dashboard-container { background-color: white; display: flex; flex-wrap: wrap; .rsssl-dashboard-header { margin-bottom: -270px; width: 100%; min-height: 220px; background-color: @brand-primary; background-repeat: no-repeat; //background-image: url(../images/rsssl-header.png); background-attachment: scroll; background-position: bottom center; .rsssl-header-text { display: flex; align-items: center; } } .rsssl-dashboard-item { background-color: #fff; width: 450px; margin-top: 10px; border: 2px solid; flex: 0 0 450px; flex-shrink: 1; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 0px; border-color: #f2f2f2; overflow: hidden; } .rsssl-dashboard-item .rsssl-top h1 { font-weight: 600; font-size: 2.5em; padding: 25px; } .rsssl-dashboard-content-container { margin: 0 auto; display: grid; grid-template-areas: 'header-top header-top header-top header-top' 'text-completed text-completed text-completed text-completed' 'progress progress support support' 'progress progress documents documents' 'footer footer footer footer'; @media screen and (max-width: 1210px) { grid-template-areas: 'header-top header-top' 'text-completed text-completed' 'progress progress' 'support support' 'documents documents' 'footer footer' 'footer footer'; } .rsssl-logo { display: flex; align-items: center; font-size: 1.5em; font-weight: 600; } .rsssl-header-text { display: flex; align-items: center; } .rsssl-completed-text { display: flex; align-items: center; margin-top: 35px; grid-area: text-completed; font-size: 24px; color: white; @media screen and (max-width: 720px) { button { width: 100px; } } } grid-gap: 10px; padding: 10px; .rsssl-dashboard-info { font-size: 19px; font-weight: bold; padding-top: 20px; padding-bottom: 10px; } .rsssl-dashboard-text { color: black; font-weight: 400; padding: 15px; li { border-bottom: 1px solid; } .fa-plus { margin-right: 8px; } &.free { background-color: #000; color: #fff; min-height: 40px; } } .rsssl-dashboard-progress { @media screen and (max-width: 1210px) { margin: 0 auto; } grid-area: progress; .rsssl-dashboard-progress-top { background-color: #F2F2F2; min-height: 170px; .rsssl-dashboard-top-text { display: inline-grid; font-size: 18px; line-height: 22px; max-width: 60%; float: left; .rsssl-dashboard-top-text-subtitle { color: @brand-primary; } } } .rsssl-continue-wizard-btn { padding-top: 125px; button { text-align: -webkit-left; border-radius: 50px; } } .rsssl-percentage-complete { margin-top: 20px; float: right; } .rsssl-steps-table { padding-top: 10px; .i.fa.fa-check { color: black; } .rsssl-success, .rsssl-error { color: black; } } } .rsssl-dashboard-support { width: 450px; @media screen and (max-width: 1210px) { margin: 0 auto; } input[type=text], input[type=email], textarea, input[type=submit] { width: 425px; margin-bottom: 5px; margin-top: 5px; } textarea { min-height: 100px; } input[type=submit] { margin: auto; } grid-area: support; } .rsssl-dashboard-documents { @media screen and (max-width: 1210px) { margin: 0 auto; } grid-area: documents; margin-top: 10px; .rsssl-upgrade-table { padding-bottom: 15px; .fas { margin-right: 8px; } ul { margin: 5px; } li { border-bottom: 2px solid; margin-bottom: 5px; text-indent: 5px; display: flex; vertical-align: middle; margin-left: 8px; } .fa-plus { color: @brand-primary; font-size: 1.5em; } } .rsssl-documents-bottom { color: white; background-color: black; min-height: 70px; font-size: 14px; div { margin-bottom: 10px; } //display: flex; } } .rsssl-dashboard-footer { grid-area: footer; display: flex; flex-shrink: 1; flex-grow: 1; margin-top: 20px; flex-wrap: wrap; justify-content: center; padding-bottom: 20px; .rsssl-footer-block { position: relative; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 0px; background-color: #F2F2F2; width: 205px; min-height: 70px; //margin-top: 10px; margin: 5px auto; a { position: absolute; top: 5px; right: 5px; } .rsssl-footer-title { margin-top: 9px; margin-left: 9px; font-weight: 900; font-size: 1.2em; margin-right: 35px; } .rsssl-footer-description { width: 70%; margin-left: 9px; font-size: 0.8em; display: flex; } .rsssl-external-btn { text-align: center; border-radius: 7px; color: @brand-primary; width: 25px; height: 20px; float: right; .fa-angle-right { font-size: 1.5em; vertical-align: middle; margin-left: 2px; } } } } } } /*skeleton*/ @panelheight : 38px; @panelborder : 1px; @paneloffset : 3*(@panelborder+@panelheight); @rows : 6; .rsssl-skeleton:empty { margin: auto; margin-bottom: 25px; width: 100%; height: (@rows*@panelheight)+(@rows+1)*@panelborder; /* change height to see repeat-y behavior */ background-image: linear-gradient( 100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5) 70%, rgba(255, 255, 255, 0.5) 15% ), linear-gradient( #f2f2f2 @panelheight, transparent 0 ), linear-gradient( #f2f2f2 @panelheight, transparent 0 ), linear-gradient( #f2f2f2 @panelheight, transparent 0 ), linear-gradient( #f2f2f2 @panelheight, transparent 0 ); background-repeat: repeat-y; background-size: 50px 200px, /* highlight */ 100% @paneloffset, 100% @paneloffset, 100% @paneloffset, 100% @paneloffset; background-position: 0 0, /* highlight */ @panelborder @panelborder, @panelborder @panelheight+(2*@panelborder), @panelborder (2*@panelheight)+(3*@panelborder), @panelborder (3*@panelheight)+(4*@panelborder); background-color:#d6d8db; animation: shine 2.5s infinite; } @keyframes shine { to { background-position: 100% 0, /* move highlight to right */ @panelborder @panelborder, @panelborder @panelheight+(2*@panelborder), @panelborder (2*@panelheight)+(3*@panelborder), @panelborder (3*@panelheight)+(4*@panelborder); } } @-webkit-keyframes sk-stretchdelay { 0%, 40%, 100% { -webkit-transform: scaleY(0.4) } 20% { -webkit-transform: scaleY(1.0) } } @keyframes sk-stretchdelay { 0%, 40%, 100% { transform: scaleY(0.4); -webkit-transform: scaleY(0.4); } 20% { transform: scaleY(1.0); -webkit-transform: scaleY(1.0); } } .rsssl-wizard-menu-menus { padding-top: 10px; } //.rsssl-cookie-settings-content { // padding-top: 10px; // display: grid; // grid-template-columns: 815px 1fr; // grid-template-rows: calc(100vh - 160px); //} .rsssl-scroll { overflow: scroll; scroll-behavior: smooth; overflow-x: hidden; } #wpbody-content { padding-bottom: 0; } // This will make color pickers overlap #customization { z-index: 10; } .cc-window { right: 1em; } .cc-window.cc-center { transform: translate(0%, -50%); left: initial; } .cc-window.cc-left { left: initial; } // At cookie settings, banner center is to the right @keyframes slideInUpCenter { from { -webkit-transform: translate3d(0, 150%, 0); transform: translate3d(0, 150%, 0); } to { -webkit-transform: translate3d(0, -50%, 0); transform: translate3d(0, -50%, 0); } } @keyframes slideOutUpCenter { to { -webkit-transform: translate3d(0, 150%, 0); transform: translate3d(0, 150%, 0); opacity: 1; } from { -webkit-transform: translate3d(0, -50%, 0); transform: translate3d(0, -50%, 0); opacity: 1; } } .rsssl-wizard-wrap { margin: 0; } #rsssl-proof-of-consent, #rsssl-cookie-banner { #rsssl-content-area { display: block; h1 { background-color: white; padding: @green-gap; //margin: @red-gap; border-bottom: 1px solid #eeeeee; } .rsssl-panel { padding: @green-gap; margin-bottom: @green-gap; } .rsssl-notice { background-color: white; } input[name=rsssl_generate_snapshot] { width: 120px; } .rsssl-month-select, .rsssl-year-select, #post-query-submit { float: right; margin-top: -50px; width: 120px; } #post-query-submit { margin-right: 0; } .rsssl-month-select { margin-right: 290px; } .rsssl-year-select { margin-right: 145px; } .tablenav { display: none; } #rsssl-cookiestatement-snapshot-filter { padding-top: @green-gap; } .wp-list-table { font-weight: bold; th { font-weight: bold; a { padding: @red-gap; } } } } } #wpbody-content { .update-nag { display: none; } .subsubsub { display: none; } .wp-heading-inline { padding: @green-gap 0; } .rsssl-document-button { margin-top: 22px; margin-left: 15px; } .cookie-warning .rsssl-document-button{ margin-top: 0; } #rsssl-region-select { margin-top: -6px; margin-left: 15px; width: 100px; } } #posts-filter { .bulkactions, .tablenav-pages, .search-box { display: none; } .tablenav.top { margin-top: 0; padding-top: 0; } .wp-list-table { font-weight: bold; th { font-weight: bold; a { padding: @red-gap; } } } } wizard/assets/css/variables.css.map 0000644 00000000000 15154444756 0013401 0 ustar 00 wizard/assets/css/wizard.css.map 0000644 00000051556 15154444756 0012757 0 ustar 00 {"version":3,"sources":["wizard.less"],"names":[],"mappings":"AAeA;EACE,cAAA;EACA,kBAAA;EACA,sBAAA;EACA,UAAA;EACA,mBAAA;;AAEF;EACE,aAAA;EACA,cAAA;;AAEF,cAAe,6BACb,EAAC;EACC,gBAAA;;;;;AAMJ;EACE,kBAAA;;AACA,cAAC;EACC,SAAS,GAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,kCAAA;EACA,8BAAA;EACA,iBAAA;EACA,qCAAA;;AAGJ;EACM,aAAA;EACA,iCAAA;;AAFN,mBAKM;EACE,UAAA;;AANR,mBASM;EACE,aAAA;EACA,gCAAA;EACA,aAAA;EAMA,8BAAA;EACA,qBAAA;;AAnBR,mBASM,oBAKE;EACE,eAAA;;AAMF,mBAZF,oBAYG;EACC,gCAAA;;AADF,mBAZF,oBAYG,2CAGC;EACE,mBAAA;;AAzBZ,mBA8BM,uBAAuB;EACrB,wBAAA;EACA,eAAA;;AAhCR,mBAmCM;EACE,mBAAA;EACA,YAAA;EACA,kBAAA;;AAtCR,mBAmCM,2BAKE;EACE,sBAAA;EACA,8BAAA;EACA,YAAA;EACA,mBAAA;EACA,kBAAA;;AACA,mBAXJ,2BAKE,iCAMG;EACC,yBAAA;;AA/CZ,mBAoDM;EACE,sBAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;;AAxDR,mBA2DM;EACE,uBAAA;EACA,YAAA;EACA,gBAAA;EACA,oBAAA;EACA,gDAAA;;AAhER,mBA2DM,mBAOE,mBAAmB;EACjB,iBAAA;;AAnEV,mBA2DM,mBAUE;EACE,YAAA;;AAtEV,mBA2DM,mBAeE,YACE;EAKE,qBAAA;;AAJA,mBAjBN,mBAeE,YACE,mBACG,WAAY,EAAE;EACb,cAAA;;AA7Ed,mBA2DM,mBAeE,YACE,mBAOE;EACE,qBAAA;EACA,iBAAA;EACA,qBAAA;EACA,OAAO,0BAAP;;AAtFd,mBA2DM,mBAeE,YACE,mBAOE,EAME;EACE,eAAA;EACA,SAAA;;AAIJ,mBAnCN,mBAeE,YACE,mBAmBG,OAAQ,EAAE;EACT,cAAA;;AAGF,mBAvCN,mBAeE,YACE,mBAuBG,MAAO,EACN;EACE,0BAAA;;AAIJ,mBA7CN,mBAeE,YACE,mBA6BG,OAAO,MAAO;EACb,iBAAA;EACA,oBAAA;;AA1Gd,mBA2DM,mBAeE,YAoCE;EACE,aAAA;EACA,+BAAA;EAOA,cAAA;;AAvHZ,mBA2DM,mBAeE,YAoCE,eAIE;EACE,kBAAA;EACA,oBAAA;;AApHd,mBA2DM,mBAeE,YAoCE,eAWE;EASE,qBAAA;EACA,qBAAA;EACA,gBAAA;;AApId,mBA2DM,mBAeE,YAoCE,eAWE,EACE;EACE,cAAA;;AAGF,mBAnER,mBAeE,YAoCE,eAWE,EAKG,QAAS;EACR,cAAA;;AA/HhB,mBA2DM,mBAeE,YAoCE,eAWE,EAaE;EACE,eAAA;EACA,mBAAA;EACA,SAAA;;AAIJ,mBAlFN,mBAeE,YAoCE,eA+BG,OAAQ,EAAE;EACT,WAAA;;AAGF,mBAtFN,mBAeE,YAoCE,eAmCG,MAAO,EACN;EACE,0BAAA;;AAIJ,mBA5FN,mBAeE,YAoCE,eAyCG,OAAO,MAAO;EACb,iBAAA;EACA,oBAAA;;AAzJd,mBAgKM;EACE,YAAA;;AAjKR,mBAgKM,uBAGE;EACE,SAAA;;AApKV,mBAgKM,uBAOE,EAAC,IAAI;EACH,eAAA;;AAxKV,mBAgKM,uBAWE;EACE,aAAA;EACA,iCAAA;EACA,qBAAA;;AA9KV,mBAgKM,uBAWE,KAKE;EACE,uBAAA;;AAjLZ,mBAgKM,uBAWE,KASE;AApLV,mBAgKM,uBAWE,KASuB,sBACrB;EACE,oBAAA;EACA,uBAAA;EACA,yBAAA;;AAxLZ,mBAgKM,uBAWE,KAiBE,aAAa;EACX,mBAAA;;AA7LZ,mBAgKM,uBAWE,KAqBE;EACE,uBAAA;EACA,oBAAA;EACA,yBAAA;;AAnMZ,mBAgKM,uBAWE,KA2BE;EACE,mBAAA;EACA,aAAA;EACA,iCAAA;EACA,qBAAA;;AA1MZ,mBAgKM,uBAWE,KA2BE,aAME;EACE,oBAAA;;AA7Md,mBAgKM,uBAWE,KA2BE,aASE;EACE,iBAAA;;AAhNd,mBAgKM,uBAWE,KAyCE;EACE,oBAAA;EACA,uBAAA;EACA,aAAA;EACA,aAAA;EACA,mBAAA;EACA,+BAAA;;AA1NZ,mBAgKM,uBAWE,KAyCE,sBAQE;EACE,oBAAA;;AA7Nd,mBAgKM,uBAWE,KAyCE,sBAQE,yBAGE,MAAM;EACJ,iBAAA;;AAhOhB,mBAuOM;EACE,aAAA;EACA,qCAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;;AA5OR,mBAuOM,uBAOE;EACE,iBAAA;EACA,mBAAA;;AAhPV,mBAoPM;EACE,aAAA;EACA,8BAAA;EACA,aAAA;EACA,mBAAA;;AAxPR,mBAoPM,0BAME;EACE,mBAAA;EACA,gBAAA;EACA,kBAAA;;AAEA,mBAXJ,0BAME,GAKG;EACC,aAAA;;AAhQZ,mBAoPM,0BAgBE;EACE,oBAAA;;AArQV,mBAyQM,qBACE;EACE,mBAAA;EACA,eAAA;;AA5QV,mBAyQM,qBAME;EACE,kBAAA;EACA,aAAA;EACA,0BAAA;EACA,aAAA;EACA,yBAAA;;AAOV;;;;;;;;;;;;;;AAAA,aAIE;EACE,aAAA;EACA,cAAA;EACA,kBAAA;;AACA,aAJF,YAIG;EACC,kBAAA;;AAEF,aAPF,YAOG;EACC,cAAA;;AADF,aAPF,YAOG,cAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aAfF,YAeG;EACC,cAAA;;AADF,aAfF,YAeG,YAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aAvBF,YAuBG;EACC,cAAA;;AADF,aAvBF,YAuBG,eAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aA/BF,YA+BG;EACC,cAAA;;AADF,aA/BF,YA+BG,YAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aAvCF,YAuCG,iBAAiB;EAChB,eAAA;;AA5CN,aAgDE;EACE,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AApDJ,aAsDE;EACE,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AA1DJ,aAkEE;EACE,mBAAA;;AAnEJ,aAsEE,gBACE;EACE,aAAA;EACA,mBAAA;;AAzEN,aAsEE,gBACE,aAGE;EACE,iBAAA;EACA,eAAA;;AA5ER,aAkFE;EACE,cAAA;EACA,kBAAA;EACA,kBAAA;;;;;;;;;AArFJ,aAkFE,0BAME;EACE,kBAAA;EACA,UAAA;EACA,eAAA;EACA,SAAA;EACA,QAAA;;AA7FN,aAkFE,0BAeE;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,yBAAA;;AAxGN,aAkFE,0BA0BE,WAAW;EACT,SAAS,EAAT;EACA,kBAAA;EACA,aAAA;;AA/GN,aAkFE,0BAiCE,MAAK,QAAS,aAAa;EACzB,cAAA;EACA,aAAA;EACA,eAAA;;AAtHN,aAkFE,0BAwCE,WAAW;EACT,WAAA;EACA,QAAA;EACA,WAAA;EACA,YAAA;;AA9HN,aAkFE,0BAgDE,WAAU,cAAe;EACvB,cAAA;EACA,UAAA;EACA,YAAA;;AAIF,aAvDF,0BAuDG;EACC,oBAAA;;AADF,aAvDF,0BAuDG,eAEC;EACE,sBAAA;;AAHJ,aAvDF,0BAuDG,eAEC,WAEE;EACE,YAAA;EACA,UAAA;;AA/IV,aAyJE;EACE,cAAA;EACA,kBAAA;EACA,kBAAA;;;;;;;;;AA5JJ,aAyJE,uBAME;EACE,kBAAA;EACA,UAAA;EACA,eAAA;EACA,SAAA;EACA,QAAA;;AApKN,aAyJE,uBAeE;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AA/KN,aAyJE,uBA0BE,UAAU;EACR,SAAS,EAAT;EACA,kBAAA;EACA,aAAA;;AAtLN,aAyJE,uBAiCE,MAAK,QAAS,YAAY;EACxB,cAAA;EACA,yBAAA;;AA5LN,aAyJE,uBAuCE,UAAU;EACR,SAAA;EACA,QAAA;EACA,WAAA;EACA,YAAA;;AApMN,aAyJE,uBA+CE,UAAS,cAAe;EACtB,cAAA;EACA,sBAAA;;AAIF,aArDF,uBAqDG;EACC,oBAAA;;AADF,aArDF,uBAqDG,eAEC;EACE,sBAAA;;AAHJ,aArDF,uBAqDG,eAEC,UAEE;EACE,sBAAA;;AAnNV,aA0NE,SAAQ;AA1NV,aA2NE,MAAK,aAAa;AA3NpB,aA4NE,MAAK,iBAAiB;AA5NxB,aA6NE,MAAK,cAAc;AA7NrB,aA8NE,MAAK,aAAa;AA9NpB,aA+NE,MAAK,aAAa;EAChB,kBAAA;EACA,kBAAA;;AAjOJ,aA0NE,SAAQ,WAQN,OAAO;AAlOX,aA2NE,MAAK,aAAa,WAOhB,OAAO;AAlOX,aA4NE,MAAK,iBAAiB,WAMpB,OAAO;AAlOX,aA6NE,MAAK,cAAc,WAKjB,OAAO;AAlOX,aA8NE,MAAK,aAAa,iBAIhB,OAAO;AAlOX,aA+NE,MAAK,aAAa,mBAGhB,OAAO;EACL,cAAA;EACA,kBAAA;EACA,iBAAA;EACA,iBAAA;EACA,UAAA;;AAvON,aA0NE,SAAQ,WAQN,OAAO,YAML;AAxON,aA2NE,MAAK,aAAa,WAOhB,OAAO,YAML;AAxON,aA4NE,MAAK,iBAAiB,WAMpB,OAAO,YAML;AAxON,aA6NE,MAAK,cAAc,WAKjB,OAAO,YAML;AAxON,aA8NE,MAAK,aAAa,iBAIhB,OAAO,YAML;AAxON,aA+NE,MAAK,aAAa,mBAGhB,OAAO,YAML;EACE,WAAA;EACA,YAAA;;AAMJ,aADF,SAAQ,WACL,QAAS,OAAO;AACjB,aAFF,SAAQ,WAEL,MAAO,OAAO;EACb,kBAAA;;AAQF,aAJF,SAAQ,WAIL,MAAO,OAAO;AAAf,aAHF,MAAK,aAAa,WAGf,MAAO,OAAO;AAAf,aAFF,MAAK,iBAAiB,WAEnB,MAAO,OAAO;AAAf,aADF,MAAK,cAAc,WAChB,MAAO,OAAO;EACb,aAAA;;AAEF,aAPF,SAAQ,WAOL,QAAS,OAAO;AAAjB,aANF,MAAK,aAAa,WAMf,QAAS,OAAO;AAAjB,aALF,MAAK,iBAAiB,WAKnB,QAAS,OAAO;AAAjB,aAJF,MAAK,cAAc,WAIhB,QAAS,OAAO;EACf,aAAA;;AA9PN,aAkQE,MAAK;EACH,yBAAA;;AAnQJ,aAwQE,MAAK;AAxQP,aAwQsB,MAAK;AAxQ3B,aAwQ8C,MAAK;AAxQnD,aAwQmE;AAxQnE,aAwQ2E;AAxQ3E,aAwQqF;AAxQrF,aAwQ+F,MAAK;EAIhG,kBAAA;;AA5QJ,aA8QE;EACE,aAAA;EACA,WAAA;EACA,aAAA;EACA,cAAA;;AAlRJ,aAsRE;EACE,cAAA;;AAvRJ,aAyRE;EACE,cAAA;;AA1RJ,aA6RE;EACE,cAAA;;AA9RJ,aAiSE;EACE,cAAA;;AAlSJ,aAoSE;EACE,cAAA;;AArSJ,aA0SE,oBAAoB;EAClB,yBAAA;;AA3SJ,aA8SE;EACE,gBAAA;;AA/SJ,aAkTE,YAAW;EACT,aAAA;EACA,eAAA;EACA,0BAAA;;AArTJ,aAkTE,YAAW,eAIT;EACE,kBAAA;;AAvTN,aAkTE,YAAW,eAIT,iBAIE;EACE,aAAA;;AA3TR,aAkTE,YAAW,eAIT,iBAOE;EACE,aAAA;;AA9TR,aAkTE,YAAW,eAIT,iBAWE;EACE,eAAA;;AAlUR,aAkTE,YAAW,eAIT,iBAeE;EACE,aAAA;EACA,8BAAA;EACA,qBAAA;;AAxUR,aAkTE,YAAW,eAIT,iBAeE,6BAKE;EACE,cAAA;;AA3UV,aAkTE,YAAW,eAIT,iBAyBE;EACE,QAAQ,iBAAR;EACA,OAAO,iBAAP;EACA,iBAAA;EAEA,aAAA;EACA,iCAAA;EACA,uBAAA;;AAtVR,aAkTE,YAAW,eAIT,iBAmCE,gBAAgB;EACd,mBAAA;EACA,SAAA;EACA,WAAA;;AA5VR,aAkTE,YAAW,eAIT,iBAyCE;EACE,uBAAA;EACA,eAAA;;AAjWR,aAkTE,YAAW,eAIT,iBA8CE,gBAAgB;EACd,aAAA;EACA,8BAAA;EACA,qBAAA;EACA,yBAAA;;AAxWR,aAkTE,YAAW,eA0DT,iBAAgB,IACd,gBAAgB;EACd,aAAA;EACA,yBAAA;EACA,8BAAA;EACA,gBAAgB,gCAAhB;;AAGF,aAlEJ,YAAW,eA0DT,iBAAgB,IAQb,oBAAqB,gBAAgB;EACpC,mBAAA;;AArXR,aAkTE,YAAW,eAwET,cAAc;EACZ,mBAAA;EACA,aAAA;EACA,kCAAA;EACA,qBAAA;;AA9XN,aAkTE,YAAW,eAwET,cAAc,aAMZ;EACE,mBAAA;;AAjYR,aAkTE,YAAW,eAmFT,cAAc;EACZ,mBAAA;EACA,aAAA;EACA,wCAAA;EACA,qBAAA;;AAzYN,aAkTE,YAAW,eAmFT,cAAc,aAMZ;EACE,mBAAA;;AA5YR,aAkTE,YAAW,eA8FT,oBAAmB,aAAc;AAhZrC,aAkTE,YAAW,eA8FsC,mBAAkB,aAAc;EAC7E,aAAA;EACA,+CAAA;EACA,qBAAA;;AAnZN,aAkTE,YAAW,eA8FT,oBAAmB,aAAc,aAK/B;AArZN,aAkTE,YAAW,eA8FsC,mBAAkB,aAAc,aAK7E;EACE,mBAAA;;AAtZR,aAkTE,YAAW,eAwGT;EACE,aAAA;EACA,6BAAA;EACA,iBAAA;;AA7ZN,aAkTE,YAAW,eAwGT,8BAKE;EACE,eAAA;;AAhaR,aAkTE,YAAW,eAwGT,8BAQE;EACE,eAAA;;AAnaR,aAkTE,YAAW,eAqHT;EACE,WAAA;;AAxaN,aAkTE,YAAW,eAyHT;EACE,mBAAA;;AA5aN,aAkTE,YAAW,eA6HT;EACE,yBAAA;;AAhbN,aAkTE,YAAW,eAiIT;AAnbJ,aAkTE,YAAW,eAkIT;EACE,mBAAA;;AArbN,aAkTE,YAAW,eAsIT,aAAY;EACV,mBAAA;;AAzbN,aAkTE,YAAW,eA0IT,aAAY;EACV,mBAAA;;AA7bN,aAkTE,YAAW,eA8IT,aAAY;EACV,oBAAA;;AAjcN,aAkTE,YAAW,eAkJT,aAAY;EACV,oBAAA;;AArcN,aAkTE,YAAW,eAsJT,oBAAoB;EAClB,mBAAA;EACA,SAAA;EACA,yBAAA;EACA,eAAA;;AA5cN,aAkTE,YAAW,eA6JT,gBAAgB;EACd,eAAA;EACA,eAAA;;AAjdN,aAkTE,YAAW,eAkKT,MAAM;EACJ,eAAA;;AArdN,aAkTE,YAAW,eAsKT;EACE,aAAA;;AAzdN,aAkTE,YAAW,eA0KT,sBAAqB,IAAI;EACvB,cAAA;EACA,kBAAA;EACA,WAAA;;AA/dN,aAkTE,YAAW,eAgLT;EACE,kBAAA;EACA,UAAA;EACA,WAAA;;AAreN,aAkTE,YAAW,eAsLT;EACE,kBAAA;;AAzeN,aAkTE,YAAW,eA0LT,qBAAqB;EACnB,UAAA;;AA7eN,aAkTE,YAAW,eA0LT,qBAAqB,aAEnB;EACE,SAAA;;AA/eR,aAqfE,MAAK;AArfP,aAsfE,MAAK;EACH,wBAAA;EACA,SAAA;;AAxfJ,aA4fE,MAAK;EACH,0BAAA;;AAKJ;EACE,aAAA;EACA,mBAAA;;AAFF,mCAGE;EACE,iBAAA;;AAIJ;EACE,wBAAA;;;AAIF;EACE,kBAAA;;EACA,gBAAA;;;AAIF,eAAe;AACf,eAAe;EACb,oBAAA;;EACA,cAAA;;EACA,cAAA;EACA,iBAAA;EACA,oBAAA;EACA,kBAAA;EACA,aAAA;EACA,UAAA;;AAGF,eAAe;EACb,SAAS,EAAT;EACA,6BAAA;;EACA,aAAA;;;AAGF,eAAe;EACb,SAAS,mBAAT;;EACA,cAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,kBAAA;EACA,oBAAA;EACA,gDAAA;EACA,gBAAA;EACA,WAAA;EACA,aAAA;;;;AAIF,eAAe,MAAM;AACrB,eAAe,MAAM;EACnB,cAAA;;;AAIF,kBAAkB;AAClB,kBAAkB;EAChB,wBAAA;;;AAIF,eAAe,IAAI,QAAQ;AAC3B,eAAe,YAAY;EACzB,YAAA;EACA,sBAAA;EACA,sBAAA;;AAGF,eAAe,IAAI,QAAQ;AAC3B,eAAe,YAAY;EACzB,QAAQ,gBAAR;;AAGF,eAAe,IAAI,QAAQ;AAC3B,eAAe,IAAI,QAAQ;AAC3B,eAAe,YAAY;AAC3B,eAAe,YAAY;EACzB,SAAA;EACA,WAAW,uBAAX;;;AAIF,eAAe,cAAc;EAC3B,SAAA;EACA,mBAAA;EACA,yBAAA;;AAGF,eAAe,cAAc;EAC3B,KAAK,gBAAL;;AAGF,eAAe,cAAc;AAC7B,eAAe,cAAc;EAC3B,SAAA;EACA,WAAW,sBAAX;;;AAIF,eAAe,cAAc;EAC3B,QAAA;EACA,qBAAA;EACA,uBAAA;EACA,MAAM,eAAN;EACA,WAAW,uBAAX;;AAGF,eAAe,cAAc;EAC3B,QAAA;EACA,OAAO,gBAAP;EACA,WAAW,uBAAX;;;AAIF,eAAe,eAAe;EAC5B,QAAA;EACA,oBAAA;EACA,wBAAA;EACA,OAAO,gBAAP;EACA,WAAW,sBAAX;;AAGF,eAAe,eAAe;EAC5B,QAAA;EACA,MAAM,iBAAN;EACA,WAAW,sBAAX;EACA,gBAAA;;;AAIF;EACE;IACE,YAAA;IACA,WAAW,kBAAX;;;AAIJ;EACE;IACE,YAAA;IACA,WAAW,kBAAX;;;;AAKJ,eAAe,IAAI,QAAQ,MAAM;AACjC,eAAe,IAAI,QAAQ,MAAM;AACjC,eAAe,YAAY,MAAM;AACjC,eAAe,YAAY,MAAM;AACjC,eAAe,cAAc,MAAM;AACnC,eAAe,cAAc,MAAM;EACjC,gDAAA;;AAGF,eAAe,cAAc,MAAM;AACnC,eAAe,cAAc,MAAM;AACnC,eAAe,eAAe,MAAM;AACpC,eAAe,eAAe,MAAM;EAClC,gDAAA;;AAGF;EACE,eAAA;;AADF,aAEE;EACE,uBAAA;EACA,YAAA;EACA,mBAAA;EACA,eAAA;;AANJ,aAQE;EACE,YAAA;EACA,gBAAA;;AAIJ,eAAgB;EACd,0BAAA;;AAGF,wBACE;EAh+BA,kBAAA;EAq+BE,kBAAA;EACA,WAAA;EA4BA,kBAAA;EACA,kBAAA;EACA,WAAA;EACA,yBAAA;EACA,gBAAA;;AAvCJ,wBACE,kBACE;EACE,gBAAA;;AAj+BJ,wBA+9BA,kBA/9BC;EACC,SAAS,GAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,kCAAA;EACA,8BAAA;EACA,iBAAA;EACA,qCAAA;;AA+9BA,wBARF,kBAQG;EACC,yBAAA;EAKA,YAAA;EACA,aAAA;;AALA,wBAVJ,kBAQG,aAEE;EACC,gCAAA;EACA,KAAK,gBAAL;;AAMJ,wBAlBF,kBAkBG;EACC,uBAAA;EACA,cAAA;EACA,YAAA;EACA,UAAA;;AAGF,wBAzBF,kBAyBG;EAIC,cAAA;EACA,yBAAA;EACA,qBAAA;;AALA,wBA1BJ,kBAyBG,cACE;EACC,gCAAA;;AAaJ,wBAxCF,kBAwCG;EACC,yBAAA;;AA1CN,wBACE,kBA4CE;EACE,WAAA;;AAKN,CAAC;AAAS,CAAC;EACT,WAAA;;AAGF,CAAC,OAAO;EACN,cAAA;EACA,iBAAA;EACA,YAAA;EACA,gBAAA;EACA,gBAAA;EACA,iBAAA;;AAGF;EACE,qBAAA;EACA,qBAAA;EACA,UAAA;;AAGF;EACE,eAAA;;AAEA,eAAC;EACC,gBAAA;;AAMJ,eACE;EACE,eAAA;;AACA,eAFF,IAEG;EACC,kBAAA;;AAKN;EAEE,mBAAA;;AAFF,qBAIE,oBAAoB;AAJtB,qBAKE,qBAAqB;EACnB,eAAA;;AACA,qBAHF,oBAAoB,MAGjB;AAAD,qBAFF,qBAAqB,MAElB;EACC,kBAAA;;AARN,qBAYE,gBAAgB;AAZlB,qBAaE,gBAAgB;EACd,cAAA;;AAdJ,qBAiBE;EACE,mBAAA;;AACA,qBAFF,2BAEG;EACC,kBAAA;;AApBN,qBAwBE;EACE,eAAA;EACA,mBAAA;;AAKJ;EACE,yBAAA;EACA,aAAA;EACA,4CAAA;EACA,qBAAA;EACA,mBAAA;;AAGF;EAqFE,0BAAA;EAMA,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;EACA,kBAAA;EACA,SAAA;;AA/FA,YAAC;EACC,cAAA;;AAGF,YAAC;EACC,yBAAA;;AANJ,YASE;EACE,eAAA;;AAVJ,YAaE,aAAa;EACX,cAAA;;AAdJ,YAiBE;EACE,YAAA;;AAGF,YAAC;AACD,YAAC;EACC,UAAA;;AAFF,YAAC,kBAIC;AAHF,YAAC,iBAGC;EACE,aAAA;EACA,mBAAA;;AANJ,YAAC,kBAIC,oBAGE;AANJ,YAAC,iBAGC,oBAGE;EACE,kBAAA;;AARN,YAAC,kBAYC;AAXF,YAAC,iBAWC;EACE,aAAA;EACA,kCAAA;EACA,mBAAA;EAoBA,wBAAA;;AAjBE,YAlBL,kBAYC,mBAKE,KACG;AAAD,YAjBL,iBAWC,mBAKE,KACG;EACC,gBAAA;EACA,mBAAA;EACA,uBAAA;;AAEF,YAvBL,kBAYC,mBAKE,KAMG;AAAD,YAtBL,iBAWC,mBAKE,KAMG;EACC,aAAA;EACA,qBAAA;EACA,yBAAA;;AAHF,YAvBL,kBAYC,mBAKE,KAMG,aAIC;AAJF,YAtBL,iBAWC,mBAKE,KAMG,aAIC;EACE,WAAA;EACA,YAAA;EACA,gBAAA;;AA9BV,YAAC,kBAsCC;AArCF,YAAC,iBAqCC;EACE,0BAAA;;AAMF,YADD,iBACE;AAAW,YADb,iBACc;EACX,uEAAA;;AAnEN,YAuEE;EACE,aAAA;EACA,sBAAA;EACA,yBAAA;EACA,aAAA;EACA,8BAAA;EACA,+BAAA;EACA,kBAAA;;AA9EJ,YAiFE;EACE,eAAA;;AAlFJ,YAuFE;EACE,0BAAA;;AAUF,YAAC;EACC,sBAAA;EACA,SAAA;EACA,YAAA;EACA,yBAAA;;AAGF,YAAC;EACC,uBAAA;EACA,cAAA;EACA,YAAA;EACA,UAAA;;AAGF,YAAC;EA/sCD,kBAAA;EAotCE,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,qBAAA;;AAttCF,YA8sCC,cA9sCA;EACC,SAAS,GAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,kCAAA;EACA,8BAAA;EACA,iBAAA;EACA,qCAAA;;AAwsCA,YAFD,cAEE;EACC,gCAAA;;AAnHN,YA2HE;EACE,qBAAA;EACA,iBAAA;;AAMJ,KAAK;AAAe,KAAK;AAAmB,KAAK;AAAgB,KAAK;EACpE,WAAA;;;;;AAOF;EAKE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,YAAA;;AARF,aACE;EACE,wBAAA;;AASJ;EACE,kBAAA;EACA,eAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,sBAAA;EACA,wBAAA;EACA,gBAAA;;AAEA,aAAC;EACC,kBAAA;EACA,SAAS,EAAT;EACA,YAAA;EACA,WAAA;EACA,SAAA;EACA,WAAA;EACA,uBAAA;EACA,wBAAA;EACA,gBAAA;;AAGF,aAAC;EACC,mBAAA;;AAGF,aAAC,YAAY;EACX,kBAAA;;AAIJ;EACE,gBAAA;EACA,kBAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,sBAAA;EACA,wBAAA;EACA,gBAAA;;AAEA,gBAAC;EACC,kBAAA;EACA,SAAS,KAAT;EACA,YAAA;;AAGF,gBAAC;EACC,mBAAA;;AAKJ,KAAK,QAAS;EACZ,yBAAA;;AAEA,KAHG,QAAS,gBAGX;EACC,mBAAmB,gBAAnB;EACA,eAAe,gBAAf;EACA,WAAW,gBAAX;;AAWJ,KAAK,QAAQ,SAAU;EACrB,yBAAA;;AAQF,KAAK,MAAO;EACV,2BAAA;;AAIF;EACE,eAAA;;EACA,WAAA;;EACA,YAAA;;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,oCAAA;;EACA,WAAA;;AATF,6BAWE;EACE,kBAAA;EACA,eAAA;EACA,yBAAA;EACA,YAAA;EACA,kBAAA;;EAEA,UAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,YAAA;;AAMJ,IAAK;EACH,0BAAA;;AAGF,eACE;EACE,WAAA;EACA,aAAA;;AAIJ;EACE,eAAA;EACA,gBAAA;;AAGF,mBACE;EACE,gCAAA;EACA,mBAAA;;AAKJ,gBACE,MAAK;EACH,UAAA;;AAIJ;AAAmB;EACjB,kBAAA;EACA,gBAAA;;AAGF;;;AAAA,aACE;AADF,aACM;AADN,aACU;AADV,aACc;AADd,aACkB;AADlB,aACoC;AADpC,aACuD;EACnD,oBAAA;;AAFJ,aAIE;AAJF,aAIM;EACF,eAAA;;AALJ,aAOE;EACE,gBAAA;;AARJ,aAWE;EACE,eAAA;;AAZJ,aAeE;EACE,kBAAA;;AAhBJ,aAeE,aAGE;EACE,sBAAA;EACA,uBAAA;;AApBN,aAeE,aAGE,aAGE;EACE,gBAAA;;AAtBR,aAeE,aAWE;EACE,eAAA;EACA,gBAAA;EACA,iBAAA;;AA7BN,aAeE,aAiBE;EACE,mBAAA;;AAjCN,aAeE,aAiBE,aAEE;EACE,aAAA;EACA,sBAAA;EACA,eAAA;EACA,eAAA;;AAtCR,aAeE,aAiBE,aAEE,MAKE;EACE,aAAA;EACA,gBAAA;EACA,gBAAA;;AA1CV,aAeE,aAiBE,aAEE,MAUE;EACE,gBAAA;EACA,mBAAA;;AAMN,aArCF,aAqCG,aAAc;EACb,gBAAA;;AArDN,aAeE,aAyCE,aACE;EACE,cAAA;EACA,cAAA;;AA3DR,aAeE,aAyCE,aAKE;EACE,UAAA;;AA9DR,aAqEE;AArEF,aAqEe;;;;AArEf,aAqEE,YACE,MAAK,aAAa;AAtEtB,aAqEe,oBACX,MAAK,aAAa;EAChB,YAAA;;AAvEN,aAqEE,YAKE;AA1EJ,aAqEe,oBAKX;AA1EJ,aAqEE,YAK8B;AA1EhC,aAqEe,oBAKiB;EAC1B,eAAA;;AA3EN,aAqEE,YASE,MAAK;AA9ET,aAqEe,oBASX,MAAK;EACH,gBAAA;;AACA,aAXJ,YASE,MAAK,OAEF;AAAD,aAXS,oBASX,MAAK,OAEF;EACC,qBAAA;EACA,YAAA;EACA,iBAAA;;AAEF,aAhBJ,YASE,MAAK,OAOF;AAAD,aAhBS,oBASX,MAAK,OAOF;EACC,uBAAA;EACA,YAAA;EACA,mBAAA;;AAEF,aArBJ,YASE,MAAK,OAYF;AAAD,aArBS,oBASX,MAAK,OAYF;EACC,kBAAA;EACA,kBAAA;;AACA,aAxBN,YASE,MAAK,OAYF,YAGE;AAAD,aAxBO,oBASX,MAAK,OAYF,YAGE;EACC,yBAAA;EACA,qBAAA;;AAOJ,aAjCJ,YAgCE,OACG;AAAD,aAjCS,oBAgCX,OACG;EACC,qBAAA;EACA,YAAA;EACA,iBAAA;;AAzGR,aAqEE,YAyCE,oBAAoB;AA9GxB,aAqEe,oBAyCX,oBAAoB;EAClB,SAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;;AAlHN,aAqEE,YAiDE;AAtHJ,aAqEe,oBAiDX;EACE,mBAAA;;AAvHN,aAqEE,YAqDE;AA1HJ,aAqEe,oBAqDX;EACE,sBAAA;;AA3HN,aAqEE,YA2DE,iBAAgB,OACd;AAjIN,aAqEe,oBA2DX,iBAAgB,OACd;EACE,YAAA;EACA,iBAAA;EACA,WAAA;;AApIR,aAqEE,YA2DE,iBAAgB,OAOd;AAvIN,aAqEe,oBA2DX,iBAAgB,OAOd;EACE,WAAA;EACA,gBAAA;EACA,iBAAA;EACA,0BAAA;;AA3IR,aAqEE,YA0EE,YAAY;AA/IhB,aAqEe,oBA0EX,YAAY;EACV,qBAAA;EACA,YAAA;EACA,eAAA;;AAlJN,aAqEE,YAgFE,aAAa;AArJjB,aAqEe,oBAgFX,aAAa;EACX,YAAA;EACA,eAAA;EACA,qBAAA;EACA,YAAA;;AAIF,mBAAqC;EAArC,aAxFF,YAyFI;EADF,aAxFW,oBAyFT;IACE,8BAAA;;;AAUR;;;AAAA,YAGE;EACE,mBAAA;EACA,kBAAA;;AALJ,YAOE,oBAAmB;EACjB,iBAAA;;AARJ,YAUE,MAAK;AAVP,YAUsB,MAAK;AAV3B,YAU2C,MAAK;EAE5C,qBAAA;;AAZJ,YAeE;EACE,qBAAA;EACA,uBAAA;;AAjBJ,YAoBE,SAAQ,WAAW;AApBrB,YAoB+B,SAAQ,WAAW;EAC9C,8BAAA;EACA,qBAAA;;AAtBJ,YAyBE;EACE,iBAAA;EACA,WAAA;;AA3BJ,YA8BE,MAAK,YAAY,QAAQ;EACvB,SAAS,OAAT;EACA,oBAAA;EACA,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,WAAA;EACA,iBAAA;EACA,yBAAA;;AAIA,YADF,aACG;EACC,mBAAA;;AA5CN,YAgDE;EACE,aAAA;EACA,mBAAA;EACA,YAAA;EAIA,mBAAA;;AAvDJ,YAgDE,wBAIE;AApDJ,YAgDE,wBAIS;AApDX,YAgDE,wBAIiB;EACb,kBAAA;;AArDN,YA0DE,OAAM;EACJ,gBAAA;;AAMJ,CAAC,MAAM;AAAS,MAAM,MAAM;AAAS,KAAK,MAAM;EAC9C,iBAAA;EACA,sBAAA;EACA,yBAAA;EACA,WAAA;EACA,mBAAA;EACA,SAAA;EACA,mBAAA;EACA,gBAAA;;AAEA,CAVD,MAAM,OAUJ;AAAD,MAVoB,MAAM,OAUzB;AAAD,KAVwC,MAAM,OAU7C;EACC,yBAAA;EACA,YAAA;;AAZJ,CAAC,MAAM,OAeL;AAfc,MAAM,MAAM,OAe1B;AAfmC,KAAK,MAAM,OAe9C;EACE,gBAAA;EACA,kBAAA;EACA,gBAAA;EACA,eAAA;EACA,gBAAA;;AAKJ,aAAc,WAAW;EACvB,YAAA;;AAGF,aAAc,WAAW;EACvB,cAAA;;;AAKF,0BACE;EACE,iBAAA;EACA,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;;AACA,mBAAqC;EAArC,0BANF;IAOI,mBAAA;;;AAMN,uBAAwB;EACtB,gBAAA;;AAGF;EACE,qBAAA;EACA,yBAAA;EACA,gBAAA;EACA,iBAAA;;AAJF,iBAME;EACE,YAAA;EACA,YAAA;EACA,qBAAA;EACA,cAAA;EACA,yBAAA;EACA,aAAA;;AAIJ;EACE,uBAAA;EACA,aAAA;EACA,eAAA;;AAHF,0BAKE;EACE,qBAAA;EACA,WAAA;EACA,iBAAA;EACA,yBAAA;EACA,4BAAA;EAEA,6BAAA;EACA,kCAAA;;AAbJ,0BAKE,wBAUE;EACE,aAAA;EACA,mBAAA;;AAjBN,0BAqBE;EACE,sBAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;EACA,eAAA;EACA,cAAA;EACA,0BAAA;EACA,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,gBAAA;;AAhCJ,0BAmCE,sBAAsB,WAAW;EAC/B,gBAAA;EACA,gBAAA;EACA,aAAA;;AAtCJ,0BAyCE;EACE,cAAA;EACA,aAAA;EACA,qBAAqB,8CAA8C,8DAA8D,oCAAoC,wCAAwC,6BAA7M;EA+BA,cAAA;EACA,aAAA;;AA/BA,mBAAsC;EAAtC,0BAJF;IAKI,qBAAqB,wBAAwB,gCAAgC,oBAAoB,kBAAkB,sBAAsB,gBAAgB,eAAzJ;;;AA9CN,0BAyCE,mCAQE;EACE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;;AArDN,0BAyCE,mCAeE;EACE,aAAA;EACA,mBAAA;;AA1DN,0BAyCE,mCAoBE;EACE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,yBAAA;EACA,eAAA;EACA,YAAA;;AACA,mBAAqC;EAArC,0BA3BJ,mCAoBE,sBAQI;IACE,YAAA;;;AAtEV,0BAyCE,mCAqCE;EACE,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,oBAAA;;AAlFN,0BAyCE,mCA4CE;EACE,YAAA;EACA,gBAAA;EACA,aAAA;;AAxFN,0BAyCE,mCA4CE,sBAKE;EACE,wBAAA;;AA3FR,0BAyCE,mCA4CE,sBASE;EACE,iBAAA;;AAGF,0BAzDJ,mCA4CE,sBAaG;EACC,sBAAA;EACA,WAAA;EACA,gBAAA;;AArGR,0BAyCE,mCAgEE;EAIE,mBAAA;;AAHA,mBAAsC;EAAtC,0BAjEJ,mCAgEE;IAEI,cAAA;;;AA3GR,0BAyCE,mCAgEE,0BAME;EACE,yBAAA;EACA,iBAAA;;AAjHR,0BAyCE,mCAgEE,0BAME,8BAIE;EACE,oBAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,WAAA;;AAxHV,0BAyCE,mCAgEE,0BAME,8BAIE,0BAOE;EACE,cAAA;;AA3HZ,0BAyCE,mCAgEE,0BAuBE;EACE,kBAAA;;AAjIR,0BAyCE,mCAgEE,0BAuBE,2BAGE;EACE,wBAAA;EACA,mBAAA;;AArIV,0BAyCE,mCAgEE,0BAgCE;EACE,gBAAA;EACA,YAAA;;AA3IR,0BAyCE,mCAgEE,0BAqCE;EACE,iBAAA;;AA/IR,0BAyCE,mCAgEE,0BAqCE,mBAGE,GAAE,GAAG;EACH,YAAA;;AAlJV,0BAyCE,mCAgEE,0BAqCE,mBAOE;AArJR,0BAyCE,mCAgEE,0BAqCE,mBAQE;EACE,YAAA;;AAvJV,0BAyCE,mCAmHE;EAEE,YAAA;EAmBA,kBAAA;;AAlBA,mBAAsC;EAAtC,0BAtHJ,mCAmHE;IAII,cAAA;;;AAhKR,0BAyCE,mCAmHE,yBAOE,MAAK;AAnKX,0BAyCE,mCAmHE,yBAOoB,MAAK;AAnK7B,0BAyCE,mCAmHE,yBAOuC;AAnK3C,0BAyCE,mCAmHE,yBAOiD,MAAK;EAClD,YAAA;EACA,kBAAA;EACA,eAAA;;AAtKR,0BAyCE,mCAmHE,yBAaE;EACE,iBAAA;;AA1KR,0BAyCE,mCAmHE,yBAiBE,MAAK;EACH,YAAA;;AA9KR,0BAyCE,mCA2IE;EAIE,oBAAA;EACA,gBAAA;;AAJA,mBAAsC;EAAtC,0BA5IJ,mCA2IE;IAEI,cAAA;;;AAtLR,0BAyCE,mCA2IE,2BAOE;EACE,oBAAA;;AA5LR,0BAyCE,mCA2IE,2BAOE,qBAGE;EACE,iBAAA;;AA/LV,0BAyCE,mCA2IE,2BAOE,qBAOE;EACE,WAAA;;AAnMV,0BAyCE,mCA2IE,2BAOE,qBAWE;EACE,wBAAA;EACA,kBAAA;EACA,gBAAA;EACA,aAAA;EACA,sBAAA;EACA,gBAAA;;AA5MV,0BAyCE,mCA2IE,2BAOE,qBAoBE;EACE,cAAA;EACA,gBAAA;;AAjNV,0BAyCE,mCA2IE,2BAiCE;EACE,YAAA;EACA,uBAAA;EACA,gBAAA;EACA,eAAA;;AAzNR,0BAyCE,mCA2IE,2BAiCE,wBAME;EACE,mBAAA;;AA5NV,0BAyCE,mCA0LE;EACE,iBAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,gBAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;;AA3ON,0BAyCE,mCA0LE,wBAUE;EACE,kBAAA;EACA,2BAAA;EACA,wBAAA;EACA,kBAAA;EACA,yBAAA;EACA,YAAA;EACA,gBAAA;EAEA,gBAAA;;AAtPR,0BAyCE,mCA0LE,wBAUE,oBAWE;EACE,kBAAA;EACA,QAAA;EACA,UAAA;;AA3PV,0BAyCE,mCA0LE,wBAUE,oBAiBE;EACE,eAAA;EACA,gBAAA;EACA,gBAAA;EACA,gBAAA;EACA,kBAAA;;AAnQV,0BAyCE,mCA0LE,wBAUE,oBAyBE;EACE,UAAA;EACA,gBAAA;EACA,gBAAA;EACA,aAAA;;AA1QV,0BAyCE,mCA0LE,wBAUE,oBAgCE;EACE,kBAAA;EACA,kBAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;;AAnRV,0BAyCE,mCA0LE,wBAUE,oBAgCE,oBAQE;EACE,gBAAA;EACA,sBAAA;EACA,gBAAA;;;AAeZ,eAAe;EACb,YAAA;EACA,mBAAA;EACA,WAAA;EACA,aAAA;;EAEA,kBACQ,6GACA,8CACA,8CACA,8CACA,4CALR;EAOA,2BAAA;EAEA,2FAAA;EAOA,gFAAA;EAOA,yBAAA;EACA,8BAAA;;AAEF;EACE;IACE,iGAAA;;;AAWJ;EACE;EAAI;EAAK;IAAO,mBAAmB,WAAnB;;EAChB;IAAM,mBAAmB,SAAnB;;;AAGR;EACE;EAAI;EAAK;IACP,WAAW,WAAX;IACA,mBAAmB,WAAnB;;EACC;IACE,WAAW,SAAX;IACA,mBAAmB,SAAnB;;;AAKP;EACE,iBAAA;;AAUF;EACE,gBAAA;EACA,uBAAA;EACA,kBAAA;;AAIF;EACE,iBAAA;;AAIF;EACE,WAAA;;AAGF;EACE,UAAA;;AAGF,UAAU;EACR,WAAW,mBAAX;EACA,aAAA;;AAGF,UAAU;EACR,aAAA;;AAIF;EACE;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;;EAEF;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;;;AAGJ;EACE;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;IACA,UAAA;;EAEF;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;IACA,UAAA;;;AAIJ;EACE,SAAA;;AAGF,uBAGE;AAFF,oBAEE;EACE,cAAA;;AAJJ,uBAGE,oBAGE;AALJ,oBAEE,oBAGE;EACE,uBAAA;EACA,aAAA;EAEA,gCAAA;;AAVN,uBAGE,oBAUE;AAZJ,oBAEE,oBAUE;EACE,aAAA;EACA,mBAAA;;AAfN,uBAGE,oBAeE;AAjBJ,oBAEE,oBAeE;EACE,uBAAA;;AAnBN,uBAGE,oBAmBE,MAAK;AArBT,oBAEE,oBAmBE,MAAK;EACH,YAAA;;AAvBN,uBAGE,oBAuBE;AAzBJ,oBAEE,oBAuBE;AA1BJ,uBAGE,oBAwBE;AA1BJ,oBAEE,oBAwBE;AA3BJ,uBAGE,oBAyBE;AA3BJ,oBAEE,oBAyBE;EACE,YAAA;EACA,iBAAA;EACA,YAAA;;AA/BN,uBAGE,oBA+BE;AAjCJ,oBAEE,oBA+BE;EACE,eAAA;;AAnCN,uBAGE,oBAmCE;AArCJ,oBAEE,oBAmCE;EACE,mBAAA;;AAvCN,uBAGE,oBAuCE;AAzCJ,oBAEE,oBAuCE;EACE,mBAAA;;AA3CN,uBAGE,oBA2CE;AA7CJ,oBAEE,oBA2CE;EACE,aAAA;;AA/CN,uBAGE,oBA+CE;AAjDJ,oBAEE,oBA+CE;EACE,iBAAA;;AAnDN,uBAGE,oBAmDE;AArDJ,oBAEE,oBAmDE;EACE,iBAAA;;AAvDN,uBAGE,oBAmDE,eAEE;AAvDN,oBAEE,oBAmDE,eAEE;EACE,iBAAA;;AAzDR,uBAGE,oBAmDE,eAEE,GAEE;AAzDR,oBAEE,oBAmDE,eAEE,GAEE;EACE,aAAA;;AAOV,eACE;EACE,aAAA;;AAFJ,eAIE;EACE,aAAA;;AALJ,eAQE;EACE,eAAA;;AATJ,eAYE;EACE,gBAAA;EACA,iBAAA;;AAdJ,eAgBE,gBAAgB;EACd,aAAA;;AAjBJ,eAoBE;EACE,gBAAA;EACA,iBAAA;EACA,YAAA;;AAIJ,aACE;AADF,aAEE;AAFF,aAGE;EACE,aAAA;;AAJJ,aAOE,UAAS;EACP,aAAA;EACA,cAAA;;AATJ,aAYE;EACE,iBAAA;;AAbJ,aAYE,eAEE;EACE,iBAAA;;AAfN,aAYE,eAEE,GAEE;EACE,aAAA","file":"wizard.css"} wizard/assets/css/variables.less 0000644 00000001402 15154444756 0013012 0 ustar 00 // Margins, Paddings and Border Radius @small-margin: 10px; @default-margin: 15px; @big-margin: 30px; @grid-margin:10px; @default-padding: 20px; @border-radius: 25px; // RSP Brand Colors @rsp-black: #333; @rsp-yellow: #f8be2e; @rsp-blue: #29b6f6; @rsp-green: #61ce70; @rsp-red: #D7263D; @rsp-pink: #E366A1; @rsp-orange: #f39c12; @box_shadow_color: #dedede; @light-text-color: #3c3c3c; // Colors @brand-primary: @rsp-blue; @brand-secondary: @color-success; // Notification colors @color-success: #61ce70; @color-disabled: #d7d7d7; @color-warning: @rsp-red; @color-open: @rsp-yellow; //#f8be2e; //#FBC43D //Input colors @input-background-color: #F1F1F1; @input-border-color: #dedede; @grey: #c6c6c6; @grey-light: #eeeeee; @grey-dark: #888; @grey-lighter: #fafafa; wizard/assets/css/admin.min.css 0000644 00000004653 15154444756 0012551 0 ustar 00 .rsssl_letsencrypt_container{margin-top:30px;background-color:#fafafa}.rsssl_letsencrypt_container.rsssl-progress-container{margin:20px 0 0;padding:10px 0;border-radius:5px}.rsssl-dns-field{border:1px solid #dedede;float:left;margin-bottom:10px;width:50%;padding:10px;margin-left:0;margin-top:10px}.rsssl-dns-label{font-weight:bold;margin-top:25px;margin-bottom:0;width:50%}#rsssl-lets-encrypt ul{margin-left:50px}#rsssl-lets-encrypt ul li{padding-right:10px}#rsssl-lets-encrypt ul li:before{background-color:#eee;color:#fff;height:10px;width:10px;border-radius:50%;content:'';position:absolute;margin-top:5px;margin-left:-30px}#rsssl-lets-encrypt ul li.rsssl-warning:before{background-color:#f8be2e}#rsssl-lets-encrypt ul li.rsssl-error:before{background-color:#d7263d}#rsssl-lets-encrypt ul li.rsssl-success:before{background-color:#61ce70}#rsssl-lets-encrypt ul li ul li:before{background-color:#888;color:#fff;height:6px;width:6px;border-radius:50%;content:'';position:absolute;margin-top:7px;margin-left:-19px}.rsssl-notice-hook-element{display:none}.error:not(.really-simple-plugins),.notice:not(.really-simple-plugins),.update-nag:not(.really-simple-plugins),.notice-info:not(.really-simple-plugins){display:none !important}#rsssl-wizard .rsssl-selectable{-webkit-touch-callout:all;-webkit-user-select:all;-khtml-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}#rsssl-wizard #rsssl-header{display:flex;justify-content:space-between;padding:20px;background-color:#fff}#rsssl-wizard #rsssl-header img{margin-left:15px;width:120px;height:28px}#rsssl-wizard #rsssl-header .rsssl-header-right{display:flex;align-items:center}#rsssl-wizard #rsssl-header .rsssl-header-right a{margin-right:15px}#rsssl-wizard #rsssl-content-area{margin:10px}#rsssl-wizard .rsssl-section .rsssl-success.check{margin-left:5px}#rsssl-wizard .rsssl-icon{height:initial}#rsssl-wizard .rsssl-icon.rsssl-success{color:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-success svg{stroke:#61ce70;fill:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-success.documents-shortcode{color:#000}#rsssl-wizard .rsssl-icon.rsssl-disabled{color:#d7d7d7}#rsssl-wizard .rsssl-icon.rsssl-disabled svg{stroke:#d7d7d7;fill:#d7d7d7}#rsssl-wizard .rsssl-icon:hover{color:#000}#rsssl-wizard .rsssl-icon.rsssl-bullet{height:11px;width:11px;margin-top:2px}#rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-disabled{background-color:#d7d7d7}#rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-success{background-color:#27adea} wizard/assets/css/wizard.min.css 0000644 00000127145 15154444756 0012763 0 ustar 00 .rsssl-certificate-data{right:10000px;position:absolute;background-color:#fff;padding:0;white-space:nowrap}.rsssl-copied-feedback-container{padding:20px;color:#61ce70}.rsssl-section .rsssl_letsencrypt_container a.button{margin-top:15px}.rsssl-pointer{position:relative}.rsssl-pointer:after{content:" ";position:absolute;left:-15px;top:15px;border-top:15px solid transparent;border-right:15px solid black;border-left:0;border-bottom:15px solid transparent}#rsssl-content-area{display:grid;grid-template-columns:225px auto}#rsssl-content-area h1{padding:0}#rsssl-content-area .rsssl-wizard-title{padding:20px;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-content:center}#rsssl-content-area .rsssl-wizard-title h1{font-size:18px}#rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header{border-bottom:1px solid #e6e6e6}#rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header h1{font-weight:normal}#rsssl-content-area .rsssl-wizard-subtitle h2{margin:20px 20px 0 20px;font-size:14px}#rsssl-content-area .rsssl-wizard-progress-bar{background:#eee;height:15px;margin:20px 0 0 0}#rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value{transition:width .5s;-webkit-transition:width .5s;height:100%;background:#61ce70;border-radius:4px}#rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value.rsssl-error{background-color:#d7263d}#rsssl-content-area .rsssl-priority{background-color:#000;color:#fff;border-color:#000;margin-top:10px}#rsssl-content-area .rsssl-wizard-menu{background-color:white;margin:10px;margin-bottom:0;padding-bottom:20px;box-shadow:0 0 5px 5px rgba(222,222,222,0.2)}#rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-menu h1{font-weight:bold}#rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-progress-bar{margin:20px}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header{text-decoration:none}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.incomplete a h2{color:#c6c6c6}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a{display:inline-block;padding:5px 20px;text-decoration:none;width:calc(100% -(20px+20px))}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a h2{font-size:15px;margin:0}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active a h2{color:#c6c6c6 !important}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header:hover a h2{text-decoration:underline}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active:hover a{background:white;pointer-events:none}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section{display:grid;grid-template-columns:20px 1fr;margin:0 20px}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section span{align-self:center;justify-self:center}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a{display:inline-block;text-decoration:none;padding:3px 5px}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3{color:#c6c6c6}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a:visited h3{color:initial}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3{font-size:12px;font-weight:normal;margin:0}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active a h3{color:grey}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section:hover a h3{text-decoration:underline}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active:hover a{background:white;pointer-events:none}#rsssl-content-area .rsssl-section-content{margin:10px}#rsssl-content-area .rsssl-section-content p{margin:0}#rsssl-content-area .rsssl-section-content p:not(:first-child){margin-top:1em}#rsssl-content-area .rsssl-section-content form{display:grid;grid-template-columns:auto 325px;grid-column-gap:15px}#rsssl-content-area .rsssl-section-content form .rsssl-section-content-title-header{background-color:white}#rsssl-content-area .rsssl-section-content form .rsssl-wizard-intro,#rsssl-content-area .rsssl-section-content form .rsssl-template-intro .rsssl-master-label{grid-column-start:1;background-color:white;padding:20px 20px 0 20px}#rsssl-content-area .rsssl-section-content form .rsssl-field .rsssl-wizard-intro{padding:0 0 20px 0}#rsssl-content-area .rsssl-section-content form .rsssl-button{background-color:white;grid-column-start:1;padding:20px 20px 0 20px}#rsssl-content-area .rsssl-section-content form .field-group{grid-column:span 2;display:grid;grid-template-columns:auto 325px;grid-column-gap:15px}#rsssl-content-area .rsssl-section-content form .field-group .rsssl-field{grid-column-start:1}#rsssl-content-area .rsssl-section-content form .field-group .rsssl-help-warning-wrap{margin-top:-20px}#rsssl-content-area .rsssl-section-content form .rsssl-section-footer{grid-column-start:1;background-color:white;padding:20px;display:grid;align-items:center;grid-template-columns:1fr auto}#rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container{grid-column-start:2}#rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container input+input{margin-left:20px}#rsssl-content-area .rsssl-add-pages-table{display:grid;grid-template-columns:auto auto auto;grid-gap:5px;align-items:center;margin-bottom:20px}#rsssl-content-area .rsssl-add-pages-table span{justify-self:end;text-align:justify}#rsssl-content-area .rsssl-link-to-menu-table{display:grid;grid-template-columns:30% 30%;grid-gap:5px;align-items:center}#rsssl-content-area .rsssl-link-to-menu-table h3{grid-column:span 2;margin-top:20px;margin-bottom:5px}#rsssl-content-area .rsssl-link-to-menu-table h3:first-child{margin-top:0}#rsssl-content-area .rsssl-link-to-menu-table select{grid-column-start:2}#rsssl-content-area .rsssl-cookies-table h2{font-weight:normal;font-size:15px}#rsssl-content-area .rsssl-cookies-table .rsssl-cookies-table-body{border-radius:5px;display:grid;grid-template-columns:1fr;padding:10px;background-color:#f0f2f8}#rsssl-wizard .rsssl-icon{margin:0 5px;width:initial;border-radius:50%}#rsssl-wizard .rsssl-icon.rsssl-empty{visibility:hidden}#rsssl-wizard .rsssl-icon.rsssl-success{color:#f8be2e}#rsssl-wizard .rsssl-icon.rsssl-success svg{fill:#f8be2e;stroke:#f8be2e}#rsssl-wizard .rsssl-icon.rsssl-green{color:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-green svg{fill:#61ce70;stroke:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-disabled{color:#ababab}#rsssl-wizard .rsssl-icon.rsssl-disabled svg{fill:#ababab;stroke:#ababab}#rsssl-wizard .rsssl-icon.rsssl-error{color:#d7263d}#rsssl-wizard .rsssl-icon.rsssl-error svg{fill:#d7263d;stroke:#d7263d}#rsssl-wizard .rsssl-icon.arrow-right-alt2::before{font-size:14px}#rsssl-wizard .rsssl-circle-green{height:12px;width:12px;border-radius:12px;background-color:#61ce70}#rsssl-wizard .rsssl-circle-red{height:12px;width:12px;border-radius:12px;background-color:#d7263d}#rsssl-wizard .rsssl-not-allowed{cursor:not-allowed}#rsssl-wizard .rsssl-checkbox .rsssl-field{display:flex;align-items:center}#rsssl-wizard .rsssl-checkbox .rsssl-field .rsssl-wizard-settings-text{margin-left:20px;margin-top:5px}#rsssl-wizard .rsssl-checkbox-container{display:block;position:relative;padding-left:35px}#rsssl-wizard .rsssl-checkbox-container input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}#rsssl-wizard .rsssl-checkbox-container .checkmark{position:absolute;top:-2px;left:0;height:20px;width:20px;border-radius:5px;border:1px solid #dadada}#rsssl-wizard .rsssl-checkbox-container .checkmark svg{content:"";position:absolute;display:none}#rsssl-wizard .rsssl-checkbox-container input:checked ~ .checkmark svg{display:block;fill:#f8be2e;stroke:#f8be2e}#rsssl-wizard .rsssl-checkbox-container .checkmark svg{left:2.5px;top:2px;width:15px;height:15px}#rsssl-wizard .rsssl-checkbox-container .checkmark.rsssl-default svg{display:block;fill:#eee;stroke:#eee}#rsssl-wizard .rsssl-checkbox-container.rsssl-disabled{pointer-events:none}#rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark{background-color:#eee}#rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark svg{stroke:#eee !important;fill:#eee !important}#rsssl-wizard .rsssl-radio-container{display:block;position:relative;padding-left:35px}#rsssl-wizard .rsssl-radio-container input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}#rsssl-wizard .rsssl-radio-container .radiobtn{position:absolute;top:-2px;left:0;height:20px;width:20px;border-radius:20px;border:1px solid #dadada}#rsssl-wizard .rsssl-radio-container .radiobtn div{content:"";position:absolute;display:none}#rsssl-wizard .rsssl-radio-container input:checked ~ .radiobtn .rsssl-icon{display:block;background-color:#f8be2e}#rsssl-wizard .rsssl-radio-container .radiobtn .rsssl-icon{left:5px;top:3px;width:10px;height:10px}#rsssl-wizard .rsssl-radio-container .radiobtn.rsssl-default .rsssl-icon{display:block;background-color:#eee}#rsssl-wizard .rsssl-radio-container.rsssl-disabled{pointer-events:none}#rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn{background-color:#eee}#rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn .rsssl-icon{background-color:#eee !important}#rsssl-wizard textarea.validation,#rsssl-wizard input[type="text"].validation,#rsssl-wizard input[type="password"].validation,#rsssl-wizard input[type="email"].validation,#rsssl-wizard input[type="text"].rsssl-valid-page,#rsssl-wizard input[type="text"].rsssl-deleted-page{position:relative;padding-left:30px}#rsssl-wizard textarea.validation ~ span .rsssl-icon,#rsssl-wizard input[type="text"].validation ~ span .rsssl-icon,#rsssl-wizard input[type="password"].validation ~ span .rsssl-icon,#rsssl-wizard input[type="email"].validation ~ span .rsssl-icon,#rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon,#rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon{display:block;position:absolute;padding-left:7px;margin-top:-25px;z-index:1}#rsssl-wizard textarea.validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="text"].validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="password"].validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="email"].validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon svg,#rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon svg{width:15px;height:15px}#rsssl-wizard textarea.validation:invalid ~ span .rsssl-icon,#rsssl-wizard textarea.validation:valid ~ span .rsssl-icon{margin-top:-143px}#rsssl-wizard textarea.validation:valid ~ span .rsssl-failed,#rsssl-wizard input[type="text"].validation:valid ~ span .rsssl-failed,#rsssl-wizard input[type="password"].validation:valid ~ span .rsssl-failed,#rsssl-wizard input[type="email"].validation:valid ~ span .rsssl-failed{display:none}#rsssl-wizard textarea.validation:invalid ~ span .rsssl-success,#rsssl-wizard input[type="text"].validation:invalid ~ span .rsssl-success,#rsssl-wizard input[type="password"].validation:invalid ~ span .rsssl-success,#rsssl-wizard input[type="email"].validation:invalid ~ span .rsssl-success{display:none}#rsssl-wizard input:disabled{background-color:#f2f2f2}#rsssl-wizard input[type="text"],#rsssl-wizard input[type="password"],#rsssl-wizard input[type="email"],#rsssl-wizard select,#rsssl-wizard .select2,#rsssl-wizard textarea,#rsssl-wizard input[type="number"]{margin-bottom:2px}#rsssl-wizard textarea{padding:10px;width:100%;height:100px;margin:20px 0}#rsssl-wizard ::placeholder{color:#dadada}#rsssl-wizard ::placeholder{color:#dadada}#rsssl-wizard ::-moz-placeholder{color:#dadada}#rsssl-wizard :-ms-input-placeholder{color:#dadada}#rsssl-wizard :-moz-placeholder{color:#dadada}#rsssl-wizard .rsssl-master-label h2{padding:20px 20px 0 20px !important}#rsssl-wizard .rsssl-footer-contents{border-top:0}#rsssl-wizard .rsssl-grid.rsssl-gridless{display:flex;flex-wrap:wrap;height:inherit !important}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item{position:relative}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-help-warning-wrap{display:none}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-comment{display:none}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header{height:initial}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container{display:flex;justify-content:space-between;align-content:center}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container .rsssl-grid-controls{margin:auto 0}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container{height:calc(100% - 20px);width:calc(100% - 20px);margin-left:10px;display:grid;grid-template-rows:auto 1fr auto;background-color:white}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container .item-content{padding:10px 0 0 0;margin:0;clear:none}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-footer{background-color:white;height:initial}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-checkbox .rsssl-field{display:flex;justify-content:space-between;align-content:center;padding:20px 20px 0 20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big .item-container .item-content{display:grid;grid-auto-flow:row dense;grid-template-columns:50% 50%;grid-auto-rows:minmax(min-content,max-content)}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big.rsssl-customization .item-container .item-content{grid-auto-flow:row}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field{grid-column:span 2;display:grid;grid-template-columns:100px 100px;grid-column-gap:20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field .rsssl-label{grid-column:span 2}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field{grid-column:span 2;display:grid;grid-template-columns:100px 100px 100px;grid-column-gap:20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field .rsssl-label{grid-column:span 3}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field,#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field{display:grid;grid-template-columns:50px 50px 50px 50px 50px;grid-column-gap:10px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field .rsssl-label,#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field .rsssl-label{grid-column:span 5}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap{display:grid;grid-template-rows:16px 16px;padding-top:16px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap .rsssl-grey{color:darkgrey}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap span{cursor:pointer}#rsssl-wizard .rsssl-grid.rsssl-gridless select{width:100%}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group{grid-column:span 2}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-field{padding:10px 20px 0 20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius,#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth{grid-column:span 1}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-1{grid-column:span 1}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-2{grid-column:span 2}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-1{grid-column-start:1}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-2{grid-column-start:2}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-master-label h2{grid-column:span 2;margin:0;padding:20px 20px 0 20px;font-size:18px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-sublabel label{color:darkgrey;font-size:13px}#rsssl-wizard .rsssl-grid.rsssl-gridless label .rsssl-icon{display:inline}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-switch{margin-top:0}#rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-input-wrap:not(.hidden){display:block;position:absolute;z-index:10}#rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-holder{position:absolute;top:132px;z-index:10}#rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-clear{position:absolute}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field{padding:0}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field .rsssl-label{margin:0}#rsssl-wizard input::-webkit-outer-spin-button,#rsssl-wizard input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}#rsssl-wizard input[type=number]{-moz-appearance:textfield}.rsssl-multiple-field-button-footer{display:flex;align-items:center}.rsssl-multiple-field-button-footer .rsssl-edit-item{margin-right:5px}.rsssl-hidden{display:none !important}[rsssl-tooltip]{position:relative;margin-left:5px}[rsssl-tooltip]::before,[rsssl-tooltip]::after{text-transform:none;font-size:1em;line-height:1;user-select:none;pointer-events:none;position:absolute;display:none;opacity:0}[rsssl-tooltip]::before{content:'';border:5px solid transparent;z-index:1001}[rsssl-tooltip]::after{content:attr(rsssl-tooltip);min-width:3em;font-weight:normal;overflow:hidden;text-overflow:ellipsis;padding:1ch 1.5ch;border-radius:.3ch;box-shadow:0 1em 2em -0.5em rgba(0,0,0,0.35);background:#333;color:#fff;z-index:1000}[rsssl-tooltip]:hover::before,[rsssl-tooltip]:hover::after{display:block}[rsssl-tooltip='']::before,[rsssl-tooltip='']::after{display:none !important}[rsssl-tooltip]:not([flow])::before,[rsssl-tooltip][flow^="up"]::before{bottom:100%;border-bottom-width:0;border-top-color:#333}[rsssl-tooltip]:not([flow])::after,[rsssl-tooltip][flow^="up"]::after{bottom:calc(100%+5px)}[rsssl-tooltip]:not([flow])::before,[rsssl-tooltip]:not([flow])::after,[rsssl-tooltip][flow^="up"]::before,[rsssl-tooltip][flow^="up"]::after{left:50%;transform:translate(-50%,-0.5em)}[rsssl-tooltip][flow^="down"]::before{top:100%;border-top-width:0;border-bottom-color:#333}[rsssl-tooltip][flow^="down"]::after{top:calc(100%+5px)}[rsssl-tooltip][flow^="down"]::before,[rsssl-tooltip][flow^="down"]::after{left:50%;transform:translate(-50%,0.5em)}[rsssl-tooltip][flow^="left"]::before{top:50%;border-right-width:0;border-left-color:#333;left:calc(0 - 5px);transform:translate(-0.5em,-50%)}[rsssl-tooltip][flow^="left"]::after{top:50%;right:calc(100%+5px);transform:translate(-0.5em,-50%)}[rsssl-tooltip][flow^="right"]::before{top:50%;border-left-width:0;border-right-color:#333;right:calc(0 - 19px);transform:translate(0.5em,-50%)}[rsssl-tooltip][flow^="right"]::after{top:50%;left:calc(100%+19px);transform:translate(0.5em,-50%);min-width:300px}@keyframes tooltips-vert{to{opacity:.9;transform:translate(-50%,0)}}@keyframes tooltips-horz{to{opacity:.9;transform:translate(0,-50%)}}[rsssl-tooltip]:not([flow]):hover::before,[rsssl-tooltip]:not([flow]):hover::after,[rsssl-tooltip][flow^="up"]:hover::before,[rsssl-tooltip][flow^="up"]:hover::after,[rsssl-tooltip][flow^="down"]:hover::before,[rsssl-tooltip][flow^="down"]:hover::after{animation:tooltips-vert 300ms ease-out forwards}[rsssl-tooltip][flow^="left"]:hover::before,[rsssl-tooltip][flow^="left"]:hover::after,[rsssl-tooltip][flow^="right"]:hover::before,[rsssl-tooltip][flow^="right"]:hover::after{animation:tooltips-horz 300ms ease-out forwards}#rsssl-header{font-size:16px}#rsssl-header .button-black{background-color:black;color:white;border-color:black;padding:0 25px}#rsssl-header .link-black{color:black;padding:5px 5px}.wp-editor-wrap iframe{height:initial !important}.rsssl-help-warning-wrap .rsssl-help-modal{position:relative;position:absolute;z-index:99;margin:0 0 0 20px;padding:10px 15px;color:#fff;background-color:#f8be2e;text-align:left}.rsssl-help-warning-wrap .rsssl-help-modal h2{margin-top:-5px}.rsssl-help-warning-wrap .rsssl-help-modal:after{content:" ";position:absolute;left:-15px;top:15px;border-top:15px solid transparent;border-right:15px solid black;border-left:0;border-bottom:15px solid transparent}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice{background-color:#f8be2e;color:black;padding:20px}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice:after{border-right:15px solid #f8be2e;top:calc(50% - 15px)}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-success{background-color:white;color:#61ce70;border:0;padding:0}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning{color:#333;background-color:#f8be2e;border-color:#f8be2e}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning:after{border-right:15px solid #f8be2e}.rsssl-help-warning-wrap .rsssl-help-modal:empty{background-color:#f1f1f1}.rsssl-help-warning-wrap .rsssl-help-modal a{color:#333}a:active,a:hover{color:#333}a.button.rsssl-open-modal{font-size:9px;line-height:13px;height:15px;min-height:15px;padding:1px 3px;margin-left:10px}.rsssl-panel-link{text-decoration:none;display:inline-block;width:80%}#rsssl_language{font-size:15px}#rsssl_language.rsssl_cookie_language_selector{margin-bottom:0}.multiple-field div{margin-top:8px}.multiple-field div:last-child{margin-bottom:8px}.rsssl-list-container{margin-bottom:25px}.rsssl-list-container .rsssl-cookie-field>div,.rsssl-list-container .rsssl-service-field>div{margin-top:8px}.rsssl-list-container .rsssl-cookie-field>div:last-child,.rsssl-list-container .rsssl-service-field>div:last-child{margin-bottom:8px}.rsssl-list-container .rsssl-disabled label,.rsssl-list-container .rsssl-disabled span{color:#ababab !important}.rsssl-list-container .rsssl-service-cookie-list{margin-bottom:20px}.rsssl-list-container .rsssl-service-cookie-list:last-child{margin-bottom:0}.rsssl-list-container .rsssl-service-divider{font-size:15px;margin-bottom:10px}.rsssl-legenda{padding:10px 10px 0 10px;display:grid;grid-template-columns:25px 200px 25px 300px;grid-column-gap:10px;align-items:center}.rsssl-panel{font-size:13px !important;color:#383d41;background-color:#f2f2f2;border:1px solid #d6d8db;padding:10px 15px;border-radius:0;margin:0}.rsssl-panel.rsssl-toggle-disabled{color:#aca5a5}.rsssl-panel.rsssl-deleted{background-color:#ffa5aa}.rsssl-panel .rsssl-panel-title{cursor:pointer}.rsssl-panel .rsssl-field>div{margin:10px 0}.rsssl-panel .rsssl-multiple-field-validation{float:right}.rsssl-panel.rsssl-slide-panel,.rsssl-panel.rsssl-link-panel{padding:0}.rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle,.rsssl-panel.rsssl-link-panel .rsssl-panel-toggle{display:flex;align-items:center}.rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle span,.rsssl-panel.rsssl-link-panel .rsssl-panel-toggle span{padding-left:10px}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title,.rsssl-panel.rsssl-link-panel .rsssl-panel-title{display:grid;grid-template-columns:50% 10% 40%;align-items:center;padding:10px 15px 8px 0}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title span.rsssl-panel-toggle,.rsssl-panel.rsssl-link-panel .rsssl-panel-title span.rsssl-panel-toggle{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type,.rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type{display:flex;align-content:center;justify-content:flex-end}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type svg,.rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type svg{width:18px;height:18px;padding-top:1px}.rsssl-panel.rsssl-slide-panel .rsssl-add-to-policy,.rsssl-panel.rsssl-link-panel .rsssl-add-to-policy{text-decoration:underline}.rsssl-panel.rsssl-link-panel.selected,.rsssl-panel.rsssl-link-panel:hover{box-shadow:0 5px 5px rgba(0,0,0,0.2),0 3px 5px rgba(0,0,0,0.13)}.rsssl-panel .rsssl-panel-content{display:none;background-color:#fff;border:1px solid #d6d8db;border-top:0;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:10px 15px}.rsssl-panel h1{font-size:22px}.rsssl-panel p{font-size:13px !important}.rsssl-panel.rsssl-notice{background-color:#fff;border:0;color:black;padding:20px 20px 0 20px}.rsssl-panel.rsssl-success{background-color:white;color:#61ce70;border:0;padding:0}.rsssl-panel.rsssl-warning{position:relative;color:#333;background-color:#f8be2e;border-color:#f8be2e;margin:10px 0 10px 0}.rsssl-panel.rsssl-warning:after{content:" ";position:absolute;left:-15px;top:15px;border-top:15px solid transparent;border-right:15px solid black;border-left:0;border-bottom:15px solid transparent}.rsssl-panel.rsssl-warning:after{border-right:15px solid #f8be2e}.rsssl-panel ul{list-style-type:disc;margin-left:22px}input[type="text"],input[type="password"],input[type="email"],input[type="number"]{width:100%}.rsssl-switch{position:relative;display:inline-block;width:40px;height:21px}.rsssl-switch input{display:none !important}.rsssl-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.rsssl-slider:before{position:absolute;content:"";height:15px;width:15px;left:4px;bottom:3px;background-color:white;-webkit-transition:.4s;transition:.4s}.rsssl-slider.rsssl-round{border-radius:20px}.rsssl-slider.rsssl-round:before{border-radius:50%}.rsssl-slider-na{padding:2px 8px;position:absolute;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.rsssl-slider-na:before{position:absolute;content:"N/A";color:white}.rsssl-slider-na.rsssl-round{border-radius:20px}input:checked+.rsssl-slider{background-color:#f8be2e}input:checked+.rsssl-slider:before{-webkit-transform:translateX(17px);-ms-transform:translateX(17px);transform:translateX(17px)}input:checked:disabled+.rsssl-slider{background-color:#fffbf3}input:focus+.rsssl-slider{box-shadow:0 0 1px #f8be2e}#complete_wizard_first_notice{position:fixed;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.7);z-index:99}#complete_wizard_first_notice p{border-radius:0;font-size:16px;background-color:#f8be2e;color:white;position:relative;top:150px;padding:30px;width:300px;text-align:center;margin:auto}html .mceContentBody{max-width:100% !important}.cookie-warning textarea{width:100%;height:100px}.rsssl-comment{font-size:11px;margin-top:10px}.rsssl-cookie-field .rsssl-cookie-header{border-bottom:1px solid #b6b7b8;margin-bottom:25px}#rsssl-send-data input[type=text]{width:60%}#rsssl-start-mail,#rsssl_close_tb_window{margin-right:15px;margin-top:15px}#rsssl-wizard h1,#rsssl-wizard h2,#rsssl-wizard h3,#rsssl-wizard h4,#rsssl-wizard .rsssl-menu-item,#rsssl-wizard .rsssl-step-title,#rsssl-wizard .rsssl-button{font-variant:normal}#rsssl-wizard h2,#rsssl-wizard h3{font-size:15px}#rsssl-wizard h3{font-weight:400}#rsssl-wizard label{font-size:13px}#rsssl-wizard .field-group{position:relative}#rsssl-wizard .field-group .rsssl-field{padding:0 20px 0 20px;background-color:white}#rsssl-wizard .field-group .rsssl-field .rsssl-template-intro{margin-top:15px}#rsssl-wizard .field-group .rsssl-title-wrap{font-size:15px;font-weight:700;padding-top:15px}#rsssl-wizard .field-group .rsssl-label{margin-bottom:10px}#rsssl-wizard .field-group .rsssl-label label{display:flex;flex-direction:column;font-size:15px;cursor:default}#rsssl-wizard .field-group .rsssl-label label .rsssl-label-wrap{display:flex;margin-top:15px;font-weight:700}#rsssl-wizard .field-group .rsssl-label label .rsssl-subtitle-wrap{font-size:.9em;margin:5px 5px 0 0}#rsssl-wizard .field-group.rsssl-editor .rsssl-label{margin-bottom:0}#rsssl-wizard .field-group .rsssl-field .field-group{grid-column:1;display:block}#rsssl-wizard .field-group .rsssl-field .rsssl-field{padding:0}#rsssl-wizard .rsssl-body input[type="text"].rsssl-document-custom-url,#rsssl-wizard #rsssl-content-area input[type="text"].rsssl-document-custom-url{width:250px}#rsssl-wizard .rsssl-body .rsssl-document-custom-url,#rsssl-wizard #rsssl-content-area .rsssl-document-custom-url,#rsssl-wizard .rsssl-body .rsssl-document-custom-page,#rsssl-wizard #rsssl-content-area .rsssl-document-custom-page{margin-top:5px}#rsssl-wizard .rsssl-body input.button,#rsssl-wizard #rsssl-content-area input.button{min-width:100px}#rsssl-wizard .rsssl-body input.button.button-red,#rsssl-wizard #rsssl-content-area input.button.button-red{background-color:red;color:white;border-color:red}#rsssl-wizard .rsssl-body input.button.button-black,#rsssl-wizard #rsssl-content-area input.button.button-black{background-color:black;color:white;border-color:black}#rsssl-wizard .rsssl-body input.button.button-link,#rsssl-wizard #rsssl-content-area input.button.button-link{text-align:center;min-width:initial}#rsssl-wizard .rsssl-body input.button.button-link:hover,#rsssl-wizard #rsssl-content-area input.button.button-link:hover{background-color:initial;text-decoration:none}#rsssl-wizard .rsssl-body button.button-red,#rsssl-wizard #rsssl-content-area button.button-red{background-color:red;color:white;border-color:red}#rsssl-wizard .rsssl-body .rsssl-master-label h2,#rsssl-wizard #rsssl-content-area .rsssl-master-label h2{margin:0;padding:20px 20px 0 0;font-size:18px;background-color:white}#rsssl-wizard .rsssl-body .rsssl-remove,#rsssl-wizard #rsssl-content-area .rsssl-remove{margin-bottom:12px}#rsssl-wizard .rsssl-body .rsssl-rescan,#rsssl-wizard #rsssl-content-area .rsssl-rescan{padding:0 10px 0 10px}#rsssl-wizard .rsssl-body .rsssl-menu-item.active i,#rsssl-wizard #rsssl-content-area .rsssl-menu-item.active i{color:black;font-size:1.35em;float:left}#rsssl-wizard .rsssl-body .rsssl-menu-item.active a,#rsssl-wizard #rsssl-content-area .rsssl-menu-item.active a{color:#000;font-weight:900;padding-left:7px;text-decoration:underline}#rsssl-wizard .rsssl-body .rsssl-done a,#rsssl-wizard #rsssl-content-area .rsssl-done a{text-decoration:none;color:white;font-size:15px}#rsssl-wizard .rsssl-body .rsssl-to-do a,#rsssl-wizard #rsssl-content-area .rsssl-to-do a{color:white;font-size:15px;text-decoration:none;opacity:.6}@media screen and (max-width:782px){#rsssl-wizard .rsssl-body input,#rsssl-wizard #rsssl-content-area input{vertical-align:top !important}}.rsssl-field label{font-weight:normal;margin:10px 0 2px}.rsssl-field .rsssl-color-picker.wp-color-picker{margin-top:-11px !important}.rsssl-field input[type="text"],.rsssl-field input[type="email"],.rsssl-field input[type="number"]{border-color:#dadada}.rsssl-field select{border-color:#f1f1f1;vertical-align:initial}.rsssl-field textarea.validation:invalid,.rsssl-field textarea.validation:valid{background-position:.5% 1.5%;border-color:#dadada}.rsssl-field textarea{min-height:150px;width:100%}.rsssl-field input[type=radio]:checked:before{content:"\2022";text-indent:-9999px;border-radius:50px;font-size:24px;width:6px;height:6px;margin:4px;line-height:16px;background-color:#1e8cbe}.rsssl-field .rsssl-panel.rsssl-notice{padding:0 0 10px 0}.rsssl-field .rsssl-buttons-row-left{display:flex;align-items:center;height:auto;margin-bottom:10px}.rsssl-field .rsssl-buttons-row-left input,.rsssl-field .rsssl-buttons-row-left select,.rsssl-field .rsssl-buttons-row-left div{margin-right:20px}.rsssl-field button[name=rsssl_add_multiple]{margin-top:20px}a.rsssl.button,button.rsssl.button,input.rsssl.button{margin-left:15px;box-shadow:0 0 0 #fff;background-color:#f8be2e;color:#fff;padding-right:20px;border:0;border-radius:50px;padding-top:2px}a.rsssl.button:hover,button.rsssl.button:hover,input.rsssl.button:hover{background-color:#facd5f;color:white}a.rsssl.button .fa-angle-right,button.rsssl.button .fa-angle-right,input.rsssl.button .fa-angle-right{font-weight:900;position:absolute;font-size:1.8em;margin-top:1px;margin-left:5px}#rsssl-wizard .dashboard .fa-times{color:black}#rsssl-wizard .dashboard .fa-check{color:#f8be2e}.rsssl-dashboard-container .rsssl-dashboard-title{padding-top:22px;font-weight:600;font-size:24px;line-height:30px;margin-bottom:20px}@media screen and (max-width:720px){.rsssl-dashboard-container .rsssl-dashboard-title{padding-bottom:0}}.rsssl-dashboard-header .rsssl-header-top{min-height:60px}.rsssl-header-top{grid-area:header-top;background-color:#f2f2f2;min-height:30px;padding-top:25px}.rsssl-header-top .rsssl-premium-cta{width:150px;float:right;border-color:#f8be2e;color:#f8be2e;text-transform:uppercase;display:flex}.rsssl-dashboard-container{background-color:white;display:flex;flex-wrap:wrap}.rsssl-dashboard-container .rsssl-dashboard-header{margin-bottom:-270px;width:100%;min-height:220px;background-color:#f8be2e;background-repeat:no-repeat;background-attachment:scroll;background-position:bottom center}.rsssl-dashboard-container .rsssl-dashboard-header .rsssl-header-text{display:flex;align-items:center}.rsssl-dashboard-container .rsssl-dashboard-item{background-color:#fff;width:450px;margin-top:10px;border:2px solid;flex:0 0 450px;flex-shrink:1;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:0;border-color:#f2f2f2;overflow:hidden}.rsssl-dashboard-container .rsssl-dashboard-item .rsssl-top h1{font-weight:600;font-size:2.5em;padding:25px}.rsssl-dashboard-container .rsssl-dashboard-content-container{margin:0 auto;display:grid;grid-template-areas:'header-top header-top header-top header-top' 'text-completed text-completed text-completed text-completed' 'progress progress support support' 'progress progress documents documents' 'footer footer footer footer';grid-gap:10px;padding:10px}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container{grid-template-areas:'header-top header-top' 'text-completed text-completed' 'progress progress' 'support support' 'documents documents' 'footer footer' 'footer footer'}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-logo{display:flex;align-items:center;font-size:1.5em;font-weight:600}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-header-text{display:flex;align-items:center}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text{display:flex;align-items:center;margin-top:35px;grid-area:text-completed;font-size:24px;color:white}@media screen and (max-width:720px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text button{width:100px}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-info{font-size:19px;font-weight:bold;padding-top:20px;padding-bottom:10px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text{color:black;font-weight:400;padding:15px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text li{border-bottom:1px solid}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text .fa-plus{margin-right:8px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text.free{background-color:#000;color:#fff;min-height:40px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress{grid-area:progress}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress{margin:0 auto}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top{background-color:#f2f2f2;min-height:170px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text{display:inline-grid;font-size:18px;line-height:22px;max-width:60%;float:left}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text .rsssl-dashboard-top-text-subtitle{color:#f8be2e}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn{padding-top:125px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn button{text-align:-webkit-left;border-radius:50px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-percentage-complete{margin-top:20px;float:right}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table{padding-top:10px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .i.fa.fa-check{color:black}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-success,.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-error{color:black}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support{width:450px;grid-area:support}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support{margin:0 auto}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=text],.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=email],.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea,.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit]{width:425px;margin-bottom:5px;margin-top:5px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea{min-height:100px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit]{margin:auto}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents{grid-area:documents;margin-top:10px}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents{margin:0 auto}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table{padding-bottom:15px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fas{margin-right:8px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table ul{margin:5px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table li{border-bottom:2px solid;margin-bottom:5px;text-indent:5px;display:flex;vertical-align:middle;margin-left:8px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fa-plus{color:#f8be2e;font-size:1.5em}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom{color:white;background-color:black;min-height:70px;font-size:14px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom div{margin-bottom:10px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer{grid-area:footer;display:flex;flex-shrink:1;flex-grow:1;margin-top:20px;flex-wrap:wrap;justify-content:center;padding-bottom:20px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block{position:relative;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:0;background-color:#f2f2f2;width:205px;min-height:70px;margin:5px auto}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block a{position:absolute;top:5px;right:5px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-title{margin-top:9px;margin-left:9px;font-weight:900;font-size:1.2em;margin-right:35px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-description{width:70%;margin-left:9px;font-size:.8em;display:flex}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn{text-align:center;border-radius:7px;color:#f8be2e;width:25px;height:20px;float:right}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn .fa-angle-right{font-size:1.5em;vertical-align:middle;margin-left:2px}.rsssl-skeleton:empty{margin:auto;margin-bottom:25px;width:100%;height:235px;background-image:linear-gradient(100deg,rgba(255,255,255,0),rgba(255,255,255,0.5) 70%,rgba(255,255,255,0.5) 15%),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0);background-repeat:repeat-y;background-size:50px 200px,100% 117px,100% 117px,100% 117px,100% 117px;background-position:0 0,1px 1px,1px 40px,1px 79px,1px 118px;background-color:#d6d8db;animation:shine 2.5s infinite}@keyframes shine{to{background-position:100% 0,1px 1px,1px 40px,1px 79px,1px 118px}}@-webkit-keyframes sk-stretchdelay{0,40%,100%{-webkit-transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0,40%,100%{transform:scaleY(0.4);-webkit-transform:scaleY(0.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.rsssl-wizard-menu-menus{padding-top:10px}.rsssl-scroll{overflow:scroll;scroll-behavior:smooth;overflow-x:hidden}#wpbody-content{padding-bottom:0}#customization{z-index:10}.cc-window{right:1em}.cc-window.cc-center{transform:translate(0,-50%);left:initial}.cc-window.cc-left{left:initial}@keyframes slideInUpCenter{from{-webkit-transform:translate3d(0,150%,0);transform:translate3d(0,150%,0)}to{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}}@keyframes slideOutUpCenter{to{-webkit-transform:translate3d(0,150%,0);transform:translate3d(0,150%,0);opacity:1}from{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);opacity:1}}.rsssl-wizard-wrap{margin:0}#rsssl-proof-of-consent #rsssl-content-area,#rsssl-cookie-banner #rsssl-content-area{display:block}#rsssl-proof-of-consent #rsssl-content-area h1,#rsssl-cookie-banner #rsssl-content-area h1{background-color:white;padding:20px;border-bottom:1px solid #eee}#rsssl-proof-of-consent #rsssl-content-area .rsssl-panel,#rsssl-cookie-banner #rsssl-content-area .rsssl-panel{padding:20px;margin-bottom:20px}#rsssl-proof-of-consent #rsssl-content-area .rsssl-notice,#rsssl-cookie-banner #rsssl-content-area .rsssl-notice{background-color:white}#rsssl-proof-of-consent #rsssl-content-area input[name=rsssl_generate_snapshot],#rsssl-cookie-banner #rsssl-content-area input[name=rsssl_generate_snapshot]{width:120px}#rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-month-select,#rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-year-select,#rsssl-proof-of-consent #rsssl-content-area #post-query-submit,#rsssl-cookie-banner #rsssl-content-area #post-query-submit{float:right;margin-top:-50px;width:120px}#rsssl-proof-of-consent #rsssl-content-area #post-query-submit,#rsssl-cookie-banner #rsssl-content-area #post-query-submit{margin-right:0}#rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-month-select{margin-right:290px}#rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-year-select{margin-right:145px}#rsssl-proof-of-consent #rsssl-content-area .tablenav,#rsssl-cookie-banner #rsssl-content-area .tablenav{display:none}#rsssl-proof-of-consent #rsssl-content-area #rsssl-cookiestatement-snapshot-filter,#rsssl-cookie-banner #rsssl-content-area #rsssl-cookiestatement-snapshot-filter{padding-top:20px}#rsssl-proof-of-consent #rsssl-content-area .wp-list-table,#rsssl-cookie-banner #rsssl-content-area .wp-list-table{font-weight:bold}#rsssl-proof-of-consent #rsssl-content-area .wp-list-table th,#rsssl-cookie-banner #rsssl-content-area .wp-list-table th{font-weight:bold}#rsssl-proof-of-consent #rsssl-content-area .wp-list-table th a,#rsssl-cookie-banner #rsssl-content-area .wp-list-table th a{padding:15px}#wpbody-content .update-nag{display:none}#wpbody-content .subsubsub{display:none}#wpbody-content .wp-heading-inline{padding:20px 0}#wpbody-content .rsssl-document-button{margin-top:22px;margin-left:15px}#wpbody-content .cookie-warning .rsssl-document-button{margin-top:0}#wpbody-content #rsssl-region-select{margin-top:-6px;margin-left:15px;width:100px}#posts-filter .bulkactions,#posts-filter .tablenav-pages,#posts-filter .search-box{display:none}#posts-filter .tablenav.top{margin-top:0;padding-top:0}#posts-filter .wp-list-table{font-weight:bold}#posts-filter .wp-list-table th{font-weight:bold}#posts-filter .wp-list-table th a{padding:15px} wizard/assets/css/variables.min.css 0000644 00000000000 15154444756 0013407 0 ustar 00 wizard/assets/css/admin.css 0000644 00000006121 15154444756 0011757 0 ustar 00 .rsssl_letsencrypt_container { margin-top: 30px; background-color: #fafafa; } .rsssl_letsencrypt_container.rsssl-progress-container { margin: 20px 0 0; padding: 10px 0; border-radius: 5px; } .rsssl-dns-field { border: 1px solid #dedede; float: left; margin-bottom: 10px; width: 50%; padding: 10px; margin-left: 0; margin-top: 10px; } .rsssl-dns-label { font-weight: bold; margin-top: 25px; margin-bottom: 0; width: 50%; } #rsssl-lets-encrypt ul { margin-left: 50px; } #rsssl-lets-encrypt ul li { padding-right: 10px; /*Nested li */ } #rsssl-lets-encrypt ul li:before { background-color: #eeeeee; color: #fff; height: 10px; width: 10px; border-radius: 50%; content: ''; position: absolute; margin-top: 5px; margin-left: -30px; } #rsssl-lets-encrypt ul li.rsssl-warning:before { background-color: #f8be2e; } #rsssl-lets-encrypt ul li.rsssl-error:before { background-color: #D7263D; } #rsssl-lets-encrypt ul li.rsssl-success:before { background-color: #61ce70; } #rsssl-lets-encrypt ul li ul li:before { background-color: #888; color: #fff; height: 6px; width: 6px; border-radius: 50%; content: ''; position: absolute; margin-top: 7px; margin-left: -19px; } .rsssl-notice-hook-element { display: none; } /* Hide nags from other plugins */ .error:not(.really-simple-plugins), .notice:not(.really-simple-plugins), .update-nag:not(.really-simple-plugins), .notice-info:not(.really-simple-plugins) { display: none !important; } #rsssl-wizard { /** icons */ } #rsssl-wizard .rsssl-selectable { -webkit-touch-callout: all; /* iOS Safari */ -webkit-user-select: all; /* Safari */ -khtml-user-select: all; /* Konqueror HTML */ -moz-user-select: all; /* Firefox */ -ms-user-select: all; /* Internet Explorer/Edge */ user-select: all; /* Chrome and Opera */ } #rsssl-wizard #rsssl-header { display: flex; justify-content: space-between; padding: 20px; background-color: #fff; } #rsssl-wizard #rsssl-header img { margin-left: 15px; width: 120px; height: 28px; } #rsssl-wizard #rsssl-header .rsssl-header-right { display: flex; align-items: center; } #rsssl-wizard #rsssl-header .rsssl-header-right a { margin-right: 15px; } #rsssl-wizard #rsssl-content-area { margin: 10px; } #rsssl-wizard .rsssl-section .rsssl-success.check { margin-left: 5px; } #rsssl-wizard .rsssl-icon { height: initial; } #rsssl-wizard .rsssl-icon.rsssl-success { color: #61ce70; } #rsssl-wizard .rsssl-icon.rsssl-success svg { stroke: #61ce70; fill: #61ce70; } #rsssl-wizard .rsssl-icon.rsssl-success.documents-shortcode { color: #000; } #rsssl-wizard .rsssl-icon.rsssl-disabled { color: #d7d7d7; } #rsssl-wizard .rsssl-icon.rsssl-disabled svg { stroke: #d7d7d7; fill: #d7d7d7; } #rsssl-wizard .rsssl-icon:hover { color: #000; } #rsssl-wizard .rsssl-icon.rsssl-bullet { height: 11px; width: 11px; margin-top: 2px; } #rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-disabled { background-color: #d7d7d7; } #rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-success { background-color: #27ADEA; } /*# sourceMappingURL=admin.css.map */ wizard/assets/js/wizard.min.js 0000644 00000014501 15154444756 0012422 0 ustar 00 jQuery(document).ready(function($){"use strict";var select2Dropdown=$(".rsssl-select2");if(select2Dropdown.length){select2Dropdown.select2({width:"400px",placeholder:"Select or Add",language:{noResults:function(){return'<span id="rsssl-no-results-container">'+rsssl_wizard.no_results+"</span>"}},escapeMarkup:function(markup){return markup}})}$(document).on("click","#rsssl-no-results-container",function(){console.log("clicked");select2Dropdown.val("none");select2Dropdown.trigger("change");select2Dropdown.select2("close")});var copied_element=$(".rsssl-copied-feedback").html();$(document).on("click",".rsssl-copy-content",function(){var type=$(this).data("item");var success;var data=$(".rsssl-"+type).text();var temp_element=$("<textarea>");$("body").append(temp_element);temp_element.val(data).select();try{success=document.execCommand("copy")}catch(e){success=false}temp_element.remove();if(success){$('<span class="rsssl-copied-feedback-container">'+copied_element+"</span>").insertAfter($(this));setTimeout(function(){$(".rsssl-copied-feedback-container").fadeOut("slow")},5e3)}});function maybe_show_password_delete_questions(){var deletePasswordField=$(".field-group.store_credentials");if(deletePasswordField.length){deletePasswordField.addClass("rsssl-hidden")}var passwordFields=$(".rsssl-password");if(deletePasswordField.length){passwordFields.each(function(){if(!$(this).hasClass("rsssl-hidden")){console.log("is hidden field");deletePasswordField.removeClass("rsssl-hidden")}})}}window.setTimeout(function(){$(".rsssl-hide").fadeTo(500,0).slideUp(500,function(){$(this).remove()})},2e3);function remove_after_change(){$(".rsssl-panel.rsssl-remove-after-change").fadeTo(500,0).slideUp(500,function(){$(this).remove()})}function rsssl_validate_multiple(){$(".multiple-field").each(function(){var completed=true;$(this).find("input[type=text]").each(function(){if($(this).val()===""){completed=false}});$(this).find("textarea").each(function(){if($(this).val()===""){completed=false}});var icon=$(this).closest(".rsssl-panel").find(".rsssl-multiple-field-validation i");if(completed){icon.removeClass("fa-times");icon.addClass("fa-check")}else{icon.addClass("fa-times");icon.removeClass("fa-check")}})}rsssl_validate_multiple();$(document).on("keyup",".multiple-field input[type=text]",function(){rsssl_validate_multiple()});$(document).on("keyup",".multiple-field textarea",function(){rsssl_validate_multiple()});rsssl_validate_checkboxes();$(":checkbox").change(rsssl_validate_checkboxes);function rsssl_validate_checkboxes(){$(".rsssl-validate-multicheckbox").each(function(i){var set_required=[];var all_unchecked=true;$(this).find(":checkbox").each(function(i){set_required.push($(this));if($(this).is(":checked")){all_unchecked=false}});var container=$(this).closest(".field-group").find(".rsssl-label");if(all_unchecked){container.removeClass("valid-multicheckbox");container.addClass("invalid-multicheckbox");$.each(set_required,function(index,item){item.prop("required",true);item.addClass("is-required")})}else{container.removeClass("invalid-multicheckbox");container.addClass("valid-multicheckbox");$.each(set_required,function(index,item){item.prop("required",false);item.removeClass("is-required")})}});check_conditions()}$(document).on("change","input",function(e){check_conditions();remove_after_change()});$(document).on("keyup","input",function(e){check_conditions();remove_after_change()});$(document).on("change","select",function(e){check_conditions();remove_after_change()});$(document).on("change","textarea",function(e){check_conditions();remove_after_change()});$(document).on("keyup","textarea",function(e){remove_after_change()});$(document).on("click","button",function(e){remove_after_change()});if($("input[name=step]").val()==2){setTimeout(function(){if(typeof tinymce!=="undefined"){for(var i=0;i<tinymce.editors.length;i++){tinymce.editors[i].on("NodeChange keyup",function(ed,e){remove_after_change()})}}},5e3)}$(document).on("rssslRenderConditions",check_conditions);function check_conditions(){var value;var showIfConditionMet=true;$(".condition-check-1").each(function(e){var i;for(i=1;i<4;i++){var question="rsssl_"+$(this).data("condition-question-"+i);var condition_type="AND";if(question=="rsssl_undefined")return;var condition_answer=$(this).data("condition-answer-"+i);var input=$(this).find("input[type=checkbox]");if(!input.length){input=$(this).find("input")}if(!input.length){input=$(this).find("textarea")}if(!input.length){input=$(this).find("select")}if(input.length&&input[0].hasAttribute("required")){input.addClass("is-required")}condition_answer+="";if(condition_answer.indexOf("NOT ")!==-1){condition_answer=condition_answer.replace("NOT ","");showIfConditionMet=false}else{showIfConditionMet=true}var condition_answers=[];if(condition_answer.indexOf(" OR ")!==-1){condition_answers=condition_answer.split(" OR ");condition_type="OR"}else{condition_answers=[condition_answer]}var container=$(this);var conditionMet=false;condition_answers.forEach(function(condition_answer){value=get_input_value(question);if($("select[name="+question+"]").length){value=Array($("select[name="+question+"]").val())}if($("input[name='"+question+"["+condition_answer+"]"+"']").length){if($("input[name='"+question+"["+condition_answer+"]"+"']").is(":checked")){conditionMet=true;value=[]}else{conditionMet=false;value=[]}}if(showIfConditionMet){if(conditionMet||value.indexOf(condition_answer)!=-1||value==condition_answer||condition_answer==="EMPTY"&&value==""){container.removeClass("rsssl-hidden");if(input.hasClass("is-required"))input.prop("required",true);conditionMet=true}else{container.addClass("rsssl-hidden");if(input.hasClass("is-required"))input.prop("required",false)}}else{if(conditionMet||value.indexOf(condition_answer)!=-1||value==condition_answer||condition_answer==="EMPTY"&&value==""){container.addClass("rsssl-hidden");if(input.hasClass("is-required"))input.prop("required",false)}else{container.removeClass("rsssl-hidden");if(input.hasClass("is-required"))input.prop("required",true);conditionMet=true}}});if(!conditionMet){break}}});maybe_show_password_delete_questions()}function get_input_value(fieldName){var input=$("input[name="+fieldName+"]");if(input.attr("type")==="text"||input.attr("type")==="password"){return input.val()}else{var checked_boxes=[];$("input[name="+fieldName+"]:checked").each(function(){checked_boxes[checked_boxes.length]=$(this).val()});return checked_boxes}}}); wizard/assets/js/wizard.js 0000644 00000025676 15154444756 0011657 0 ustar 00 jQuery(document).ready(function ($) { 'use strict'; //select2 dropdown var select2Dropdown = $('.rsssl-select2'); if (select2Dropdown.length) { select2Dropdown.select2({ //tags: true, width:'400px', placeholder: 'Select or Add', language: { noResults: function() { return '<span id="rsssl-no-results-container">'+rsssl_wizard.no_results+'</span>'; }, }, escapeMarkup: function(markup) { return markup; }, }); } $(document).on('click','#rsssl-no-results-container',function(){ console.log("clicked"); select2Dropdown.val('none'); select2Dropdown.trigger('change'); select2Dropdown.select2('close'); }); var copied_element = $('.rsssl-copied-feedback').html(); $(document).on('click', '.rsssl-copy-content', function () { var type = $(this).data('item'); var success; var data = $('.rsssl-'+type).text(); var temp_element = $("<textarea>"); $("body").append(temp_element); temp_element.val(data).select(); try { success = document.execCommand("copy"); } catch (e) { success = false; } temp_element.remove(); if (success) { $('<span class="rsssl-copied-feedback-container">'+copied_element+'</span>').insertAfter($(this)); setTimeout(function(){ $('.rsssl-copied-feedback-container').fadeOut('slow') }, 5000); } }); function maybe_show_password_delete_questions(){ var deletePasswordField = $('.field-group.store_credentials'); if (deletePasswordField.length) { deletePasswordField.addClass('rsssl-hidden'); } var passwordFields = $('.rsssl-password'); if (deletePasswordField.length) { passwordFields.each(function(){ if ( !$(this).hasClass('rsssl-hidden') ) { console.log('is hidden field'); deletePasswordField.removeClass('rsssl-hidden'); } }); } } //remove alerts window.setTimeout(function () { $(".rsssl-hide").fadeTo(500, 0).slideUp(500, function () { $(this).remove(); }); }, 2000); function remove_after_change() { $(".rsssl-panel.rsssl-remove-after-change").fadeTo(500, 0).slideUp(500, function () { $(this).remove(); }); } /** * * On multiple fields, we check if all input type=text and textareas are filled * * */ function rsssl_validate_multiple() { $('.multiple-field').each(function(){ var completed=true; $(this).find('input[type=text]').each(function () { if ($(this).val()===''){ completed = false; } }); $(this).find('textarea').each(function () { if ($(this).val()===''){ completed = false; } }); var icon = $(this).closest('.rsssl-panel').find('.rsssl-multiple-field-validation i'); if (completed){ icon.removeClass('fa-times'); icon.addClass('fa-check'); } else { icon.addClass('fa-times'); icon.removeClass('fa-check'); } }); } rsssl_validate_multiple() $(document).on('keyup', '.multiple-field input[type=text]', function () { rsssl_validate_multiple(); }); $(document).on('keyup', '.multiple-field textarea', function () { rsssl_validate_multiple(); }); //validation of checkboxes rsssl_validate_checkboxes(); $(':checkbox').change(rsssl_validate_checkboxes); function rsssl_validate_checkboxes() { $('.rsssl-validate-multicheckbox').each(function (i) { var set_required = []; var all_unchecked = true; $(this).find(':checkbox').each(function (i) { set_required.push($(this)); if ($(this).is(':checked')) { all_unchecked = false; } }); var container = $(this).closest('.field-group').find('.rsssl-label'); if (all_unchecked) { container.removeClass('valid-multicheckbox'); container.addClass('invalid-multicheckbox'); $.each(set_required, function (index, item) { item.prop('required', true); item.addClass('is-required'); }); } else { container.removeClass('invalid-multicheckbox'); container.addClass('valid-multicheckbox'); $.each(set_required, function (index, item) { item.prop('required', false); item.removeClass('is-required'); }); } }); //now apply the required. check_conditions(); } $(document).on('change', 'input', function (e) { check_conditions(); remove_after_change(); }); $(document).on('keyup', 'input', function (e) { check_conditions(); remove_after_change(); }); $(document).on('change', 'select', function (e) { check_conditions(); remove_after_change(); }); $(document).on('change', 'textarea', function (e) { check_conditions(); remove_after_change(); }); $(document).on('keyup', 'textarea', function (e) { remove_after_change(); }); $(document).on('click', 'button', function (e) { remove_after_change(); }); if ($("input[name=step]").val() == 2) { setTimeout(function () { if (typeof tinymce !== 'undefined') { for (var i = 0; i < tinymce.editors.length; i++) { tinymce.editors[i].on('NodeChange keyup', function (ed, e) { remove_after_change(); }); } } }, 5000); } $(document).on("rssslRenderConditions", check_conditions); /*conditional fields*/ function check_conditions() { var value; var showIfConditionMet = true; $(".condition-check-1").each(function (e) { var i; for (i = 1; i < 4; i++) { var question = 'rsssl_' + $(this).data("condition-question-" + i); var condition_type = 'AND'; if (question == 'rsssl_undefined') return; var condition_answer = $(this).data("condition-answer-" + i); //remove required attribute of child, and set a class. var input = $(this).find('input[type=checkbox]'); if (!input.length) { input = $(this).find('input'); } if (!input.length) { input = $(this).find('textarea'); } if (!input.length) { input = $(this).find('select'); } if (input.length && input[0].hasAttribute('required')) { input.addClass('is-required'); } //cast into string condition_answer += ""; if (condition_answer.indexOf('NOT ') !== -1) { condition_answer = condition_answer.replace('NOT ', ''); showIfConditionMet = false; } else { showIfConditionMet = true; } var condition_answers = []; if (condition_answer.indexOf(' OR ') !== -1) { condition_answers = condition_answer.split(' OR '); condition_type = 'OR'; } else { condition_answers = [condition_answer]; } var container = $(this); var conditionMet = false; condition_answers.forEach(function (condition_answer) { value = get_input_value(question); if ($('select[name=' + question + ']').length) { value = Array($('select[name=' + question + ']').val()); } if ($("input[name='" + question + "[" + condition_answer + "]" + "']").length) { if ($("input[name='" + question + "[" + condition_answer + "]" + "']").is(':checked')) { conditionMet = true; value = []; } else { conditionMet = false; value = []; } } if (showIfConditionMet) { //check if the index of the value is the condition, or, if the value is the condition if (conditionMet || value.indexOf(condition_answer) != -1 || (value == condition_answer) || (condition_answer==='EMPTY' && value=='') ) { container.removeClass("rsssl-hidden"); //remove required attribute of child, and set a class. if (input.hasClass('is-required')) input.prop('required', true); //prevent further checks if it's an or/and statement conditionMet = true; } else { container.addClass("rsssl-hidden"); if (input.hasClass('is-required')) input.prop('required', false); } } else { if (conditionMet || value.indexOf(condition_answer) != -1 || (value == condition_answer) || (condition_answer==='EMPTY' && value=='') ) { container.addClass("rsssl-hidden"); if (input.hasClass('is-required')) input.prop('required', false); } else { container.removeClass("rsssl-hidden"); if (input.hasClass('is-required')) input.prop('required', true); conditionMet = true; } } }); if (!conditionMet) { break; } } }); maybe_show_password_delete_questions(); } /** get checkbox values, array proof. */ function get_input_value(fieldName) { var input = $('input[name=' + fieldName + ']'); if (input.attr('type') === 'text' || input.attr('type') === 'password') { return input.val(); } else { var checked_boxes = []; $('input[name=' + fieldName + ']:checked').each(function () { checked_boxes[checked_boxes.length] = $(this).val(); }); return checked_boxes; } } }); wizard/assets/icons.php 0000644 00000012505 15154444756 0011214 0 ustar 00 <?php /** * Get icon from predefined list * https://material.io/resources/icons/?search=sync&icon=sync_disabled&style=outline * @param string $icon_name * @param string $status * @param string $tooltip (optional) * * @return string */ function rsssl_icon( $icon_name, $status, $tooltip = '') { $size = 14; $vb = 22; $icons = array( 'bullet' => array( 'success' => array( 'type' => 'css', 'icon' => 'bullet', ), 'disabled' => array( 'type' => 'css', 'icon' => 'bullet', ) ), 'check' => array( 'success' => array( 'type' => 'svg', 'icon' => '<svg width="10" height="10" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z"/></svg>', ), 'green' => array( 'type' => 'svg', 'icon' => '<svg width="10" height="10" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z"/></svg>', ), 'prefilled' => array( 'type' => 'svg', 'icon' => '<svg width="10" height="10" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z"/></svg>', ), 'error' => array( 'type' => 'svg', 'icon' => '<svg width="10" height="10" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/></svg>', ), 'failed' => array( 'type' => 'svg', 'icon' => '<svg width="10" height="10" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/></svg>', ), 'empty' => array( 'type' => 'svg', 'icon' => '<svg width="10" height="10" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z"/></svg>', ), ), 'arrow-right-alt2' => array( 'success' => array( 'type' => 'dashicons', 'icon' => 'dashicons-arrow-right-alt2', ), ), 'arrow-right' => array( 'normal' => array( 'type' => 'dashicons', 'icon' => 'dashicons-arrow-right', ), ), 'sync' => array( 'success' => array( 'type' => 'dashicons', 'icon' => 'dashicons-update', ), 'error' => array( 'type' => 'dashicons', 'icon' => 'dashicons-update', ), 'disabled' => array( 'type' => 'dashicons', 'icon' => 'dashicons-update', ), ), 'file' => array( 'success' => array( 'type' => 'dashicons', 'icon' => 'dashicons-media-default', ), 'disabled' => array( 'type' => 'dashicons', 'icon' => 'dashicons-media-default', ), ), 'help' => array( 'normal' => array( 'type' => 'dashicons', 'icon' => 'dashicons-editor-help', ), ) ); if ( $tooltip ) { $tooltip = 'rsssl-tooltip="' . $tooltip . '" flow="right"'; } else if ( isset($icons[$icon_name][$status]['tooltip']) ) { $tooltip = 'rsssl-tooltip="' . $icons[$icon_name][$status]['tooltip'] . '" flow="left"'; } $icon = $icons[$icon_name][$status]['icon']; $type = $icons[$icon_name][$status]['type']; if ( $type === 'svg' ){ $html = '<div class="rsssl-tooltip-icon dashicons-before rsssl-icon rsssl-' . esc_attr( $status ) . ' ' . esc_attr($icon_name) . '" >' . $icon . '</div>'; } else if ( $type === 'dashicons' ) { $html = '<div class="rsssl-tooltip-icon dashicons-before rsssl-icon rsssl-' . esc_attr( $status ) . ' ' . esc_attr($icon_name) . ' ' . $icon . '" ></div>'; } else { $html = '<div class="rsssl-icon rsssl-bullet rsssl-' . esc_attr( $status ) . ' ' . esc_attr($icon_name) . ' ' . $icon . '" ></div>'; } return '<span '.$tooltip.'>'.$html.'</span>'; } wizard/assets/select2/js/select2.js 0000644 00000435463 15154444756 0013260 0 ustar 00 /*! * Select2 4.0.6-rc.1 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ ;(function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof module === 'object' && module.exports) { // Node/CommonJS module.exports = function (root, jQuery) { if (jQuery === undefined) { // require('jQuery') returns a factory that requires window to // build a jQuery instance, we normalize how we use modules // that require this pattern but the window provided is a noop // if it's defined (how jquery works) if (typeof window !== 'undefined') { jQuery = require('jquery'); } else { jQuery = require('jquery')(root); } } factory(jQuery); return jQuery; }; } else { // Browser globals factory(jQuery); } } (function (jQuery) { // This is needed so we can catch the AMD loader configuration and use it // The inner file should be wrapped (by `banner.start.js`) in a function that // returns the AMD loader references. var S2 =(function () { // Restore the Select2 AMD loader so it can be used // Needed mostly in the language files, where the loader is not inserted if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { var S2 = jQuery.fn.select2.amd; } var S2;(function () { if (!S2 || !S2.requirejs) { if (!S2) { S2 = {}; } else { require = S2; } /** * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. * Released under MIT license, http://github.com/requirejs/almond/LICENSE */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. /*global setTimeout: false */ var requirejs, require, define; (function (undef) { var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\.js$/; function hasProp(obj, prop) { return hasOwn.call(obj, prop); } /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. if (name) { name = name.split('/'); lastIndex = name.length - 1; // If wanting node ID compatibility, strip .js from end // of IDs. Have to do this here, and not in nameToUrl // because node allows either .js or non .js to map // to same file. if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } // Starts with a '.' so need the baseName if (name[0].charAt(0) === '.' && baseParts) { //Convert baseName to array, and lop off the last part, //so that . matches that 'directory' and not name of the baseName's //module. For instance, baseName of 'one/two/three', maps to //'one/two/three.js', but we want the directory, 'one/two' for //this normalization. normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); name = normalizedBaseParts.concat(name); } //start trimDots for (i = 0; i < name.length; i++) { part = name[i]; if (part === '.') { name.splice(i, 1); i -= 1; } else if (part === '..') { // If at the start, or previous value is still .., // keep them so that when converted to a path it may // still work when converted to a path, even though // as an ID it is less than ideal. In larger point // releases, may be better to just kick out an error. if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { continue; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } } //end trimDots name = name.join('/'); } //Apply map config if available. if ((baseParts || starMap) && map) { nameParts = name.split('/'); for (i = nameParts.length; i > 0; i -= 1) { nameSegment = nameParts.slice(0, i).join("/"); if (baseParts) { //Find the longest baseName segment match in the config. //So, do joins on the biggest to smallest lengths of baseParts. for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; foundI = i; break; } } } } if (foundMap) { break; } //Check for a star map match, but just hold on to it, //if there is a shorter segment match later in a matching //config, then favor over this star map. if (!foundStarMap && starMap && starMap[nameSegment]) { foundStarMap = starMap[nameSegment]; starI = i; } } if (!foundMap && foundStarMap) { foundMap = foundStarMap; foundI = starI; } if (foundMap) { nameParts.splice(0, foundI, foundMap); name = nameParts.join('/'); } } return name; } function makeRequire(relName, forceSync) { return function () { //A version of a require function that passes a moduleName //value for items that may need to //look up paths relative to the moduleName var args = aps.call(arguments, 0); //If first arg is not require('string'), and there is only //one arg, it is the array form without a callback. Insert //a null so that the following concat is correct. if (typeof args[0] !== 'string' && args.length === 1) { args.push(null); } return req.apply(undef, args.concat([relName, forceSync])); }; } function makeNormalize(relName) { return function (name) { return normalize(name, relName); }; } function makeLoad(depName) { return function (value) { defined[depName] = value; }; } function callDep(name) { if (hasProp(waiting, name)) { var args = waiting[name]; delete waiting[name]; defining[name] = true; main.apply(undef, args); } if (!hasProp(defined, name) && !hasProp(defining, name)) { throw new Error('No ' + name); } return defined[name]; } //Turns a plugin!resource to [plugin, resource] //with the plugin being undefined if the name //did not have a plugin prefix. function splitPrefix(name) { var prefix, index = name ? name.indexOf('!') : -1; if (index > -1) { prefix = name.substring(0, index); name = name.substring(index + 1, name.length); } return [prefix, name]; } //Creates a parts array for a relName where first part is plugin ID, //second part is resource ID. Assumes relName has already been normalized. function makeRelParts(relName) { return relName ? splitPrefix(relName) : []; } /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ makeMap = function (name, relParts) { var plugin, parts = splitPrefix(name), prefix = parts[0], relResourceName = relParts[1]; name = parts[1]; if (prefix) { prefix = normalize(prefix, relResourceName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { name = plugin.normalize(name, makeNormalize(relResourceName)); } else { name = normalize(name, relResourceName); } } else { name = normalize(name, relResourceName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; if (prefix) { plugin = callDep(prefix); } } //Using ridiculous property names for space reasons return { f: prefix ? prefix + '!' + name : name, //fullName n: name, pr: prefix, p: plugin }; }; function makeConfig(name) { return function () { return (config && config.config && config.config[name]) || {}; }; } handlers = { require: function (name) { return makeRequire(name); }, exports: function (name) { var e = defined[name]; if (typeof e !== 'undefined') { return e; } else { return (defined[name] = {}); } }, module: function (name) { return { id: name, uri: '', exports: defined[name], config: makeConfig(name) }; } }; main = function (name, deps, callback, relName) { var cjsModule, depName, ret, map, i, relParts, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; relParts = makeRelParts(relName); //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { //Pull out the defined dependencies and pass the ordered //values to the callback. //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { map = makeMap(deps[i], relParts); depName = map.f; //Fast path CommonJS standard dependencies. if (depName === "require") { args[i] = handlers.require(name); } else if (depName === "exports") { //CommonJS module spec 1.1 args[i] = handlers.exports(name); usingExports = true; } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = handlers.module(name); } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; } else { throw new Error(name + ' missing ' + depName); } } ret = callback ? callback.apply(defined[name], args) : undefined; if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { //May just be an object definition for the module. Only //worry about defining if have a module name. defined[name] = callback; } }; requirejs = require = req = function (deps, callback, relName, forceSync, alt) { if (typeof deps === "string") { if (handlers[deps]) { //callback in this case is really relName return handlers[deps](callback); } //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, makeRelParts(callback)).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; if (config.deps) { req(config.deps, config.callback); } if (!callback) { return; } if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; callback = relName; relName = null; } else { deps = undef; } } //Support require(['a']) callback = callback || function () {}; //If relName is a function, it is an errback handler, //so remove it. if (typeof relName === 'function') { relName = forceSync; forceSync = alt; } //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { //Using a non-zero value because of concern for what old browsers //do, and latest browsers "upgrade" to 4 if lower value is used: //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: //If want a value immediately, use require('id') instead -- something //that works in almond on the global level, but not guaranteed and //unlikely to work in other AMD implementations. setTimeout(function () { main(undef, deps, callback, relName); }, 4); } return req; }; /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ req.config = function (cfg) { return req(cfg); }; /** * Expose module registry for debugging and tooling */ requirejs._defined = defined; define = function (name, deps, callback) { if (typeof name !== 'string') { throw new Error('See almond README: incorrect module build, no module name'); } //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means //an object literal or factory function for //the value. Adjust args. callback = deps; deps = []; } if (!hasProp(defined, name) && !hasProp(waiting, name)) { waiting[name] = [name, deps, callback]; } }; define.amd = { jQuery: true }; }()); S2.requirejs = requirejs;S2.require = require;S2.define = define; } }()); S2.define("almond", function(){}); /* global jQuery:false, $:false */ S2.define('jquery',[],function () { var _$ = jQuery || $; if (_$ == null && console && console.error) { console.error( 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.' ); } return _$; }); S2.define('select2/utils',[ 'jquery' ], function ($) { var Utils = {}; Utils.Extend = function (ChildClass, SuperClass) { var __hasProp = {}.hasOwnProperty; function BaseConstructor () { this.constructor = ChildClass; } for (var key in SuperClass) { if (__hasProp.call(SuperClass, key)) { ChildClass[key] = SuperClass[key]; } } BaseConstructor.prototype = SuperClass.prototype; ChildClass.prototype = new BaseConstructor(); ChildClass.__super__ = SuperClass.prototype; return ChildClass; }; function getMethods (theClass) { var proto = theClass.prototype; var methods = []; for (var methodName in proto) { var m = proto[methodName]; if (typeof m !== 'function') { continue; } if (methodName === 'constructor') { continue; } methods.push(methodName); } return methods; } Utils.Decorate = function (SuperClass, DecoratorClass) { var decoratedMethods = getMethods(DecoratorClass); var superMethods = getMethods(SuperClass); function DecoratedClass () { var unshift = Array.prototype.unshift; var argCount = DecoratorClass.prototype.constructor.length; var calledConstructor = SuperClass.prototype.constructor; if (argCount > 0) { unshift.call(arguments, SuperClass.prototype.constructor); calledConstructor = DecoratorClass.prototype.constructor; } calledConstructor.apply(this, arguments); } DecoratorClass.displayName = SuperClass.displayName; function ctr () { this.constructor = DecoratedClass; } DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { var superMethod = superMethods[m]; DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { // Stub out the original method if it's not decorating an actual method var originalMethod = function () {}; if (methodName in DecoratedClass.prototype) { originalMethod = DecoratedClass.prototype[methodName]; } var decoratedMethod = DecoratorClass.prototype[methodName]; return function () { var unshift = Array.prototype.unshift; unshift.call(arguments, originalMethod); return decoratedMethod.apply(this, arguments); }; }; for (var d = 0; d < decoratedMethods.length; d++) { var decoratedMethod = decoratedMethods[d]; DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); } return DecoratedClass; }; var Observable = function () { this.listeners = {}; }; Observable.prototype.on = function (event, callback) { this.listeners = this.listeners || {}; if (event in this.listeners) { this.listeners[event].push(callback); } else { this.listeners[event] = [callback]; } }; Observable.prototype.trigger = function (event) { var slice = Array.prototype.slice; var params = slice.call(arguments, 1); this.listeners = this.listeners || {}; // Params should always come in as an array if (params == null) { params = []; } // If there are no arguments to the event, use a temporary object if (params.length === 0) { params.push({}); } // Set the `_type` of the first object to the event params[0]._type = event; if (event in this.listeners) { this.invoke(this.listeners[event], slice.call(arguments, 1)); } if ('*' in this.listeners) { this.invoke(this.listeners['*'], arguments); } }; Observable.prototype.invoke = function (listeners, params) { for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].apply(this, params); } }; Utils.Observable = Observable; Utils.generateChars = function (length) { var chars = ''; for (var i = 0; i < length; i++) { var randomChar = Math.floor(Math.random() * 36); chars += randomChar.toString(36); } return chars; }; Utils.bind = function (func, context) { return function () { func.apply(context, arguments); }; }; Utils._convertData = function (data) { for (var originalKey in data) { var keys = originalKey.split('-'); var dataLevel = data; if (keys.length === 1) { continue; } for (var k = 0; k < keys.length; k++) { var key = keys[k]; // Lowercase the first letter // By default, dash-separated becomes camelCase key = key.substring(0, 1).toLowerCase() + key.substring(1); if (!(key in dataLevel)) { dataLevel[key] = {}; } if (k == keys.length - 1) { dataLevel[key] = data[originalKey]; } dataLevel = dataLevel[key]; } delete data[originalKey]; } return data; }; Utils.hasScroll = function (index, el) { // Adapted from the function created by @ShadowScripter // and adapted by @BillBarry on the Stack Exchange Code Review website. // The original code can be found at // http://codereview.stackexchange.com/q/13338 // and was designed to be used with the Sizzle selector engine. var $el = $(el); var overflowX = el.style.overflowX; var overflowY = el.style.overflowY; //Check both x and y declarations if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) { return false; } if (overflowX === 'scroll' || overflowY === 'scroll') { return true; } return ($el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth); }; Utils.escapeMarkup = function (markup) { var replaceMap = { '\\': '\', '&': '&', '<': '<', '>': '>', '"': '"', '\'': ''', '/': '/' }; // Do not try to escape the markup if it's not a string if (typeof markup !== 'string') { return markup; } return String(markup).replace(/[&<>"'\/\\]/g, function (match) { return replaceMap[match]; }); }; // Append an array of jQuery nodes to a given element. Utils.appendMany = function ($element, $nodes) { // jQuery 1.7.x does not support $.fn.append() with an array // Fall back to a jQuery object collection using $.fn.add() if ($.fn.jquery.substr(0, 3) === '1.7') { var $jqNodes = $(); $.map($nodes, function (node) { $jqNodes = $jqNodes.add(node); }); $nodes = $jqNodes; } $element.append($nodes); }; // Cache objects in Utils.__cache instead of $.data (see #4346) Utils.__cache = {}; var id = 0; Utils.GetUniqueElementId = function (element) { // Get a unique element Id. If element has no id, // creates a new unique number, stores it in the id // attribute and returns the new id. // If an id already exists, it simply returns it. var select2Id = element.getAttribute('data-select2-id'); if (select2Id == null) { // If element has id, use it. if (element.id) { select2Id = element.id; element.setAttribute('data-select2-id', select2Id); } else { element.setAttribute('data-select2-id', ++id); select2Id = id.toString(); } } return select2Id; }; Utils.StoreData = function (element, name, value) { // Stores an item in the cache for a specified element. // name is the cache key. var id = Utils.GetUniqueElementId(element); if (!Utils.__cache[id]) { Utils.__cache[id] = {}; } Utils.__cache[id][name] = value; }; Utils.GetData = function (element, name) { // Retrieves a value from the cache by its key (name) // name is optional. If no name specified, return // all cache items for the specified element. // and for a specified element. var id = Utils.GetUniqueElementId(element); if (name) { if (Utils.__cache[id]) { return Utils.__cache[id][name] != null ? Utils.__cache[id][name]: $(element).data(name); // Fallback to HTML5 data attribs. } return $(element).data(name); // Fallback to HTML5 data attribs. } else { return Utils.__cache[id]; } }; Utils.RemoveData = function (element) { // Removes all cached items for a specified element. var id = Utils.GetUniqueElementId(element); if (Utils.__cache[id] != null) { delete Utils.__cache[id]; } }; return Utils; }); S2.define('select2/results',[ 'jquery', './utils' ], function ($, Utils) { function Results ($element, options, dataAdapter) { this.$element = $element; this.data = dataAdapter; this.options = options; Results.__super__.constructor.call(this); } Utils.Extend(Results, Utils.Observable); Results.prototype.render = function () { var $results = $( '<ul class="select2-results__options" role="tree"></ul>' ); if (this.options.get('multiple')) { $results.attr('aria-multiselectable', 'true'); } this.$results = $results; return $results; }; Results.prototype.clear = function () { this.$results.empty(); }; Results.prototype.displayMessage = function (params) { var escapeMarkup = this.options.get('escapeMarkup'); this.clear(); this.hideLoading(); var $message = $( '<li role="treeitem" aria-live="assertive"' + ' class="select2-results__option"></li>' ); var message = this.options.get('translations').get(params.message); $message.append( escapeMarkup( message(params.args) ) ); $message[0].className += ' select2-results__message'; this.$results.append($message); }; Results.prototype.hideMessages = function () { this.$results.find('.select2-results__message').remove(); }; Results.prototype.append = function (data) { this.hideLoading(); var $options = []; if (data.results == null || data.results.length === 0) { if (this.$results.children().length === 0) { this.trigger('results:message', { message: 'noResults' }); } return; } data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) { var item = data.results[d]; var $option = this.option(item); $options.push($option); } this.$results.append($options); }; Results.prototype.position = function ($results, $dropdown) { var $resultsContainer = $dropdown.find('.select2-results'); $resultsContainer.append($results); }; Results.prototype.sort = function (data) { var sorter = this.options.get('sorter'); return sorter(data); }; Results.prototype.highlightFirstItem = function () { var $options = this.$results .find('.select2-results__option[aria-selected]'); var $selected = $options.filter('[aria-selected=true]'); // Check if there are any selected options if ($selected.length > 0) { // If there are selected options, highlight the first $selected.first().trigger('mouseenter'); } else { // If there are no selected options, highlight the first option // in the dropdown $options.first().trigger('mouseenter'); } this.ensureHighlightVisible(); }; Results.prototype.setClasses = function () { var self = this; this.data.current(function (selected) { var selectedIds = $.map(selected, function (s) { return s.id.toString(); }); var $options = self.$results .find('.select2-results__option[aria-selected]'); $options.each(function () { var $option = $(this); var item = Utils.GetData(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; if ((item.element != null && item.element.selected) || (item.element == null && $.inArray(id, selectedIds) > -1)) { $option.attr('aria-selected', 'true'); } else { $option.attr('aria-selected', 'false'); } }); }); }; Results.prototype.showLoading = function (params) { this.hideLoading(); var loadingMore = this.options.get('translations').get('searching'); var loading = { disabled: true, loading: true, text: loadingMore(params) }; var $loading = this.option(loading); $loading.className += ' loading-results'; this.$results.prepend($loading); }; Results.prototype.hideLoading = function () { this.$results.find('.loading-results').remove(); }; Results.prototype.option = function (data) { var option = document.createElement('li'); option.className = 'select2-results__option'; var attrs = { 'role': 'treeitem', 'aria-selected': 'false' }; if (data.disabled) { delete attrs['aria-selected']; attrs['aria-disabled'] = 'true'; } if (data.id == null) { delete attrs['aria-selected']; } if (data._resultId != null) { option.id = data._resultId; } if (data.title) { option.title = data.title; } if (data.children) { attrs.role = 'group'; attrs['aria-label'] = data.text; delete attrs['aria-selected']; } for (var attr in attrs) { var val = attrs[attr]; option.setAttribute(attr, val); } if (data.children) { var $option = $(option); var label = document.createElement('strong'); label.className = 'select2-results__group'; var $label = $(label); this.template(data, label); var $children = []; for (var c = 0; c < data.children.length; c++) { var child = data.children[c]; var $child = this.option(child); $children.push($child); } var $childrenContainer = $('<ul></ul>', { 'class': 'select2-results__options select2-results__options--nested' }); $childrenContainer.append($children); $option.append(label); $option.append($childrenContainer); } else { this.template(data, option); } Utils.StoreData(option, 'data', data); return option; }; Results.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-results'; this.$results.attr('id', id); container.on('results:all', function (params) { self.clear(); self.append(params.data); if (container.isOpen()) { self.setClasses(); self.highlightFirstItem(); } }); container.on('results:append', function (params) { self.append(params.data); if (container.isOpen()) { self.setClasses(); } }); container.on('query', function (params) { self.hideMessages(); self.showLoading(params); }); container.on('select', function () { if (!container.isOpen()) { return; } self.setClasses(); self.highlightFirstItem(); }); container.on('unselect', function () { if (!container.isOpen()) { return; } self.setClasses(); self.highlightFirstItem(); }); container.on('open', function () { // When the dropdown is open, aria-expended="true" self.$results.attr('aria-expanded', 'true'); self.$results.attr('aria-hidden', 'false'); self.setClasses(); self.ensureHighlightVisible(); }); container.on('close', function () { // When the dropdown is closed, aria-expended="false" self.$results.attr('aria-expanded', 'false'); self.$results.attr('aria-hidden', 'true'); self.$results.removeAttr('aria-activedescendant'); }); container.on('results:toggle', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } $highlighted.trigger('mouseup'); }); container.on('results:select', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } var data = Utils.GetData($highlighted[0], 'data'); if ($highlighted.attr('aria-selected') == 'true') { self.trigger('close', {}); } else { self.trigger('select', { data: data }); } }); container.on('results:previous', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); // If we are already at te top, don't move further // If no options, currentIndex will be -1 if (currentIndex <= 0) { return; } var nextIndex = currentIndex - 1; // If none are highlighted, highlight the first if ($highlighted.length === 0) { nextIndex = 0; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top; var nextTop = $next.offset().top; var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextTop - currentOffset < 0) { self.$results.scrollTop(nextOffset); } }); container.on('results:next', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var nextIndex = currentIndex + 1; // If we are at the last option, stay there if (nextIndex >= $options.length) { return; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var nextBottom = $next.offset().top + $next.outerHeight(false); var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextBottom > currentOffset) { self.$results.scrollTop(nextOffset); } }); container.on('results:focus', function (params) { params.element.addClass('select2-results__option--highlighted'); }); container.on('results:message', function (params) { self.displayMessage(params); }); if ($.fn.mousewheel) { this.$results.on('mousewheel', function (e) { var top = self.$results.scrollTop(); var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); if (isAtTop) { self.$results.scrollTop(0); e.preventDefault(); e.stopPropagation(); } else if (isAtBottom) { self.$results.scrollTop( self.$results.get(0).scrollHeight - self.$results.height() ); e.preventDefault(); e.stopPropagation(); } }); } this.$results.on('mouseup', '.select2-results__option[aria-selected]', function (evt) { var $this = $(this); var data = Utils.GetData(this, 'data'); if ($this.attr('aria-selected') === 'true') { if (self.options.get('multiple')) { self.trigger('unselect', { originalEvent: evt, data: data }); } else { self.trigger('close', {}); } return; } self.trigger('select', { originalEvent: evt, data: data }); }); this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) { var data = Utils.GetData(this, 'data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted'); self.trigger('results:focus', { data: data, element: $(this) }); }); }; Results.prototype.getHighlightedResults = function () { var $highlighted = this.$results .find('.select2-results__option--highlighted'); return $highlighted; }; Results.prototype.destroy = function () { this.$results.remove(); }; Results.prototype.ensureHighlightVisible = function () { var $highlighted = this.getHighlightedResults(); if ($highlighted.length === 0) { return; } var $options = this.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var currentOffset = this.$results.offset().top; var nextTop = $highlighted.offset().top; var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); var offsetDelta = nextTop - currentOffset; nextOffset -= $highlighted.outerHeight(false) * 2; if (currentIndex <= 2) { this.$results.scrollTop(0); } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { this.$results.scrollTop(nextOffset); } }; Results.prototype.template = function (result, container) { var template = this.options.get('templateResult'); var escapeMarkup = this.options.get('escapeMarkup'); var content = template(result, container); if (content == null) { container.style.display = 'none'; } else if (typeof content === 'string') { container.innerHTML = escapeMarkup(content); } else { $(container).append(content); } }; return Results; }); S2.define('select2/keys',[ ], function () { var KEYS = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }; return KEYS; }); S2.define('select2/selection/base',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function BaseSelection ($element, options) { this.$element = $element; this.options = options; BaseSelection.__super__.constructor.call(this); } Utils.Extend(BaseSelection, Utils.Observable); BaseSelection.prototype.render = function () { var $selection = $( '<span class="select2-selection" role="combobox" ' + ' aria-haspopup="true" aria-expanded="false">' + '</span>' ); this._tabindex = 0; if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); this.$selection = $selection; return $selection; }; BaseSelection.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-container'; var resultsId = container.id + '-results'; this.container = container; this.$selection.on('focus', function (evt) { self.trigger('focus', evt); }); this.$selection.on('blur', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', function (evt) { self.trigger('keypress', evt); if (evt.which === KEYS.SPACE) { evt.preventDefault(); } }); container.on('results:focus', function (params) { self.$selection.attr('aria-activedescendant', params.data._resultId); }); container.on('selection:update', function (params) { self.update(params.data); }); container.on('open', function () { // When the dropdown is open, aria-expanded="true" self.$selection.attr('aria-expanded', 'true'); self.$selection.attr('aria-owns', resultsId); self._attachCloseHandler(container); }); container.on('close', function () { // When the dropdown is closed, aria-expanded="false" self.$selection.attr('aria-expanded', 'false'); self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); self.$selection.focus(); window.setTimeout(function () { self.$selection.focus(); }, 0); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); }); }; BaseSelection.prototype._handleBlur = function (evt) { var self = this; // This needs to be delayed as the active element is the body when the tab // key is pressed, possibly along with others. window.setTimeout(function () { // Don't trigger `blur` if the focus is still in the selection if ( (document.activeElement == self.$selection[0]) || ($.contains(self.$selection[0], document.activeElement)) ) { return; } self.trigger('blur', evt); }, 1); }; BaseSelection.prototype._attachCloseHandler = function (container) { var self = this; $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); var $select = $target.closest('.select2'); var $all = $('.select2.select2-container--open'); $all.each(function () { var $this = $(this); if (this == $select[0]) { return; } var $element = Utils.GetData(this, 'element'); $element.select2('close'); }); }); }; BaseSelection.prototype._detachCloseHandler = function (container) { $(document.body).off('mousedown.select2.' + container.id); }; BaseSelection.prototype.position = function ($selection, $container) { var $selectionContainer = $container.find('.selection'); $selectionContainer.append($selection); }; BaseSelection.prototype.destroy = function () { this._detachCloseHandler(this.container); }; BaseSelection.prototype.update = function (data) { throw new Error('The `update` method must be defined in child classes.'); }; return BaseSelection; }); S2.define('select2/selection/single',[ 'jquery', './base', '../utils', '../keys' ], function ($, BaseSelection, Utils, KEYS) { function SingleSelection () { SingleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(SingleSelection, BaseSelection); SingleSelection.prototype.render = function () { var $selection = SingleSelection.__super__.render.call(this); $selection.addClass('select2-selection--single'); $selection.html( '<span class="select2-selection__rendered"></span>' + '<span class="select2-selection__arrow" role="presentation">' + '<b role="presentation"></b>' + '</span>' ); return $selection; }; SingleSelection.prototype.bind = function (container, $container) { var self = this; SingleSelection.__super__.bind.apply(this, arguments); var id = container.id + '-container'; this.$selection.find('.select2-selection__rendered') .attr('id', id) .attr('role', 'textbox') .attr('aria-readonly', 'true'); this.$selection.attr('aria-labelledby', id); this.$selection.on('mousedown', function (evt) { // Only respond to left clicks if (evt.which !== 1) { return; } self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on('focus', function (evt) { // User focuses on the container }); this.$selection.on('blur', function (evt) { // User exits the container }); container.on('focus', function (evt) { if (!container.isOpen()) { self.$selection.focus(); } }); }; SingleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); // clear tooltip on empty }; SingleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; SingleSelection.prototype.selectionContainer = function () { return $('<span></span>'); }; SingleSelection.prototype.update = function (data) { if (data.length === 0) { this.clear(); return; } var selection = data[0]; var $rendered = this.$selection.find('.select2-selection__rendered'); var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); $rendered.attr('title', selection.title || selection.text); }; return SingleSelection; }); S2.define('select2/selection/multiple',[ 'jquery', './base', '../utils' ], function ($, BaseSelection, Utils) { function MultipleSelection ($element, options) { MultipleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(MultipleSelection, BaseSelection); MultipleSelection.prototype.render = function () { var $selection = MultipleSelection.__super__.render.call(this); $selection.addClass('select2-selection--multiple'); $selection.html( '<ul class="select2-selection__rendered"></ul>' ); return $selection; }; MultipleSelection.prototype.bind = function (container, $container) { var self = this; MultipleSelection.__super__.bind.apply(this, arguments); this.$selection.on('click', function (evt) { self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on( 'click', '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled if (self.options.get('disabled')) { return; } var $remove = $(this); var $selection = $remove.parent(); var data = Utils.GetData($selection[0], 'data'); self.trigger('unselect', { originalEvent: evt, data: data }); } ); }; MultipleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); }; MultipleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; MultipleSelection.prototype.selectionContainer = function () { var $container = $( '<li class="select2-selection__choice">' + '<span class="select2-selection__choice__remove" role="presentation">' + '×' + '</span>' + '</li>' ); return $container; }; MultipleSelection.prototype.update = function (data) { this.clear(); if (data.length === 0) { return; } var $selections = []; for (var d = 0; d < data.length; d++) { var selection = data[d]; var $selection = this.selectionContainer(); var formatted = this.display(selection, $selection); $selection.append(formatted); $selection.attr('title', selection.title || selection.text); Utils.StoreData($selection[0], 'data', selection); $selections.push($selection); } var $rendered = this.$selection.find('.select2-selection__rendered'); Utils.appendMany($rendered, $selections); }; return MultipleSelection; }); S2.define('select2/selection/placeholder',[ '../utils' ], function (Utils) { function Placeholder (decorated, $element, options) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options); } Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { var $placeholder = this.selectionContainer(); $placeholder.html(this.display(placeholder)); $placeholder.addClass('select2-selection__placeholder') .removeClass('select2-selection__choice'); return $placeholder; }; Placeholder.prototype.update = function (decorated, data) { var singlePlaceholder = ( data.length == 1 && data[0].id != this.placeholder.id ); var multipleSelections = data.length > 1; if (multipleSelections || singlePlaceholder) { return decorated.call(this, data); } this.clear(); var $placeholder = this.createPlaceholder(this.placeholder); this.$selection.find('.select2-selection__rendered').append($placeholder); }; return Placeholder; }); S2.define('select2/selection/allowClear',[ 'jquery', '../keys', '../utils' ], function ($, KEYS, Utils) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); if (this.placeholder == null) { if (this.options.get('debug') && window.console && console.error) { console.error( 'Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.' ); } } this.$selection.on('mousedown', '.select2-selection__clear', function (evt) { self._handleClear(evt); }); container.on('keypress', function (evt) { self._handleKeyboardClear(evt, container); }); }; AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled if (this.options.get('disabled')) { return; } var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected if ($clear.length === 0) { return; } evt.stopPropagation(); var data = Utils.GetData($clear[0], 'data'); var previousVal = this.$element.val(); this.$element.val(this.placeholder.id); var unselectData = { data: data }; this.trigger('clear', unselectData); if (unselectData.prevented) { this.$element.val(previousVal); return; } for (var d = 0; d < data.length; d++) { unselectData = { data: data[d] }; // Trigger the `unselect` event, so people can prevent it from being // cleared. this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out. if (unselectData.prevented) { this.$element.val(previousVal); return; } } this.$element.trigger('change'); this.trigger('toggle', {}); }; AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { if (container.isOpen()) { return; } if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { this._handleClear(evt); } }; AllowClear.prototype.update = function (decorated, data) { decorated.call(this, data); if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) { return; } var $remove = $( '<span class="select2-selection__clear">' + '×' + '</span>' ); Utils.StoreData($remove[0], 'data', data); this.$selection.find('.select2-selection__rendered').prepend($remove); }; return AllowClear; }); S2.define('select2/selection/search',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function Search (decorated, $element, options) { decorated.call(this, $element, options); } Search.prototype.render = function (decorated) { var $search = $( '<li class="select2-search select2-search--inline">' + '<input class="select2-search__field" type="search" tabindex="-1"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' spellcheck="false" role="textbox" aria-autocomplete="list" />' + '</li>' ); this.$searchContainer = $search; this.$search = $search.find('input'); var $rendered = decorated.call(this); this._transferTabIndex(); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { self.$search.attr('aria-activedescendant', params.id); }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$searchContainer .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.$selection.find('.select2-selection__rendered') .append(this.$searchContainer); this.resizeSearch(); if (searchHadFocus) { var isTagInput = this.$element.find('[data-select2-tag]').length; if (isTagInput) { // fix IE11 bug where tag input lost focus this.$element.focus(); } else { this.$search.focus(); } } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = ''; if (this.$search.attr('placeholder') !== '') { width = this.$selection.find('.select2-selection__rendered').innerWidth(); } else { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting', 'clear', 'clearing' ]; var preventableEvents = [ 'opening', 'closing', 'selecting', 'unselecting', 'clearing' ]; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if ($.inArray(name, relayEvents) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if ($.inArray(name, preventableEvents) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03C9': '\u03C9', '\u03C2': '\u03C3' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ($(data.element).is('option')) { data.element.selected = true; this.$element.trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if ($.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ($(data.element).is('option')) { data.element.selected = false; this.$element.trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && $.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 Utils.RemoveData(this); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { var $option = $(this); if (!$option.is('option') && !$option.is('optgroup')) { return; } var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { Utils.appendMany(this.$element, $options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id !== undefined) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var $option = $(option); var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data Utils.StoreData(option, 'data', normalizedData); return $option; }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = Utils.GetData($option[0], 'data'); if (data != null) { return data; } if ($option.is('option')) { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if ($option.is('optgroup')) { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (item !== Object(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { var data = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if ($.inArray(item.id, existingIds) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); Utils.appendMany($option, $children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if ($.isFunction(this._request.abort)) { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !$.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property if ('status' in $request && ($request.status === 0 || $request.status === '0')) { return; } self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term != null) { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if ($.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var optionText = (option.text || '').toUpperCase(); var paramsTerm = (params.term || '').toUpperCase(); var checkText = optionText === paramsTerm; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', true); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { var term = $.trim(params.term); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var tag = this._lastTag; var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function createAndSelect (data) { // Normalize the data object so we can use it for checks var item = self._normalizeItem(data); // Check if the data object already exists as a tag // Select it if it doesn't var $existingOptions = self.$element.find('option').filter(function () { return $(this).val() === item.id; }); // If an existing option wasn't found for it, create the option if (!$existingOptions.length) { var $option = self.option(item); $option.attr('data-select2-tag', true); self._removeOldTags(); self.addOptions([$option]); } // Select the item, now that we know there is an option for it select(item); } function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, createAndSelect); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.focus(); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if ($.inArray(termChar, separators) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } decorated.call(self, params, callback); }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '<span class="select2-dropdown">' + '<span class="select2-results"></span>' + '</span>' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implmented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery', '../utils' ], function ($, Utils) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var $search = $( '<span class="select2-search select2-search--dropdown">' + '<input class="select2-search__field" type="search" tabindex="-1"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' spellcheck="false" role="textbox" />' + '</span>' ); this.$searchContainer = $search; this.$search = $search.find('input'); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.focus(); window.setTimeout(function () { self.$search.focus(); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.val(''); self.$search.blur(); }); container.on('focus', function () { if (!container.isOpen()) { self.$search.focus(); } }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer.removeClass('select2-search--hide'); } else { self.$searchContainer.addClass('select2-search--hide'); } } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', function () { var isLoadMoreVisible = $.contains( document.documentElement, self.$loadingMore[0] ); if (self.loading || !isLoadMoreVisible) { return; } var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var loadingMoreOffset = self.$loadingMore.offset().top + self.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { self.loadMore(); } }); }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '<li ' + 'class="select2-results__option select2-results__option--load-more"' + 'role="treeitem" aria-disabled="true"></li>' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = options.get('dropdownParent') || $(document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; var setupResultsEvents = false; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); if (!setupResultsEvents) { setupResultsEvents = true; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); } }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown.removeClass('select2'); $dropdown.addClass('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $('<span></span>'); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calciulating the offset var $offsetParent = this.$dropdownParent; // For statically positoned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = $offsetParent.offset(); css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - parentOffset.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.position = 'relative'; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ '../utils' ], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function (params) { self._handleSelectOnClose(params); }); }; SelectOnClose.prototype._handleSelectOnClose = function (_, params) { if (params && params.originalSelect2Event != null) { var event = params.originalSelect2Event; // Don't select an item if the close event was triggered from a select or // unselect event if (event._type === 'select' || event._type === 'unselect') { return; } } var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && originalEvent.ctrlKey) { return; } this.trigger('close', { originalEvent: originalEvent, originalSelect2Event: evt }); }; return CloseOnSelect; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; } }; }); S2.define('select2/defaults',[ 'jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en' ], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } if (options.query != null) { var Query = require(options.amdBase + 'compat/query'); options.dataAdapter = Utils.Decorate( options.dataAdapter, Query ); } if (options.initSelection != null) { var InitSelection = require(options.amdBase + 'compat/initSelection'); options.dataAdapter = Utils.Decorate( options.dataAdapter, InitSelection ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if ( options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null ) { var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if ( options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null ) { var ContainerCSS = require(options.amdBase + 'compat/containerCss'); options.selectionAdapter = Utils.Decorate( options.selectionAdapter, ContainerCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } if (typeof options.language === 'string') { // Check if the language is specified with a region if (options.language.indexOf('-') > 0) { // Extract the region information if it is included var languageParts = options.language.split('-'); var baseLanguage = languageParts[0]; options.language = [options.language, baseLanguage]; } else { options.language = [options.language]; } } if ($.isArray(options.language)) { var languages = new Translation(); options.language.push('en'); var languageNames = options.language; for (var l = 0; l < languageNames.length; l++) { var name = languageNames[l]; var language = {}; try { // Try to load it with the original name language = Translation.loadPath(name); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path name = this.defaults.amdLanguageBase + name; language = Translation.loadPath(name); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files. if (options.debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + name + '" could not be ' + 'automatically loaded. A fallback will be used instead.' ); } continue; } } languages.extend(language); } options.translations = languages; } else { var baseTranslation = Translation.loadPath( this.defaults.amdLanguageBase + 'en' ); var customTranslation = new Translation(options.language); customTranslation.extend(baseTranslation); options.translations = customTranslation; } return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if ($.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdBase: './', amdLanguageBase: './i18n/', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: EnglishTranslation, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'require', 'jquery', './defaults', './utils' ], function (require, $, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { var InputCompat = require(this.get('amdBase') + 'compat/inputData'); this.options.dataAdapter = Utils.Decorate( this.options.dataAdapter, InputCompat ); } } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.language == null) { if ($e.prop('lang')) { this.options.language = $e.prop('lang').toLowerCase(); } else if ($e.closest('[lang]').prop('lang')) { this.options.language = $e.closest('[lang]').prop('lang'); } } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); Utils.StoreData($e[0], 'tags', true); } if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, Utils.GetData($e[0])); } else { dataset = Utils.GetData($e[0]); } var data = $.extend(true, {}, dataset); data = Utils._convertData(data); for (var key in data) { if ($.inArray(key, excludedData) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if (Utils.GetData($element[0], 'select2') != null) { Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element.addClass('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); Utils.StoreData($element[0], 'select2', this); // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this.$element.on('focus.select2', function (evt) { self.trigger('focus', evt); }); this._syncA = Utils.bind(this._syncAttributes, this); this._syncS = Utils.bind(this._syncSubtree, this); if (this.$element[0].attachEvent) { this.$element[0].attachEvent('onpropertychange', this._syncA); } var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver ; if (observer != null) { this._observer = new observer(function (mutations) { $.each(mutations, self._syncA); $.each(mutations, self._syncS); }); this._observer.observe(this.$element[0], { attributes: true, childList: true, subtree: false }); } else if (this.$element[0].addEventListener) { this.$element[0].addEventListener( 'DOMAttrModified', self._syncA, false ); this.$element[0].addEventListener( 'DOMNodeInserted', self._syncS, false ); this.$element[0].addEventListener( 'DOMNodeRemoved', self._syncS, false ); } }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if ($.inArray(name, nonRelayEvents) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container.addClass('select2-container--open'); }); this.on('close', function () { self.$container.removeClass('select2-container--open'); }); this.on('enable', function () { self.$container.removeClass('select2-container--disabled'); }); this.on('disable', function () { self.$container.addClass('select2-container--disabled'); }); this.on('blur', function () { self.$container.removeClass('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { self.close(); evt.preventDefault(); } else if (key === KEYS.ENTER) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.options.get('disabled')) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; Select2.prototype._syncSubtree = function (evt, mutations) { var changed = false; var self = this; // Ignore any mutation events raised for elements that aren't options or // optgroups. This handles the case when the select element is destroyed if ( evt && evt.target && ( evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' ) ) { return; } if (!mutations) { // If mutation events aren't supported, then we can only assume that the // change affected the selections changed = true; } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { for (var n = 0; n < mutations.addedNodes.length; n++) { var node = mutations.addedNodes[n]; if (node.selected) { changed = true; } } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; } // Only re-pull the data if we think there is a change if (changed) { this.dataAdapter.current(function (currentData) { self.trigger('selection:update', { data: currentData }); }); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting', 'clear': 'clearing' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.options.get('disabled')) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function () { if (!this.isOpen()) { return; } this.trigger('close', {}); }; Select2.prototype.isOpen = function () { return this.$container.hasClass('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container.hasClass('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container.addClass('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if ($.isArray(newVal)) { newVal = $.map(newVal, function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('change'); }; Select2.prototype.destroy = function () { this.$container.remove(); if (this.$element[0].detachEvent) { this.$element[0].detachEvent('onpropertychange', this._syncA); } if (this._observer != null) { this._observer.disconnect(); this._observer = null; } else if (this.$element[0].removeEventListener) { this.$element[0] .removeEventListener('DOMAttrModified', this._syncA, false); this.$element[0] .removeEventListener('DOMNodeInserted', this._syncS, false); this.$element[0] .removeEventListener('DOMNodeRemoved', this._syncS, false); } this._syncA = null; this._syncS = null; this.$element.off('.select2'); this.$element.attr('tabindex', Utils.GetData(this.$element[0], 'old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '<span class="select2 select2-container">' + '<span class="selection"></span>' + '<span class="dropdown-wrapper" aria-hidden="true"></span>' + '</span>' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container.addClass('select2-container--' + this.options.get('theme')); Utils.StoreData($container[0], 'element', this.$element); return $container; }; return Select2; }); S2.define('jquery-mousewheel',[ 'jquery' ], function ($) { // Used to shim jQuery.mousewheel for non-full builds. return $; }); S2.define('jquery.select2',[ 'jquery', 'jquery-mousewheel', './select2/core', './select2/defaults', './select2/utils' ], function ($, _, Select2, Defaults, Utils) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; $.fn.select2 = function (options) { options = options || {}; if (typeof options === 'object') { this.each(function () { var instanceOptions = $.extend(true, {}, options); var instance = new Select2($(this), instanceOptions); }); return this; } else if (typeof options === 'string') { var ret; var args = Array.prototype.slice.call(arguments, 1); this.each(function () { var instance = Utils.GetData(this, 'select2'); if (instance == null && window.console && console.error) { console.error( 'The select2(\'' + options + '\') method was called on an ' + 'element that is not using Select2.' ); } ret = instance[options].apply(instance, args); }); // Check if we should be returning `this` if ($.inArray(options, thisMethods) > -1) { return this; } return ret; } else { throw new Error('Invalid arguments for Select2: ' + options); } }; } if ($.fn.select2.defaults == null) { $.fn.select2.defaults = Defaults; } return Select2; }); // Return the AMD loader configuration so it can be used outside of this file return { define: S2.define, require: S2.require }; }()); // Autoload the jQuery bindings // We know that all of the modules exist above this, so we're safe var select2 = S2.require('jquery.select2'); // Hold the AMD module references on the jQuery function that was just loaded // This allows Select2 to use the internal loader outside of this file, such // as in the language files. jQuery.fn.select2.amd = S2; // Return the Select2 instance for anyone who is importing it. return select2; })); wizard/assets/select2/js/select2.full.min.js 0000644 00000312501 15154444756 0014766 0 ustar 00 (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else if(typeof module==="object"&&module.exports){module.exports=function(root,jQuery){if(jQuery===undefined){if(typeof window!=="undefined"){jQuery=require("jquery")}else{jQuery=require("jquery")(root)}}factory(jQuery);return jQuery}}else{factory(jQuery)}})(function(jQuery){var S2=function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd){var S2=jQuery.fn.select2.amd}var S2;(function(){if(!S2||!S2.requirejs){if(!S2){S2={}}else{require=S2}var requirejs,require,define;(function(undef){var main,req,makeMap,handlers,defined={},waiting={},config={},defining={},hasOwn=Object.prototype.hasOwnProperty,aps=[].slice,jsSuffixRegExp=/\.js$/;function hasProp(obj,prop){return hasOwn.call(obj,prop)}function normalize(name,baseName){var nameParts,nameSegment,mapValue,foundMap,lastIndex,foundI,foundStarMap,starI,i,j,part,normalizedBaseParts,baseParts=baseName&&baseName.split("/"),map=config.map,starMap=map&&map["*"]||{};if(name){name=name.split("/");lastIndex=name.length-1;if(config.nodeIdCompat&&jsSuffixRegExp.test(name[lastIndex])){name[lastIndex]=name[lastIndex].replace(jsSuffixRegExp,"")}if(name[0].charAt(0)==="."&&baseParts){normalizedBaseParts=baseParts.slice(0,baseParts.length-1);name=normalizedBaseParts.concat(name)}for(i=0;i<name.length;i++){part=name[i];if(part==="."){name.splice(i,1);i-=1}else if(part===".."){if(i===0||i===1&&name[2]===".."||name[i-1]===".."){continue}else if(i>0){name.splice(i-1,2);i-=2}}}name=name.join("/")}if((baseParts||starMap)&&map){nameParts=name.split("/");for(i=nameParts.length;i>0;i-=1){nameSegment=nameParts.slice(0,i).join("/");if(baseParts){for(j=baseParts.length;j>0;j-=1){mapValue=map[baseParts.slice(0,j).join("/")];if(mapValue){mapValue=mapValue[nameSegment];if(mapValue){foundMap=mapValue;foundI=i;break}}}}if(foundMap){break}if(!foundStarMap&&starMap&&starMap[nameSegment]){foundStarMap=starMap[nameSegment];starI=i}}if(!foundMap&&foundStarMap){foundMap=foundStarMap;foundI=starI}if(foundMap){nameParts.splice(0,foundI,foundMap);name=nameParts.join("/")}}return name}function makeRequire(relName,forceSync){return function(){var args=aps.call(arguments,0);if(typeof args[0]!=="string"&&args.length===1){args.push(null)}return req.apply(undef,args.concat([relName,forceSync]))}}function makeNormalize(relName){return function(name){return normalize(name,relName)}}function makeLoad(depName){return function(value){defined[depName]=value}}function callDep(name){if(hasProp(waiting,name)){var args=waiting[name];delete waiting[name];defining[name]=true;main.apply(undef,args)}if(!hasProp(defined,name)&&!hasProp(defining,name)){throw new Error("No "+name)}return defined[name]}function splitPrefix(name){var prefix,index=name?name.indexOf("!"):-1;if(index>-1){prefix=name.substring(0,index);name=name.substring(index+1,name.length)}return[prefix,name]}function makeRelParts(relName){return relName?splitPrefix(relName):[]}makeMap=function(name,relParts){var plugin,parts=splitPrefix(name),prefix=parts[0],relResourceName=relParts[1];name=parts[1];if(prefix){prefix=normalize(prefix,relResourceName);plugin=callDep(prefix)}if(prefix){if(plugin&&plugin.normalize){name=plugin.normalize(name,makeNormalize(relResourceName))}else{name=normalize(name,relResourceName)}}else{name=normalize(name,relResourceName);parts=splitPrefix(name);prefix=parts[0];name=parts[1];if(prefix){plugin=callDep(prefix)}}return{f:prefix?prefix+"!"+name:name,n:name,pr:prefix,p:plugin}};function makeConfig(name){return function(){return config&&config.config&&config.config[name]||{}}}handlers={require:function(name){return makeRequire(name)},exports:function(name){var e=defined[name];if(typeof e!=="undefined"){return e}else{return defined[name]={}}},module:function(name){return{id:name,uri:"",exports:defined[name],config:makeConfig(name)}}};main=function(name,deps,callback,relName){var cjsModule,depName,ret,map,i,relParts,args=[],callbackType=typeof callback,usingExports;relName=relName||name;relParts=makeRelParts(relName);if(callbackType==="undefined"||callbackType==="function"){deps=!deps.length&&callback.length?["require","exports","module"]:deps;for(i=0;i<deps.length;i+=1){map=makeMap(deps[i],relParts);depName=map.f;if(depName==="require"){args[i]=handlers.require(name)}else if(depName==="exports"){args[i]=handlers.exports(name);usingExports=true}else if(depName==="module"){cjsModule=args[i]=handlers.module(name)}else if(hasProp(defined,depName)||hasProp(waiting,depName)||hasProp(defining,depName)){args[i]=callDep(depName)}else if(map.p){map.p.load(map.n,makeRequire(relName,true),makeLoad(depName),{});args[i]=defined[depName]}else{throw new Error(name+" missing "+depName)}}ret=callback?callback.apply(defined[name],args):undefined;if(name){if(cjsModule&&cjsModule.exports!==undef&&cjsModule.exports!==defined[name]){defined[name]=cjsModule.exports}else if(ret!==undef||!usingExports){defined[name]=ret}}}else if(name){defined[name]=callback}};requirejs=require=req=function(deps,callback,relName,forceSync,alt){if(typeof deps==="string"){if(handlers[deps]){return handlers[deps](callback)}return callDep(makeMap(deps,makeRelParts(callback)).f)}else if(!deps.splice){config=deps;if(config.deps){req(config.deps,config.callback)}if(!callback){return}if(callback.splice){deps=callback;callback=relName;relName=null}else{deps=undef}}callback=callback||function(){};if(typeof relName==="function"){relName=forceSync;forceSync=alt}if(forceSync){main(undef,deps,callback,relName)}else{setTimeout(function(){main(undef,deps,callback,relName)},4)}return req};req.config=function(cfg){return req(cfg)};requirejs._defined=defined;define=function(name,deps,callback){if(typeof name!=="string"){throw new Error("See almond README: incorrect module build, no module name")}if(!deps.splice){callback=deps;deps=[]}if(!hasProp(defined,name)&&!hasProp(waiting,name)){waiting[name]=[name,deps,callback]}};define.amd={jQuery:true}})();S2.requirejs=requirejs;S2.require=require;S2.define=define}})();S2.define("almond",function(){});S2.define("jquery",[],function(){var _$=jQuery||$;if(_$==null&&console&&console.error){console.error("Select2: An instance of jQuery or a jQuery-compatible library was not "+"found. Make sure that you are including jQuery before Select2 on your "+"web page.")}return _$});S2.define("select2/utils",["jquery"],function($){var Utils={};Utils.Extend=function(ChildClass,SuperClass){var __hasProp={}.hasOwnProperty;function BaseConstructor(){this.constructor=ChildClass}for(var key in SuperClass){if(__hasProp.call(SuperClass,key)){ChildClass[key]=SuperClass[key]}}BaseConstructor.prototype=SuperClass.prototype;ChildClass.prototype=new BaseConstructor;ChildClass.__super__=SuperClass.prototype;return ChildClass};function getMethods(theClass){var proto=theClass.prototype;var methods=[];for(var methodName in proto){var m=proto[methodName];if(typeof m!=="function"){continue}if(methodName==="constructor"){continue}methods.push(methodName)}return methods}Utils.Decorate=function(SuperClass,DecoratorClass){var decoratedMethods=getMethods(DecoratorClass);var superMethods=getMethods(SuperClass);function DecoratedClass(){var unshift=Array.prototype.unshift;var argCount=DecoratorClass.prototype.constructor.length;var calledConstructor=SuperClass.prototype.constructor;if(argCount>0){unshift.call(arguments,SuperClass.prototype.constructor);calledConstructor=DecoratorClass.prototype.constructor}calledConstructor.apply(this,arguments)}DecoratorClass.displayName=SuperClass.displayName;function ctr(){this.constructor=DecoratedClass}DecoratedClass.prototype=new ctr;for(var m=0;m<superMethods.length;m++){var superMethod=superMethods[m];DecoratedClass.prototype[superMethod]=SuperClass.prototype[superMethod]}var calledMethod=function(methodName){var originalMethod=function(){};if(methodName in DecoratedClass.prototype){originalMethod=DecoratedClass.prototype[methodName]}var decoratedMethod=DecoratorClass.prototype[methodName];return function(){var unshift=Array.prototype.unshift;unshift.call(arguments,originalMethod);return decoratedMethod.apply(this,arguments)}};for(var d=0;d<decoratedMethods.length;d++){var decoratedMethod=decoratedMethods[d];DecoratedClass.prototype[decoratedMethod]=calledMethod(decoratedMethod)}return DecoratedClass};var Observable=function(){this.listeners={}};Observable.prototype.on=function(event,callback){this.listeners=this.listeners||{};if(event in this.listeners){this.listeners[event].push(callback)}else{this.listeners[event]=[callback]}};Observable.prototype.trigger=function(event){var slice=Array.prototype.slice;var params=slice.call(arguments,1);this.listeners=this.listeners||{};if(params==null){params=[]}if(params.length===0){params.push({})}params[0]._type=event;if(event in this.listeners){this.invoke(this.listeners[event],slice.call(arguments,1))}if("*"in this.listeners){this.invoke(this.listeners["*"],arguments)}};Observable.prototype.invoke=function(listeners,params){for(var i=0,len=listeners.length;i<len;i++){listeners[i].apply(this,params)}};Utils.Observable=Observable;Utils.generateChars=function(length){var chars="";for(var i=0;i<length;i++){var randomChar=Math.floor(Math.random()*36);chars+=randomChar.toString(36)}return chars};Utils.bind=function(func,context){return function(){func.apply(context,arguments)}};Utils._convertData=function(data){for(var originalKey in data){var keys=originalKey.split("-");var dataLevel=data;if(keys.length===1){continue}for(var k=0;k<keys.length;k++){var key=keys[k];key=key.substring(0,1).toLowerCase()+key.substring(1);if(!(key in dataLevel)){dataLevel[key]={}}if(k==keys.length-1){dataLevel[key]=data[originalKey]}dataLevel=dataLevel[key]}delete data[originalKey]}return data};Utils.hasScroll=function(index,el){var $el=$(el);var overflowX=el.style.overflowX;var overflowY=el.style.overflowY;if(overflowX===overflowY&&(overflowY==="hidden"||overflowY==="visible")){return false}if(overflowX==="scroll"||overflowY==="scroll"){return true}return $el.innerHeight()<el.scrollHeight||$el.innerWidth()<el.scrollWidth};Utils.escapeMarkup=function(markup){var replaceMap={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};if(typeof markup!=="string"){return markup}return String(markup).replace(/[&<>"'\/\\]/g,function(match){return replaceMap[match]})};Utils.appendMany=function($element,$nodes){if($.fn.jquery.substr(0,3)==="1.7"){var $jqNodes=$();$.map($nodes,function(node){$jqNodes=$jqNodes.add(node)});$nodes=$jqNodes}$element.append($nodes)};Utils.__cache={};var id=0;Utils.GetUniqueElementId=function(element){var select2Id=element.getAttribute("data-select2-id");if(select2Id==null){if(element.id){select2Id=element.id;element.setAttribute("data-select2-id",select2Id)}else{element.setAttribute("data-select2-id",++id);select2Id=id.toString()}}return select2Id};Utils.StoreData=function(element,name,value){var id=Utils.GetUniqueElementId(element);if(!Utils.__cache[id]){Utils.__cache[id]={}}Utils.__cache[id][name]=value};Utils.GetData=function(element,name){var id=Utils.GetUniqueElementId(element);if(name){if(Utils.__cache[id]){return Utils.__cache[id][name]!=null?Utils.__cache[id][name]:$(element).data(name)}return $(element).data(name)}else{return Utils.__cache[id]}};Utils.RemoveData=function(element){var id=Utils.GetUniqueElementId(element);if(Utils.__cache[id]!=null){delete Utils.__cache[id]}};return Utils});S2.define("select2/results",["jquery","./utils"],function($,Utils){function Results($element,options,dataAdapter){this.$element=$element;this.data=dataAdapter;this.options=options;Results.__super__.constructor.call(this)}Utils.Extend(Results,Utils.Observable);Results.prototype.render=function(){var $results=$('<ul class="select2-results__options" role="tree"></ul>');if(this.options.get("multiple")){$results.attr("aria-multiselectable","true")}this.$results=$results;return $results};Results.prototype.clear=function(){this.$results.empty()};Results.prototype.displayMessage=function(params){var escapeMarkup=this.options.get("escapeMarkup");this.clear();this.hideLoading();var $message=$('<li role="treeitem" aria-live="assertive"'+' class="select2-results__option"></li>');var message=this.options.get("translations").get(params.message);$message.append(escapeMarkup(message(params.args)));$message[0].className+=" select2-results__message";this.$results.append($message)};Results.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()};Results.prototype.append=function(data){this.hideLoading();var $options=[];if(data.results==null||data.results.length===0){if(this.$results.children().length===0){this.trigger("results:message",{message:"noResults"})}return}data.results=this.sort(data.results);for(var d=0;d<data.results.length;d++){var item=data.results[d];var $option=this.option(item);$options.push($option)}this.$results.append($options)};Results.prototype.position=function($results,$dropdown){var $resultsContainer=$dropdown.find(".select2-results");$resultsContainer.append($results)};Results.prototype.sort=function(data){var sorter=this.options.get("sorter");return sorter(data)};Results.prototype.highlightFirstItem=function(){var $options=this.$results.find(".select2-results__option[aria-selected]");var $selected=$options.filter("[aria-selected=true]");if($selected.length>0){$selected.first().trigger("mouseenter")}else{$options.first().trigger("mouseenter")}this.ensureHighlightVisible()};Results.prototype.setClasses=function(){var self=this;this.data.current(function(selected){var selectedIds=$.map(selected,function(s){return s.id.toString()});var $options=self.$results.find(".select2-results__option[aria-selected]");$options.each(function(){var $option=$(this);var item=Utils.GetData(this,"data");var id=""+item.id;if(item.element!=null&&item.element.selected||item.element==null&&$.inArray(id,selectedIds)>-1){$option.attr("aria-selected","true")}else{$option.attr("aria-selected","false")}})})};Results.prototype.showLoading=function(params){this.hideLoading();var loadingMore=this.options.get("translations").get("searching");var loading={disabled:true,loading:true,text:loadingMore(params)};var $loading=this.option(loading);$loading.className+=" loading-results";this.$results.prepend($loading)};Results.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()};Results.prototype.option=function(data){var option=document.createElement("li");option.className="select2-results__option";var attrs={role:"treeitem","aria-selected":"false"};if(data.disabled){delete attrs["aria-selected"];attrs["aria-disabled"]="true"}if(data.id==null){delete attrs["aria-selected"]}if(data._resultId!=null){option.id=data._resultId}if(data.title){option.title=data.title}if(data.children){attrs.role="group";attrs["aria-label"]=data.text;delete attrs["aria-selected"]}for(var attr in attrs){var val=attrs[attr];option.setAttribute(attr,val)}if(data.children){var $option=$(option);var label=document.createElement("strong");label.className="select2-results__group";var $label=$(label);this.template(data,label);var $children=[];for(var c=0;c<data.children.length;c++){var child=data.children[c];var $child=this.option(child);$children.push($child)}var $childrenContainer=$("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});$childrenContainer.append($children);$option.append(label);$option.append($childrenContainer)}else{this.template(data,option)}Utils.StoreData(option,"data",data);return option};Results.prototype.bind=function(container,$container){var self=this;var id=container.id+"-results";this.$results.attr("id",id);container.on("results:all",function(params){self.clear();self.append(params.data);if(container.isOpen()){self.setClasses();self.highlightFirstItem()}});container.on("results:append",function(params){self.append(params.data);if(container.isOpen()){self.setClasses()}});container.on("query",function(params){self.hideMessages();self.showLoading(params)});container.on("select",function(){if(!container.isOpen()){return}self.setClasses();self.highlightFirstItem()});container.on("unselect",function(){if(!container.isOpen()){return}self.setClasses();self.highlightFirstItem()});container.on("open",function(){self.$results.attr("aria-expanded","true");self.$results.attr("aria-hidden","false");self.setClasses();self.ensureHighlightVisible()});container.on("close",function(){self.$results.attr("aria-expanded","false");self.$results.attr("aria-hidden","true");self.$results.removeAttr("aria-activedescendant")});container.on("results:toggle",function(){var $highlighted=self.getHighlightedResults();if($highlighted.length===0){return}$highlighted.trigger("mouseup")});container.on("results:select",function(){var $highlighted=self.getHighlightedResults();if($highlighted.length===0){return}var data=Utils.GetData($highlighted[0],"data");if($highlighted.attr("aria-selected")=="true"){self.trigger("close",{})}else{self.trigger("select",{data:data})}});container.on("results:previous",function(){var $highlighted=self.getHighlightedResults();var $options=self.$results.find("[aria-selected]");var currentIndex=$options.index($highlighted);if(currentIndex<=0){return}var nextIndex=currentIndex-1;if($highlighted.length===0){nextIndex=0}var $next=$options.eq(nextIndex);$next.trigger("mouseenter");var currentOffset=self.$results.offset().top;var nextTop=$next.offset().top;var nextOffset=self.$results.scrollTop()+(nextTop-currentOffset);if(nextIndex===0){self.$results.scrollTop(0)}else if(nextTop-currentOffset<0){self.$results.scrollTop(nextOffset)}});container.on("results:next",function(){var $highlighted=self.getHighlightedResults();var $options=self.$results.find("[aria-selected]");var currentIndex=$options.index($highlighted);var nextIndex=currentIndex+1;if(nextIndex>=$options.length){return}var $next=$options.eq(nextIndex);$next.trigger("mouseenter");var currentOffset=self.$results.offset().top+self.$results.outerHeight(false);var nextBottom=$next.offset().top+$next.outerHeight(false);var nextOffset=self.$results.scrollTop()+nextBottom-currentOffset;if(nextIndex===0){self.$results.scrollTop(0)}else if(nextBottom>currentOffset){self.$results.scrollTop(nextOffset)}});container.on("results:focus",function(params){params.element.addClass("select2-results__option--highlighted")});container.on("results:message",function(params){self.displayMessage(params)});if($.fn.mousewheel){this.$results.on("mousewheel",function(e){var top=self.$results.scrollTop();var bottom=self.$results.get(0).scrollHeight-top+e.deltaY;var isAtTop=e.deltaY>0&&top-e.deltaY<=0;var isAtBottom=e.deltaY<0&&bottom<=self.$results.height();if(isAtTop){self.$results.scrollTop(0);e.preventDefault();e.stopPropagation()}else if(isAtBottom){self.$results.scrollTop(self.$results.get(0).scrollHeight-self.$results.height());e.preventDefault();e.stopPropagation()}})}this.$results.on("mouseup",".select2-results__option[aria-selected]",function(evt){var $this=$(this);var data=Utils.GetData(this,"data");if($this.attr("aria-selected")==="true"){if(self.options.get("multiple")){self.trigger("unselect",{originalEvent:evt,data:data})}else{self.trigger("close",{})}return}self.trigger("select",{originalEvent:evt,data:data})});this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(evt){var data=Utils.GetData(this,"data");self.getHighlightedResults().removeClass("select2-results__option--highlighted");self.trigger("results:focus",{data:data,element:$(this)})})};Results.prototype.getHighlightedResults=function(){var $highlighted=this.$results.find(".select2-results__option--highlighted");return $highlighted};Results.prototype.destroy=function(){this.$results.remove()};Results.prototype.ensureHighlightVisible=function(){var $highlighted=this.getHighlightedResults();if($highlighted.length===0){return}var $options=this.$results.find("[aria-selected]");var currentIndex=$options.index($highlighted);var currentOffset=this.$results.offset().top;var nextTop=$highlighted.offset().top;var nextOffset=this.$results.scrollTop()+(nextTop-currentOffset);var offsetDelta=nextTop-currentOffset;nextOffset-=$highlighted.outerHeight(false)*2;if(currentIndex<=2){this.$results.scrollTop(0)}else if(offsetDelta>this.$results.outerHeight()||offsetDelta<0){this.$results.scrollTop(nextOffset)}};Results.prototype.template=function(result,container){var template=this.options.get("templateResult");var escapeMarkup=this.options.get("escapeMarkup");var content=template(result,container);if(content==null){container.style.display="none"}else if(typeof content==="string"){container.innerHTML=escapeMarkup(content)}else{$(container).append(content)}};return Results});S2.define("select2/keys",[],function(){var KEYS={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return KEYS});S2.define("select2/selection/base",["jquery","../utils","../keys"],function($,Utils,KEYS){function BaseSelection($element,options){this.$element=$element;this.options=options;BaseSelection.__super__.constructor.call(this)}Utils.Extend(BaseSelection,Utils.Observable);BaseSelection.prototype.render=function(){var $selection=$('<span class="select2-selection" role="combobox" '+' aria-haspopup="true" aria-expanded="false">'+"</span>");this._tabindex=0;if(Utils.GetData(this.$element[0],"old-tabindex")!=null){this._tabindex=Utils.GetData(this.$element[0],"old-tabindex")}else if(this.$element.attr("tabindex")!=null){this._tabindex=this.$element.attr("tabindex")}$selection.attr("title",this.$element.attr("title"));$selection.attr("tabindex",this._tabindex);this.$selection=$selection;return $selection};BaseSelection.prototype.bind=function(container,$container){var self=this;var id=container.id+"-container";var resultsId=container.id+"-results";this.container=container;this.$selection.on("focus",function(evt){self.trigger("focus",evt)});this.$selection.on("blur",function(evt){self._handleBlur(evt)});this.$selection.on("keydown",function(evt){self.trigger("keypress",evt);if(evt.which===KEYS.SPACE){evt.preventDefault()}});container.on("results:focus",function(params){self.$selection.attr("aria-activedescendant",params.data._resultId)});container.on("selection:update",function(params){self.update(params.data)});container.on("open",function(){self.$selection.attr("aria-expanded","true");self.$selection.attr("aria-owns",resultsId);self._attachCloseHandler(container)});container.on("close",function(){self.$selection.attr("aria-expanded","false");self.$selection.removeAttr("aria-activedescendant");self.$selection.removeAttr("aria-owns");self.$selection.focus();window.setTimeout(function(){self.$selection.focus()},0);self._detachCloseHandler(container)});container.on("enable",function(){self.$selection.attr("tabindex",self._tabindex)});container.on("disable",function(){self.$selection.attr("tabindex","-1")})};BaseSelection.prototype._handleBlur=function(evt){var self=this;window.setTimeout(function(){if(document.activeElement==self.$selection[0]||$.contains(self.$selection[0],document.activeElement)){return}self.trigger("blur",evt)},1)};BaseSelection.prototype._attachCloseHandler=function(container){var self=this;$(document.body).on("mousedown.select2."+container.id,function(e){var $target=$(e.target);var $select=$target.closest(".select2");var $all=$(".select2.select2-container--open");$all.each(function(){var $this=$(this);if(this==$select[0]){return}var $element=Utils.GetData(this,"element");$element.select2("close")})})};BaseSelection.prototype._detachCloseHandler=function(container){$(document.body).off("mousedown.select2."+container.id)};BaseSelection.prototype.position=function($selection,$container){var $selectionContainer=$container.find(".selection");$selectionContainer.append($selection)};BaseSelection.prototype.destroy=function(){this._detachCloseHandler(this.container)};BaseSelection.prototype.update=function(data){throw new Error("The `update` method must be defined in child classes.")};return BaseSelection});S2.define("select2/selection/single",["jquery","./base","../utils","../keys"],function($,BaseSelection,Utils,KEYS){function SingleSelection(){SingleSelection.__super__.constructor.apply(this,arguments)}Utils.Extend(SingleSelection,BaseSelection);SingleSelection.prototype.render=function(){var $selection=SingleSelection.__super__.render.call(this);$selection.addClass("select2-selection--single");$selection.html('<span class="select2-selection__rendered"></span>'+'<span class="select2-selection__arrow" role="presentation">'+'<b role="presentation"></b>'+"</span>");return $selection};SingleSelection.prototype.bind=function(container,$container){var self=this;SingleSelection.__super__.bind.apply(this,arguments);var id=container.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",id).attr("role","textbox").attr("aria-readonly","true");this.$selection.attr("aria-labelledby",id);this.$selection.on("mousedown",function(evt){if(evt.which!==1){return}self.trigger("toggle",{originalEvent:evt})});this.$selection.on("focus",function(evt){});this.$selection.on("blur",function(evt){});container.on("focus",function(evt){if(!container.isOpen()){self.$selection.focus()}})};SingleSelection.prototype.clear=function(){var $rendered=this.$selection.find(".select2-selection__rendered");$rendered.empty();$rendered.removeAttr("title")};SingleSelection.prototype.display=function(data,container){var template=this.options.get("templateSelection");var escapeMarkup=this.options.get("escapeMarkup");return escapeMarkup(template(data,container))};SingleSelection.prototype.selectionContainer=function(){return $("<span></span>")};SingleSelection.prototype.update=function(data){if(data.length===0){this.clear();return}var selection=data[0];var $rendered=this.$selection.find(".select2-selection__rendered");var formatted=this.display(selection,$rendered);$rendered.empty().append(formatted);$rendered.attr("title",selection.title||selection.text)};return SingleSelection});S2.define("select2/selection/multiple",["jquery","./base","../utils"],function($,BaseSelection,Utils){function MultipleSelection($element,options){MultipleSelection.__super__.constructor.apply(this,arguments)}Utils.Extend(MultipleSelection,BaseSelection);MultipleSelection.prototype.render=function(){var $selection=MultipleSelection.__super__.render.call(this);$selection.addClass("select2-selection--multiple");$selection.html('<ul class="select2-selection__rendered"></ul>');return $selection};MultipleSelection.prototype.bind=function(container,$container){var self=this;MultipleSelection.__super__.bind.apply(this,arguments);this.$selection.on("click",function(evt){self.trigger("toggle",{originalEvent:evt})});this.$selection.on("click",".select2-selection__choice__remove",function(evt){if(self.options.get("disabled")){return}var $remove=$(this);var $selection=$remove.parent();var data=Utils.GetData($selection[0],"data");self.trigger("unselect",{originalEvent:evt,data:data})})};MultipleSelection.prototype.clear=function(){var $rendered=this.$selection.find(".select2-selection__rendered");$rendered.empty();$rendered.removeAttr("title")};MultipleSelection.prototype.display=function(data,container){var template=this.options.get("templateSelection");var escapeMarkup=this.options.get("escapeMarkup");return escapeMarkup(template(data,container))};MultipleSelection.prototype.selectionContainer=function(){var $container=$('<li class="select2-selection__choice">'+'<span class="select2-selection__choice__remove" role="presentation">'+"×"+"</span>"+"</li>");return $container};MultipleSelection.prototype.update=function(data){this.clear();if(data.length===0){return}var $selections=[];for(var d=0;d<data.length;d++){var selection=data[d];var $selection=this.selectionContainer();var formatted=this.display(selection,$selection);$selection.append(formatted);$selection.attr("title",selection.title||selection.text);Utils.StoreData($selection[0],"data",selection);$selections.push($selection)}var $rendered=this.$selection.find(".select2-selection__rendered");Utils.appendMany($rendered,$selections)};return MultipleSelection});S2.define("select2/selection/placeholder",["../utils"],function(Utils){function Placeholder(decorated,$element,options){this.placeholder=this.normalizePlaceholder(options.get("placeholder"));decorated.call(this,$element,options)}Placeholder.prototype.normalizePlaceholder=function(_,placeholder){if(typeof placeholder==="string"){placeholder={id:"",text:placeholder}}return placeholder};Placeholder.prototype.createPlaceholder=function(decorated,placeholder){var $placeholder=this.selectionContainer();$placeholder.html(this.display(placeholder));$placeholder.addClass("select2-selection__placeholder").removeClass("select2-selection__choice");return $placeholder};Placeholder.prototype.update=function(decorated,data){var singlePlaceholder=data.length==1&&data[0].id!=this.placeholder.id;var multipleSelections=data.length>1;if(multipleSelections||singlePlaceholder){return decorated.call(this,data)}this.clear();var $placeholder=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append($placeholder)};return Placeholder});S2.define("select2/selection/allowClear",["jquery","../keys","../utils"],function($,KEYS,Utils){function AllowClear(){}AllowClear.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);if(this.placeholder==null){if(this.options.get("debug")&&window.console&&console.error){console.error("Select2: The `allowClear` option should be used in combination "+"with the `placeholder` option.")}}this.$selection.on("mousedown",".select2-selection__clear",function(evt){self._handleClear(evt)});container.on("keypress",function(evt){self._handleKeyboardClear(evt,container)})};AllowClear.prototype._handleClear=function(_,evt){if(this.options.get("disabled")){return}var $clear=this.$selection.find(".select2-selection__clear");if($clear.length===0){return}evt.stopPropagation();var data=Utils.GetData($clear[0],"data");var previousVal=this.$element.val();this.$element.val(this.placeholder.id);var unselectData={data:data};this.trigger("clear",unselectData);if(unselectData.prevented){this.$element.val(previousVal);return}for(var d=0;d<data.length;d++){unselectData={data:data[d]};this.trigger("unselect",unselectData);if(unselectData.prevented){this.$element.val(previousVal);return}}this.$element.trigger("change");this.trigger("toggle",{})};AllowClear.prototype._handleKeyboardClear=function(_,evt,container){if(container.isOpen()){return}if(evt.which==KEYS.DELETE||evt.which==KEYS.BACKSPACE){this._handleClear(evt)}};AllowClear.prototype.update=function(decorated,data){decorated.call(this,data);if(this.$selection.find(".select2-selection__placeholder").length>0||data.length===0){return}var $remove=$('<span class="select2-selection__clear">'+"×"+"</span>");Utils.StoreData($remove[0],"data",data);this.$selection.find(".select2-selection__rendered").prepend($remove)};return AllowClear});S2.define("select2/selection/search",["jquery","../utils","../keys"],function($,Utils,KEYS){function Search(decorated,$element,options){decorated.call(this,$element,options)}Search.prototype.render=function(decorated){var $search=$('<li class="select2-search select2-search--inline">'+'<input class="select2-search__field" type="search" tabindex="-1"'+' autocomplete="off" autocorrect="off" autocapitalize="none"'+' spellcheck="false" role="textbox" aria-autocomplete="list" />'+"</li>");this.$searchContainer=$search;this.$search=$search.find("input");var $rendered=decorated.call(this);this._transferTabIndex();return $rendered};Search.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("open",function(){self.$search.trigger("focus")});container.on("close",function(){self.$search.val("");self.$search.removeAttr("aria-activedescendant");self.$search.trigger("focus")});container.on("enable",function(){self.$search.prop("disabled",false);self._transferTabIndex()});container.on("disable",function(){self.$search.prop("disabled",true)});container.on("focus",function(evt){self.$search.trigger("focus")});container.on("results:focus",function(params){self.$search.attr("aria-activedescendant",params.id)});this.$selection.on("focusin",".select2-search--inline",function(evt){self.trigger("focus",evt)});this.$selection.on("focusout",".select2-search--inline",function(evt){self._handleBlur(evt)});this.$selection.on("keydown",".select2-search--inline",function(evt){evt.stopPropagation();self.trigger("keypress",evt);self._keyUpPrevented=evt.isDefaultPrevented();var key=evt.which;if(key===KEYS.BACKSPACE&&self.$search.val()===""){var $previousChoice=self.$searchContainer.prev(".select2-selection__choice");if($previousChoice.length>0){var item=Utils.GetData($previousChoice[0],"data");self.searchRemoveChoice(item);evt.preventDefault()}}});var msie=document.documentMode;var disableInputEvents=msie&&msie<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(evt){if(disableInputEvents){self.$selection.off("input.search input.searchcheck");return}self.$selection.off("keyup.search")});this.$selection.on("keyup.search input.search",".select2-search--inline",function(evt){if(disableInputEvents&&evt.type==="input"){self.$selection.off("input.search input.searchcheck");return}var key=evt.which;if(key==KEYS.SHIFT||key==KEYS.CTRL||key==KEYS.ALT){return}if(key==KEYS.TAB){return}self.handleSearch(evt)})};Search.prototype._transferTabIndex=function(decorated){this.$search.attr("tabindex",this.$selection.attr("tabindex"));this.$selection.attr("tabindex","-1")};Search.prototype.createPlaceholder=function(decorated,placeholder){this.$search.attr("placeholder",placeholder.text)};Search.prototype.update=function(decorated,data){var searchHadFocus=this.$search[0]==document.activeElement;this.$search.attr("placeholder","");decorated.call(this,data);this.$selection.find(".select2-selection__rendered").append(this.$searchContainer);this.resizeSearch();if(searchHadFocus){var isTagInput=this.$element.find("[data-select2-tag]").length;if(isTagInput){this.$element.focus()}else{this.$search.focus()}}};Search.prototype.handleSearch=function(){this.resizeSearch();if(!this._keyUpPrevented){var input=this.$search.val();this.trigger("query",{term:input})}this._keyUpPrevented=false};Search.prototype.searchRemoveChoice=function(decorated,item){this.trigger("unselect",{data:item});this.$search.val(item.text);this.handleSearch()};Search.prototype.resizeSearch=function(){this.$search.css("width","25px");var width="";if(this.$search.attr("placeholder")!==""){width=this.$selection.find(".select2-selection__rendered").innerWidth()}else{var minimumWidth=this.$search.val().length+1;width=minimumWidth*.75+"em"}this.$search.css("width",width)};return Search});S2.define("select2/selection/eventRelay",["jquery"],function($){function EventRelay(){}EventRelay.prototype.bind=function(decorated,container,$container){var self=this;var relayEvents=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"];var preventableEvents=["opening","closing","selecting","unselecting","clearing"];decorated.call(this,container,$container);container.on("*",function(name,params){if($.inArray(name,relayEvents)===-1){return}params=params||{};var evt=$.Event("select2:"+name,{params:params});self.$element.trigger(evt);if($.inArray(name,preventableEvents)===-1){return}params.prevented=evt.isDefaultPrevented()})};return EventRelay});S2.define("select2/translation",["jquery","require"],function($,require){function Translation(dict){this.dict=dict||{}}Translation.prototype.all=function(){return this.dict};Translation.prototype.get=function(key){return this.dict[key]};Translation.prototype.extend=function(translation){this.dict=$.extend({},translation.all(),this.dict)};Translation._cache={};Translation.loadPath=function(path){if(!(path in Translation._cache)){var translations=require(path);Translation._cache[path]=translations}return new Translation(Translation._cache[path])};return Translation});S2.define("select2/diacritics",[],function(){var diacritics={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return diacritics});S2.define("select2/data/base",["../utils"],function(Utils){function BaseAdapter($element,options){BaseAdapter.__super__.constructor.call(this)}Utils.Extend(BaseAdapter,Utils.Observable);BaseAdapter.prototype.current=function(callback){throw new Error("The `current` method must be defined in child classes.")};BaseAdapter.prototype.query=function(params,callback){throw new Error("The `query` method must be defined in child classes.")};BaseAdapter.prototype.bind=function(container,$container){};BaseAdapter.prototype.destroy=function(){};BaseAdapter.prototype.generateResultId=function(container,data){var id=container.id+"-result-";id+=Utils.generateChars(4);if(data.id!=null){id+="-"+data.id.toString()}else{id+="-"+Utils.generateChars(4)}return id};return BaseAdapter});S2.define("select2/data/select",["./base","../utils","jquery"],function(BaseAdapter,Utils,$){function SelectAdapter($element,options){this.$element=$element;this.options=options;SelectAdapter.__super__.constructor.call(this)}Utils.Extend(SelectAdapter,BaseAdapter);SelectAdapter.prototype.current=function(callback){var data=[];var self=this;this.$element.find(":selected").each(function(){var $option=$(this);var option=self.item($option);data.push(option)});callback(data)};SelectAdapter.prototype.select=function(data){var self=this;data.selected=true;if($(data.element).is("option")){data.element.selected=true;this.$element.trigger("change");return}if(this.$element.prop("multiple")){this.current(function(currentData){var val=[];data=[data];data.push.apply(data,currentData);for(var d=0;d<data.length;d++){var id=data[d].id;if($.inArray(id,val)===-1){val.push(id)}}self.$element.val(val);self.$element.trigger("change")})}else{var val=data.id;this.$element.val(val);this.$element.trigger("change")}};SelectAdapter.prototype.unselect=function(data){var self=this;if(!this.$element.prop("multiple")){return}data.selected=false;if($(data.element).is("option")){data.element.selected=false;this.$element.trigger("change");return}this.current(function(currentData){var val=[];for(var d=0;d<currentData.length;d++){var id=currentData[d].id;if(id!==data.id&&$.inArray(id,val)===-1){val.push(id)}}self.$element.val(val);self.$element.trigger("change")})};SelectAdapter.prototype.bind=function(container,$container){var self=this;this.container=container;container.on("select",function(params){self.select(params.data)});container.on("unselect",function(params){self.unselect(params.data)})};SelectAdapter.prototype.destroy=function(){this.$element.find("*").each(function(){Utils.RemoveData(this)})};SelectAdapter.prototype.query=function(params,callback){var data=[];var self=this;var $options=this.$element.children();$options.each(function(){var $option=$(this);if(!$option.is("option")&&!$option.is("optgroup")){return}var option=self.item($option);var matches=self.matches(params,option);if(matches!==null){data.push(matches)}});callback({results:data})};SelectAdapter.prototype.addOptions=function($options){Utils.appendMany(this.$element,$options)};SelectAdapter.prototype.option=function(data){var option;if(data.children){option=document.createElement("optgroup");option.label=data.text}else{option=document.createElement("option");if(option.textContent!==undefined){option.textContent=data.text}else{option.innerText=data.text}}if(data.id!==undefined){option.value=data.id}if(data.disabled){option.disabled=true}if(data.selected){option.selected=true}if(data.title){option.title=data.title}var $option=$(option);var normalizedData=this._normalizeItem(data);normalizedData.element=option;Utils.StoreData(option,"data",normalizedData);return $option};SelectAdapter.prototype.item=function($option){var data={};data=Utils.GetData($option[0],"data");if(data!=null){return data}if($option.is("option")){data={id:$option.val(),text:$option.text(),disabled:$option.prop("disabled"),selected:$option.prop("selected"),title:$option.prop("title")}}else if($option.is("optgroup")){data={text:$option.prop("label"),children:[],title:$option.prop("title")};var $children=$option.children("option");var children=[];for(var c=0;c<$children.length;c++){var $child=$($children[c]);var child=this.item($child);children.push(child)}data.children=children}data=this._normalizeItem(data);data.element=$option[0];Utils.StoreData($option[0],"data",data);return data};SelectAdapter.prototype._normalizeItem=function(item){if(item!==Object(item)){item={id:item,text:item}}item=$.extend({},{text:""},item);var defaults={selected:false,disabled:false};if(item.id!=null){item.id=item.id.toString()}if(item.text!=null){item.text=item.text.toString()}if(item._resultId==null&&item.id&&this.container!=null){item._resultId=this.generateResultId(this.container,item)}return $.extend({},defaults,item)};SelectAdapter.prototype.matches=function(params,data){var matcher=this.options.get("matcher");return matcher(params,data)};return SelectAdapter});S2.define("select2/data/array",["./select","../utils","jquery"],function(SelectAdapter,Utils,$){function ArrayAdapter($element,options){var data=options.get("data")||[];ArrayAdapter.__super__.constructor.call(this,$element,options);this.addOptions(this.convertToOptions(data))}Utils.Extend(ArrayAdapter,SelectAdapter);ArrayAdapter.prototype.select=function(data){var $option=this.$element.find("option").filter(function(i,elm){return elm.value==data.id.toString()});if($option.length===0){$option=this.option(data);this.addOptions($option)}ArrayAdapter.__super__.select.call(this,data)};ArrayAdapter.prototype.convertToOptions=function(data){var self=this;var $existing=this.$element.find("option");var existingIds=$existing.map(function(){return self.item($(this)).id}).get();var $options=[];function onlyItem(item){return function(){return $(this).val()==item.id}}for(var d=0;d<data.length;d++){var item=this._normalizeItem(data[d]);if($.inArray(item.id,existingIds)>=0){var $existingOption=$existing.filter(onlyItem(item));var existingData=this.item($existingOption);var newData=$.extend(true,{},item,existingData);var $newOption=this.option(newData);$existingOption.replaceWith($newOption);continue}var $option=this.option(item);if(item.children){var $children=this.convertToOptions(item.children);Utils.appendMany($option,$children)}$options.push($option)}return $options};return ArrayAdapter});S2.define("select2/data/ajax",["./array","../utils","jquery"],function(ArrayAdapter,Utils,$){function AjaxAdapter($element,options){this.ajaxOptions=this._applyDefaults(options.get("ajax"));if(this.ajaxOptions.processResults!=null){this.processResults=this.ajaxOptions.processResults}AjaxAdapter.__super__.constructor.call(this,$element,options)}Utils.Extend(AjaxAdapter,ArrayAdapter);AjaxAdapter.prototype._applyDefaults=function(options){var defaults={data:function(params){return $.extend({},params,{q:params.term})},transport:function(params,success,failure){var $request=$.ajax(params);$request.then(success);$request.fail(failure);return $request}};return $.extend({},defaults,options,true)};AjaxAdapter.prototype.processResults=function(results){return results};AjaxAdapter.prototype.query=function(params,callback){var matches=[];var self=this;if(this._request!=null){if($.isFunction(this._request.abort)){this._request.abort()}this._request=null}var options=$.extend({type:"GET"},this.ajaxOptions);if(typeof options.url==="function"){options.url=options.url.call(this.$element,params)}if(typeof options.data==="function"){options.data=options.data.call(this.$element,params)}function request(){var $request=options.transport(options,function(data){var results=self.processResults(data,params);if(self.options.get("debug")&&window.console&&console.error){if(!results||!results.results||!$.isArray(results.results)){console.error("Select2: The AJAX results did not return an array in the "+"`results` key of the response.")}}callback(results)},function(){if("status"in $request&&($request.status===0||$request.status==="0")){return}self.trigger("results:message",{message:"errorLoading"})});self._request=$request}if(this.ajaxOptions.delay&¶ms.term!=null){if(this._queryTimeout){window.clearTimeout(this._queryTimeout)}this._queryTimeout=window.setTimeout(request,this.ajaxOptions.delay)}else{request()}};return AjaxAdapter});S2.define("select2/data/tags",["jquery"],function($){function Tags(decorated,$element,options){var tags=options.get("tags");var createTag=options.get("createTag");if(createTag!==undefined){this.createTag=createTag}var insertTag=options.get("insertTag");if(insertTag!==undefined){this.insertTag=insertTag}decorated.call(this,$element,options);if($.isArray(tags)){for(var t=0;t<tags.length;t++){var tag=tags[t];var item=this._normalizeItem(tag);var $option=this.option(item);this.$element.append($option)}}}Tags.prototype.query=function(decorated,params,callback){var self=this;this._removeOldTags();if(params.term==null||params.page!=null){decorated.call(this,params,callback);return}function wrapper(obj,child){var data=obj.results;for(var i=0;i<data.length;i++){var option=data[i];var checkChildren=option.children!=null&&!wrapper({results:option.children},true);var optionText=(option.text||"").toUpperCase();var paramsTerm=(params.term||"").toUpperCase();var checkText=optionText===paramsTerm;if(checkText||checkChildren){if(child){return false}obj.data=data;callback(obj);return}}if(child){return true}var tag=self.createTag(params);if(tag!=null){var $option=self.option(tag);$option.attr("data-select2-tag",true);self.addOptions([$option]);self.insertTag(data,tag)}obj.results=data;callback(obj)}decorated.call(this,params,wrapper)};Tags.prototype.createTag=function(decorated,params){var term=$.trim(params.term);if(term===""){return null}return{id:term,text:term}};Tags.prototype.insertTag=function(_,data,tag){data.unshift(tag)};Tags.prototype._removeOldTags=function(_){var tag=this._lastTag;var $options=this.$element.find("option[data-select2-tag]");$options.each(function(){if(this.selected){return}$(this).remove()})};return Tags});S2.define("select2/data/tokenizer",["jquery"],function($){function Tokenizer(decorated,$element,options){var tokenizer=options.get("tokenizer");if(tokenizer!==undefined){this.tokenizer=tokenizer}decorated.call(this,$element,options)}Tokenizer.prototype.bind=function(decorated,container,$container){decorated.call(this,container,$container);this.$search=container.dropdown.$search||container.selection.$search||$container.find(".select2-search__field")};Tokenizer.prototype.query=function(decorated,params,callback){var self=this;function createAndSelect(data){var item=self._normalizeItem(data);var $existingOptions=self.$element.find("option").filter(function(){return $(this).val()===item.id});if(!$existingOptions.length){var $option=self.option(item);$option.attr("data-select2-tag",true);self._removeOldTags();self.addOptions([$option])}select(item)}function select(data){self.trigger("select",{data:data})}params.term=params.term||"";var tokenData=this.tokenizer(params,this.options,createAndSelect);if(tokenData.term!==params.term){if(this.$search.length){this.$search.val(tokenData.term);this.$search.focus()}params.term=tokenData.term}decorated.call(this,params,callback)};Tokenizer.prototype.tokenizer=function(_,params,options,callback){var separators=options.get("tokenSeparators")||[];var term=params.term;var i=0;var createTag=this.createTag||function(params){return{id:params.term,text:params.term}};while(i<term.length){var termChar=term[i];if($.inArray(termChar,separators)===-1){i++;continue}var part=term.substr(0,i);var partParams=$.extend({},params,{term:part});var data=createTag(partParams);if(data==null){i++;continue}callback(data);term=term.substr(i+1)||"";i=0}return{term:term}};return Tokenizer});S2.define("select2/data/minimumInputLength",[],function(){function MinimumInputLength(decorated,$e,options){this.minimumInputLength=options.get("minimumInputLength");decorated.call(this,$e,options)}MinimumInputLength.prototype.query=function(decorated,params,callback){params.term=params.term||"";if(params.term.length<this.minimumInputLength){this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:params.term,params:params}});return}decorated.call(this,params,callback)};return MinimumInputLength});S2.define("select2/data/maximumInputLength",[],function(){function MaximumInputLength(decorated,$e,options){this.maximumInputLength=options.get("maximumInputLength");decorated.call(this,$e,options)}MaximumInputLength.prototype.query=function(decorated,params,callback){params.term=params.term||"";if(this.maximumInputLength>0&¶ms.term.length>this.maximumInputLength){this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:params.term,params:params}});return}decorated.call(this,params,callback)};return MaximumInputLength});S2.define("select2/data/maximumSelectionLength",[],function(){function MaximumSelectionLength(decorated,$e,options){this.maximumSelectionLength=options.get("maximumSelectionLength");decorated.call(this,$e,options)}MaximumSelectionLength.prototype.query=function(decorated,params,callback){var self=this;this.current(function(currentData){var count=currentData!=null?currentData.length:0;if(self.maximumSelectionLength>0&&count>=self.maximumSelectionLength){self.trigger("results:message",{message:"maximumSelected",args:{maximum:self.maximumSelectionLength}});return}decorated.call(self,params,callback)})};return MaximumSelectionLength});S2.define("select2/dropdown",["jquery","./utils"],function($,Utils){function Dropdown($element,options){this.$element=$element;this.options=options;Dropdown.__super__.constructor.call(this)}Utils.Extend(Dropdown,Utils.Observable);Dropdown.prototype.render=function(){var $dropdown=$('<span class="select2-dropdown">'+'<span class="select2-results"></span>'+"</span>");$dropdown.attr("dir",this.options.get("dir"));this.$dropdown=$dropdown;return $dropdown};Dropdown.prototype.bind=function(){};Dropdown.prototype.position=function($dropdown,$container){};Dropdown.prototype.destroy=function(){this.$dropdown.remove()};return Dropdown});S2.define("select2/dropdown/search",["jquery","../utils"],function($,Utils){function Search(){}Search.prototype.render=function(decorated){var $rendered=decorated.call(this);var $search=$('<span class="select2-search select2-search--dropdown">'+'<input class="select2-search__field" type="search" tabindex="-1"'+' autocomplete="off" autocorrect="off" autocapitalize="none"'+' spellcheck="false" role="textbox" />'+"</span>");this.$searchContainer=$search;this.$search=$search.find("input");$rendered.prepend($search);return $rendered};Search.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);this.$search.on("keydown",function(evt){self.trigger("keypress",evt);self._keyUpPrevented=evt.isDefaultPrevented()});this.$search.on("input",function(evt){$(this).off("keyup")});this.$search.on("keyup input",function(evt){self.handleSearch(evt)});container.on("open",function(){self.$search.attr("tabindex",0);self.$search.focus();window.setTimeout(function(){self.$search.focus()},0)});container.on("close",function(){self.$search.attr("tabindex",-1);self.$search.val("");self.$search.blur()});container.on("focus",function(){if(!container.isOpen()){self.$search.focus()}});container.on("results:all",function(params){if(params.query.term==null||params.query.term===""){var showSearch=self.showSearch(params);if(showSearch){self.$searchContainer.removeClass("select2-search--hide")}else{self.$searchContainer.addClass("select2-search--hide")}}})};Search.prototype.handleSearch=function(evt){if(!this._keyUpPrevented){var input=this.$search.val();this.trigger("query",{term:input})}this._keyUpPrevented=false};Search.prototype.showSearch=function(_,params){return true};return Search});S2.define("select2/dropdown/hidePlaceholder",[],function(){function HidePlaceholder(decorated,$element,options,dataAdapter){this.placeholder=this.normalizePlaceholder(options.get("placeholder"));decorated.call(this,$element,options,dataAdapter)}HidePlaceholder.prototype.append=function(decorated,data){data.results=this.removePlaceholder(data.results);decorated.call(this,data)};HidePlaceholder.prototype.normalizePlaceholder=function(_,placeholder){if(typeof placeholder==="string"){placeholder={id:"",text:placeholder}}return placeholder};HidePlaceholder.prototype.removePlaceholder=function(_,data){var modifiedData=data.slice(0);for(var d=data.length-1;d>=0;d--){var item=data[d];if(this.placeholder.id===item.id){modifiedData.splice(d,1)}}return modifiedData};return HidePlaceholder});S2.define("select2/dropdown/infiniteScroll",["jquery"],function($){function InfiniteScroll(decorated,$element,options,dataAdapter){this.lastParams={};decorated.call(this,$element,options,dataAdapter);this.$loadingMore=this.createLoadingMore();this.loading=false}InfiniteScroll.prototype.append=function(decorated,data){this.$loadingMore.remove();this.loading=false;decorated.call(this,data);if(this.showLoadingMore(data)){this.$results.append(this.$loadingMore)}};InfiniteScroll.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("query",function(params){self.lastParams=params;self.loading=true});container.on("query:append",function(params){self.lastParams=params;self.loading=true});this.$results.on("scroll",function(){var isLoadMoreVisible=$.contains(document.documentElement,self.$loadingMore[0]);if(self.loading||!isLoadMoreVisible){return}var currentOffset=self.$results.offset().top+self.$results.outerHeight(false);var loadingMoreOffset=self.$loadingMore.offset().top+self.$loadingMore.outerHeight(false);if(currentOffset+50>=loadingMoreOffset){self.loadMore()}})};InfiniteScroll.prototype.loadMore=function(){this.loading=true;var params=$.extend({},{page:1},this.lastParams);params.page++;this.trigger("query:append",params)};InfiniteScroll.prototype.showLoadingMore=function(_,data){return data.pagination&&data.pagination.more};InfiniteScroll.prototype.createLoadingMore=function(){var $option=$("<li "+'class="select2-results__option select2-results__option--load-more"'+'role="treeitem" aria-disabled="true"></li>');var message=this.options.get("translations").get("loadingMore");$option.html(message(this.lastParams));return $option};return InfiniteScroll});S2.define("select2/dropdown/attachBody",["jquery","../utils"],function($,Utils){function AttachBody(decorated,$element,options){this.$dropdownParent=options.get("dropdownParent")||$(document.body);decorated.call(this,$element,options)}AttachBody.prototype.bind=function(decorated,container,$container){var self=this;var setupResultsEvents=false;decorated.call(this,container,$container);container.on("open",function(){self._showDropdown();self._attachPositioningHandler(container);if(!setupResultsEvents){setupResultsEvents=true;container.on("results:all",function(){self._positionDropdown();self._resizeDropdown()});container.on("results:append",function(){self._positionDropdown();self._resizeDropdown()})}});container.on("close",function(){self._hideDropdown();self._detachPositioningHandler(container)});this.$dropdownContainer.on("mousedown",function(evt){evt.stopPropagation()})};AttachBody.prototype.destroy=function(decorated){decorated.call(this);this.$dropdownContainer.remove()};AttachBody.prototype.position=function(decorated,$dropdown,$container){$dropdown.attr("class",$container.attr("class"));$dropdown.removeClass("select2");$dropdown.addClass("select2-container--open");$dropdown.css({position:"absolute",top:-999999});this.$container=$container};AttachBody.prototype.render=function(decorated){var $container=$("<span></span>");var $dropdown=decorated.call(this);$container.append($dropdown);this.$dropdownContainer=$container;return $container};AttachBody.prototype._hideDropdown=function(decorated){this.$dropdownContainer.detach()};AttachBody.prototype._attachPositioningHandler=function(decorated,container){var self=this;var scrollEvent="scroll.select2."+container.id;var resizeEvent="resize.select2."+container.id;var orientationEvent="orientationchange.select2."+container.id;var $watchers=this.$container.parents().filter(Utils.hasScroll);$watchers.each(function(){Utils.StoreData(this,"select2-scroll-position",{x:$(this).scrollLeft(),y:$(this).scrollTop()})});$watchers.on(scrollEvent,function(ev){var position=Utils.GetData(this,"select2-scroll-position");$(this).scrollTop(position.y)});$(window).on(scrollEvent+" "+resizeEvent+" "+orientationEvent,function(e){self._positionDropdown();self._resizeDropdown()})};AttachBody.prototype._detachPositioningHandler=function(decorated,container){var scrollEvent="scroll.select2."+container.id;var resizeEvent="resize.select2."+container.id;var orientationEvent="orientationchange.select2."+container.id;var $watchers=this.$container.parents().filter(Utils.hasScroll);$watchers.off(scrollEvent);$(window).off(scrollEvent+" "+resizeEvent+" "+orientationEvent)};AttachBody.prototype._positionDropdown=function(){var $window=$(window);var isCurrentlyAbove=this.$dropdown.hasClass("select2-dropdown--above");var isCurrentlyBelow=this.$dropdown.hasClass("select2-dropdown--below");var newDirection=null;var offset=this.$container.offset();offset.bottom=offset.top+this.$container.outerHeight(false);var container={height:this.$container.outerHeight(false)};container.top=offset.top;container.bottom=offset.top+container.height;var dropdown={height:this.$dropdown.outerHeight(false)};var viewport={top:$window.scrollTop(),bottom:$window.scrollTop()+$window.height()};var enoughRoomAbove=viewport.top<offset.top-dropdown.height;var enoughRoomBelow=viewport.bottom>offset.bottom+dropdown.height;var css={left:offset.left,top:container.bottom};var $offsetParent=this.$dropdownParent;if($offsetParent.css("position")==="static"){$offsetParent=$offsetParent.offsetParent()}var parentOffset=$offsetParent.offset();css.top-=parentOffset.top;css.left-=parentOffset.left;if(!isCurrentlyAbove&&!isCurrentlyBelow){newDirection="below"}if(!enoughRoomBelow&&enoughRoomAbove&&!isCurrentlyAbove){newDirection="above"}else if(!enoughRoomAbove&&enoughRoomBelow&&isCurrentlyAbove){newDirection="below"}if(newDirection=="above"||isCurrentlyAbove&&newDirection!=="below"){css.top=container.top-parentOffset.top-dropdown.height}if(newDirection!=null){this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+newDirection);this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+newDirection)}this.$dropdownContainer.css(css)};AttachBody.prototype._resizeDropdown=function(){var css={width:this.$container.outerWidth(false)+"px"};if(this.options.get("dropdownAutoWidth")){css.minWidth=css.width;css.position="relative";css.width="auto"}this.$dropdown.css(css)};AttachBody.prototype._showDropdown=function(decorated){this.$dropdownContainer.appendTo(this.$dropdownParent);this._positionDropdown();this._resizeDropdown()};return AttachBody});S2.define("select2/dropdown/minimumResultsForSearch",[],function(){function countResults(data){var count=0;for(var d=0;d<data.length;d++){var item=data[d];if(item.children){count+=countResults(item.children)}else{count++}}return count}function MinimumResultsForSearch(decorated,$element,options,dataAdapter){this.minimumResultsForSearch=options.get("minimumResultsForSearch");if(this.minimumResultsForSearch<0){this.minimumResultsForSearch=Infinity}decorated.call(this,$element,options,dataAdapter)}MinimumResultsForSearch.prototype.showSearch=function(decorated,params){if(countResults(params.data.results)<this.minimumResultsForSearch){return false}return decorated.call(this,params)};return MinimumResultsForSearch});S2.define("select2/dropdown/selectOnClose",["../utils"],function(Utils){function SelectOnClose(){}SelectOnClose.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("close",function(params){self._handleSelectOnClose(params)})};SelectOnClose.prototype._handleSelectOnClose=function(_,params){if(params&¶ms.originalSelect2Event!=null){var event=params.originalSelect2Event;if(event._type==="select"||event._type==="unselect"){return}}var $highlightedResults=this.getHighlightedResults();if($highlightedResults.length<1){return}var data=Utils.GetData($highlightedResults[0],"data");if(data.element!=null&&data.element.selected||data.element==null&&data.selected){return}this.trigger("select",{data:data})};return SelectOnClose});S2.define("select2/dropdown/closeOnSelect",[],function(){function CloseOnSelect(){}CloseOnSelect.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("select",function(evt){self._selectTriggered(evt)});container.on("unselect",function(evt){self._selectTriggered(evt)})};CloseOnSelect.prototype._selectTriggered=function(_,evt){var originalEvent=evt.originalEvent;if(originalEvent&&originalEvent.ctrlKey){return}this.trigger("close",{originalEvent:originalEvent,originalSelect2Event:evt})};return CloseOnSelect});S2.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(args){var overChars=args.input.length-args.maximum;var message="Please delete "+overChars+" character";if(overChars!=1){message+="s"}return message},inputTooShort:function(args){var remainingChars=args.minimum-args.input.length;var message="Please enter "+remainingChars+" or more characters";return message},loadingMore:function(){return"Loading more results…"},maximumSelected:function(args){var message="You can only select "+args.maximum+" item";if(args.maximum!=1){message+="s"}return message},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}});S2.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function($,require,ResultsList,SingleSelection,MultipleSelection,Placeholder,AllowClear,SelectionSearch,EventRelay,Utils,Translation,DIACRITICS,SelectData,ArrayData,AjaxData,Tags,Tokenizer,MinimumInputLength,MaximumInputLength,MaximumSelectionLength,Dropdown,DropdownSearch,HidePlaceholder,InfiniteScroll,AttachBody,MinimumResultsForSearch,SelectOnClose,CloseOnSelect,EnglishTranslation){function Defaults(){this.reset()}Defaults.prototype.apply=function(options){options=$.extend(true,{},this.defaults,options);if(options.dataAdapter==null){if(options.ajax!=null){options.dataAdapter=AjaxData}else if(options.data!=null){options.dataAdapter=ArrayData}else{options.dataAdapter=SelectData}if(options.minimumInputLength>0){options.dataAdapter=Utils.Decorate(options.dataAdapter,MinimumInputLength)}if(options.maximumInputLength>0){options.dataAdapter=Utils.Decorate(options.dataAdapter,MaximumInputLength)}if(options.maximumSelectionLength>0){options.dataAdapter=Utils.Decorate(options.dataAdapter,MaximumSelectionLength)}if(options.tags){options.dataAdapter=Utils.Decorate(options.dataAdapter,Tags)}if(options.tokenSeparators!=null||options.tokenizer!=null){options.dataAdapter=Utils.Decorate(options.dataAdapter,Tokenizer)}if(options.query!=null){var Query=require(options.amdBase+"compat/query");options.dataAdapter=Utils.Decorate(options.dataAdapter,Query)}if(options.initSelection!=null){var InitSelection=require(options.amdBase+"compat/initSelection");options.dataAdapter=Utils.Decorate(options.dataAdapter,InitSelection)}}if(options.resultsAdapter==null){options.resultsAdapter=ResultsList;if(options.ajax!=null){options.resultsAdapter=Utils.Decorate(options.resultsAdapter,InfiniteScroll)}if(options.placeholder!=null){options.resultsAdapter=Utils.Decorate(options.resultsAdapter,HidePlaceholder)}if(options.selectOnClose){options.resultsAdapter=Utils.Decorate(options.resultsAdapter,SelectOnClose)}}if(options.dropdownAdapter==null){if(options.multiple){options.dropdownAdapter=Dropdown}else{var SearchableDropdown=Utils.Decorate(Dropdown,DropdownSearch);options.dropdownAdapter=SearchableDropdown}if(options.minimumResultsForSearch!==0){options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,MinimumResultsForSearch)}if(options.closeOnSelect){options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,CloseOnSelect)}if(options.dropdownCssClass!=null||options.dropdownCss!=null||options.adaptDropdownCssClass!=null){var DropdownCSS=require(options.amdBase+"compat/dropdownCss");options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,DropdownCSS)}options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,AttachBody)}if(options.selectionAdapter==null){if(options.multiple){options.selectionAdapter=MultipleSelection}else{options.selectionAdapter=SingleSelection}if(options.placeholder!=null){options.selectionAdapter=Utils.Decorate(options.selectionAdapter,Placeholder)}if(options.allowClear){options.selectionAdapter=Utils.Decorate(options.selectionAdapter,AllowClear)}if(options.multiple){options.selectionAdapter=Utils.Decorate(options.selectionAdapter,SelectionSearch)}if(options.containerCssClass!=null||options.containerCss!=null||options.adaptContainerCssClass!=null){var ContainerCSS=require(options.amdBase+"compat/containerCss");options.selectionAdapter=Utils.Decorate(options.selectionAdapter,ContainerCSS)}options.selectionAdapter=Utils.Decorate(options.selectionAdapter,EventRelay)}if(typeof options.language==="string"){if(options.language.indexOf("-")>0){var languageParts=options.language.split("-");var baseLanguage=languageParts[0];options.language=[options.language,baseLanguage]}else{options.language=[options.language]}}if($.isArray(options.language)){var languages=new Translation;options.language.push("en");var languageNames=options.language;for(var l=0;l<languageNames.length;l++){var name=languageNames[l];var language={};try{language=Translation.loadPath(name)}catch(e){try{name=this.defaults.amdLanguageBase+name;language=Translation.loadPath(name)}catch(ex){if(options.debug&&window.console&&console.warn){console.warn('Select2: The language file for "'+name+'" could not be '+"automatically loaded. A fallback will be used instead.")}continue}}languages.extend(language)}options.translations=languages}else{var baseTranslation=Translation.loadPath(this.defaults.amdLanguageBase+"en");var customTranslation=new Translation(options.language);customTranslation.extend(baseTranslation);options.translations=customTranslation}return options};Defaults.prototype.reset=function(){function stripDiacritics(text){function match(a){return DIACRITICS[a]||a}return text.replace(/[^\u0000-\u007E]/g,match)}function matcher(params,data){if($.trim(params.term)===""){return data}if(data.children&&data.children.length>0){var match=$.extend(true,{},data);for(var c=data.children.length-1;c>=0;c--){var child=data.children[c];var matches=matcher(params,child);if(matches==null){match.children.splice(c,1)}}if(match.children.length>0){return match}return matcher(params,match)}var original=stripDiacritics(data.text).toUpperCase();var term=stripDiacritics(params.term).toUpperCase();if(original.indexOf(term)>-1){return data}return null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:true,debug:false,dropdownAutoWidth:false,escapeMarkup:Utils.escapeMarkup,language:EnglishTranslation,matcher:matcher,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:false,sorter:function(data){return data},templateResult:function(result){return result.text},templateSelection:function(selection){return selection.text},theme:"default",width:"resolve"}};Defaults.prototype.set=function(key,value){var camelKey=$.camelCase(key);var data={};data[camelKey]=value;var convertedData=Utils._convertData(data);$.extend(true,this.defaults,convertedData)};var defaults=new Defaults;return defaults});S2.define("select2/options",["require","jquery","./defaults","./utils"],function(require,$,Defaults,Utils){function Options(options,$element){this.options=options;if($element!=null){this.fromElement($element)}this.options=Defaults.apply(this.options);if($element&&$element.is("input")){var InputCompat=require(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=Utils.Decorate(this.options.dataAdapter,InputCompat)}}Options.prototype.fromElement=function($e){var excludedData=["select2"];if(this.options.multiple==null){this.options.multiple=$e.prop("multiple")}if(this.options.disabled==null){this.options.disabled=$e.prop("disabled")}if(this.options.language==null){if($e.prop("lang")){this.options.language=$e.prop("lang").toLowerCase()}else if($e.closest("[lang]").prop("lang")){this.options.language=$e.closest("[lang]").prop("lang")}}if(this.options.dir==null){if($e.prop("dir")){this.options.dir=$e.prop("dir")}else if($e.closest("[dir]").prop("dir")){this.options.dir=$e.closest("[dir]").prop("dir")}else{this.options.dir="ltr"}}$e.prop("disabled",this.options.disabled);$e.prop("multiple",this.options.multiple);if(Utils.GetData($e[0],"select2Tags")){if(this.options.debug&&window.console&&console.warn){console.warn("Select2: The `data-select2-tags` attribute has been changed to "+'use the `data-data` and `data-tags="true"` attributes and will be '+"removed in future versions of Select2.")}Utils.StoreData($e[0],"data",Utils.GetData($e[0],"select2Tags"));Utils.StoreData($e[0],"tags",true)}if(Utils.GetData($e[0],"ajaxUrl")){if(this.options.debug&&window.console&&console.warn){console.warn("Select2: The `data-ajax-url` attribute has been changed to "+"`data-ajax--url` and support for the old attribute will be removed"+" in future versions of Select2.")}$e.attr("ajax--url",Utils.GetData($e[0],"ajaxUrl"));Utils.StoreData($e[0],"ajax-Url",Utils.GetData($e[0],"ajaxUrl"))}var dataset={};if($.fn.jquery&&$.fn.jquery.substr(0,2)=="1."&&$e[0].dataset){dataset=$.extend(true,{},$e[0].dataset,Utils.GetData($e[0]))}else{dataset=Utils.GetData($e[0])}var data=$.extend(true,{},dataset);data=Utils._convertData(data);for(var key in data){if($.inArray(key,excludedData)>-1){continue}if($.isPlainObject(this.options[key])){$.extend(this.options[key],data[key])}else{this.options[key]=data[key]}}return this};Options.prototype.get=function(key){return this.options[key]};Options.prototype.set=function(key,val){this.options[key]=val};return Options});S2.define("select2/core",["jquery","./options","./utils","./keys"],function($,Options,Utils,KEYS){var Select2=function($element,options){if(Utils.GetData($element[0],"select2")!=null){Utils.GetData($element[0],"select2").destroy()}this.$element=$element;this.id=this._generateId($element);options=options||{};this.options=new Options(options,$element);Select2.__super__.constructor.call(this);var tabindex=$element.attr("tabindex")||0;Utils.StoreData($element[0],"old-tabindex",tabindex);$element.attr("tabindex","-1");var DataAdapter=this.options.get("dataAdapter");this.dataAdapter=new DataAdapter($element,this.options);var $container=this.render();this._placeContainer($container);var SelectionAdapter=this.options.get("selectionAdapter");this.selection=new SelectionAdapter($element,this.options);this.$selection=this.selection.render();this.selection.position(this.$selection,$container);var DropdownAdapter=this.options.get("dropdownAdapter");this.dropdown=new DropdownAdapter($element,this.options);this.$dropdown=this.dropdown.render();this.dropdown.position(this.$dropdown,$container);var ResultsAdapter=this.options.get("resultsAdapter");this.results=new ResultsAdapter($element,this.options,this.dataAdapter);this.$results=this.results.render();this.results.position(this.$results,this.$dropdown);var self=this;this._bindAdapters();this._registerDomEvents();this._registerDataEvents();this._registerSelectionEvents();this._registerDropdownEvents();this._registerResultsEvents();this._registerEvents();this.dataAdapter.current(function(initialData){self.trigger("selection:update",{data:initialData})});$element.addClass("select2-hidden-accessible");$element.attr("aria-hidden","true");this._syncAttributes();Utils.StoreData($element[0],"select2",this);$element.data("select2",this)};Utils.Extend(Select2,Utils.Observable);Select2.prototype._generateId=function($element){var id="";if($element.attr("id")!=null){id=$element.attr("id")}else if($element.attr("name")!=null){id=$element.attr("name")+"-"+Utils.generateChars(2)}else{id=Utils.generateChars(4)}id=id.replace(/(:|\.|\[|\]|,)/g,"");id="select2-"+id;return id};Select2.prototype._placeContainer=function($container){$container.insertAfter(this.$element);var width=this._resolveWidth(this.$element,this.options.get("width"));if(width!=null){$container.css("width",width)}};Select2.prototype._resolveWidth=function($element,method){var WIDTH=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if(method=="resolve"){var styleWidth=this._resolveWidth($element,"style");if(styleWidth!=null){return styleWidth}return this._resolveWidth($element,"element")}if(method=="element"){var elementWidth=$element.outerWidth(false);if(elementWidth<=0){return"auto"}return elementWidth+"px"}if(method=="style"){var style=$element.attr("style");if(typeof style!=="string"){return null}var attrs=style.split(";");for(var i=0,l=attrs.length;i<l;i=i+1){var attr=attrs[i].replace(/\s/g,"");var matches=attr.match(WIDTH);if(matches!==null&&matches.length>=1){return matches[1]}}return null}return method};Select2.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container);this.selection.bind(this,this.$container);this.dropdown.bind(this,this.$container);this.results.bind(this,this.$container)};Select2.prototype._registerDomEvents=function(){var self=this;this.$element.on("change.select2",function(){self.dataAdapter.current(function(data){self.trigger("selection:update",{data:data})})});this.$element.on("focus.select2",function(evt){self.trigger("focus",evt)});this._syncA=Utils.bind(this._syncAttributes,this);this._syncS=Utils.bind(this._syncSubtree,this);if(this.$element[0].attachEvent){this.$element[0].attachEvent("onpropertychange",this._syncA)}var observer=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;if(observer!=null){this._observer=new observer(function(mutations){$.each(mutations,self._syncA);$.each(mutations,self._syncS)});this._observer.observe(this.$element[0],{attributes:true,childList:true,subtree:false})}else if(this.$element[0].addEventListener){this.$element[0].addEventListener("DOMAttrModified",self._syncA,false);this.$element[0].addEventListener("DOMNodeInserted",self._syncS,false);this.$element[0].addEventListener("DOMNodeRemoved",self._syncS,false)}};Select2.prototype._registerDataEvents=function(){var self=this;this.dataAdapter.on("*",function(name,params){self.trigger(name,params)})};Select2.prototype._registerSelectionEvents=function(){var self=this;var nonRelayEvents=["toggle","focus"];this.selection.on("toggle",function(){self.toggleDropdown()});this.selection.on("focus",function(params){self.focus(params)});this.selection.on("*",function(name,params){if($.inArray(name,nonRelayEvents)!==-1){return}self.trigger(name,params)})};Select2.prototype._registerDropdownEvents=function(){var self=this;this.dropdown.on("*",function(name,params){self.trigger(name,params)})};Select2.prototype._registerResultsEvents=function(){var self=this;this.results.on("*",function(name,params){self.trigger(name,params)})};Select2.prototype._registerEvents=function(){var self=this;this.on("open",function(){self.$container.addClass("select2-container--open")});this.on("close",function(){self.$container.removeClass("select2-container--open")});this.on("enable",function(){self.$container.removeClass("select2-container--disabled")});this.on("disable",function(){self.$container.addClass("select2-container--disabled")});this.on("blur",function(){self.$container.removeClass("select2-container--focus")});this.on("query",function(params){if(!self.isOpen()){self.trigger("open",{})}this.dataAdapter.query(params,function(data){self.trigger("results:all",{data:data,query:params})})});this.on("query:append",function(params){this.dataAdapter.query(params,function(data){self.trigger("results:append",{data:data,query:params})})});this.on("keypress",function(evt){var key=evt.which;if(self.isOpen()){if(key===KEYS.ESC||key===KEYS.TAB||key===KEYS.UP&&evt.altKey){self.close();evt.preventDefault()}else if(key===KEYS.ENTER){self.trigger("results:select",{});evt.preventDefault()}else if(key===KEYS.SPACE&&evt.ctrlKey){self.trigger("results:toggle",{});evt.preventDefault()}else if(key===KEYS.UP){self.trigger("results:previous",{});evt.preventDefault()}else if(key===KEYS.DOWN){self.trigger("results:next",{});evt.preventDefault()}}else{if(key===KEYS.ENTER||key===KEYS.SPACE||key===KEYS.DOWN&&evt.altKey){self.open();evt.preventDefault()}}})};Select2.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled"));if(this.options.get("disabled")){if(this.isOpen()){this.close()}this.trigger("disable",{})}else{this.trigger("enable",{})}};Select2.prototype._syncSubtree=function(evt,mutations){var changed=false;var self=this;if(evt&&evt.target&&(evt.target.nodeName!=="OPTION"&&evt.target.nodeName!=="OPTGROUP")){return}if(!mutations){changed=true}else if(mutations.addedNodes&&mutations.addedNodes.length>0){for(var n=0;n<mutations.addedNodes.length;n++){var node=mutations.addedNodes[n];if(node.selected){changed=true}}}else if(mutations.removedNodes&&mutations.removedNodes.length>0){changed=true}if(changed){this.dataAdapter.current(function(currentData){self.trigger("selection:update",{data:currentData})})}};Select2.prototype.trigger=function(name,args){var actualTrigger=Select2.__super__.trigger;var preTriggerMap={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(args===undefined){args={}}if(name in preTriggerMap){var preTriggerName=preTriggerMap[name];var preTriggerArgs={prevented:false,name:name,args:args};actualTrigger.call(this,preTriggerName,preTriggerArgs);if(preTriggerArgs.prevented){args.prevented=true;return}}actualTrigger.call(this,name,args)};Select2.prototype.toggleDropdown=function(){if(this.options.get("disabled")){return}if(this.isOpen()){this.close()}else{this.open()}};Select2.prototype.open=function(){if(this.isOpen()){return}this.trigger("query",{})};Select2.prototype.close=function(){if(!this.isOpen()){return}this.trigger("close",{})};Select2.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")};Select2.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")};Select2.prototype.focus=function(data){if(this.hasFocus()){return}this.$container.addClass("select2-container--focus");this.trigger("focus",{})};Select2.prototype.enable=function(args){if(this.options.get("debug")&&window.console&&console.warn){console.warn('Select2: The `select2("enable")` method has been deprecated and will'+' be removed in later Select2 versions. Use $element.prop("disabled")'+" instead.")}if(args==null||args.length===0){args=[true]}var disabled=!args[0];this.$element.prop("disabled",disabled)};Select2.prototype.data=function(){if(this.options.get("debug")&&arguments.length>0&&window.console&&console.warn){console.warn('Select2: Data can no longer be set using `select2("data")`. You '+"should consider setting the value instead using `$element.val()`.")}var data=[];this.dataAdapter.current(function(currentData){data=currentData});return data};Select2.prototype.val=function(args){if(this.options.get("debug")&&window.console&&console.warn){console.warn('Select2: The `select2("val")` method has been deprecated and will be'+" removed in later Select2 versions. Use $element.val() instead.")}if(args==null||args.length===0){return this.$element.val()}var newVal=args[0];if($.isArray(newVal)){newVal=$.map(newVal,function(obj){return obj.toString()})}this.$element.val(newVal).trigger("change")};Select2.prototype.destroy=function(){this.$container.remove();if(this.$element[0].detachEvent){this.$element[0].detachEvent("onpropertychange",this._syncA)}if(this._observer!=null){this._observer.disconnect();this._observer=null}else if(this.$element[0].removeEventListener){this.$element[0].removeEventListener("DOMAttrModified",this._syncA,false);this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,false);this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,false)}this._syncA=null;this._syncS=null;this.$element.off(".select2");this.$element.attr("tabindex",Utils.GetData(this.$element[0],"old-tabindex"));this.$element.removeClass("select2-hidden-accessible");this.$element.attr("aria-hidden","false");Utils.RemoveData(this.$element[0]);this.$element.removeData("select2");this.dataAdapter.destroy();this.selection.destroy();this.dropdown.destroy();this.results.destroy();this.dataAdapter=null;this.selection=null;this.dropdown=null;this.results=null};Select2.prototype.render=function(){var $container=$('<span class="select2 select2-container">'+'<span class="selection"></span>'+'<span class="dropdown-wrapper" aria-hidden="true"></span>'+"</span>");$container.attr("dir",this.options.get("dir"));this.$container=$container;this.$container.addClass("select2-container--"+this.options.get("theme"));Utils.StoreData($container[0],"element",this.$element);return $container};return Select2});S2.define("select2/compat/utils",["jquery"],function($){function syncCssClasses($dest,$src,adapter){var classes,replacements=[],adapted;classes=$.trim($dest.attr("class"));if(classes){classes=""+classes;$(classes.split(/\s+/)).each(function(){if(this.indexOf("select2-")===0){replacements.push(this)}})}classes=$.trim($src.attr("class"));if(classes){classes=""+classes;$(classes.split(/\s+/)).each(function(){if(this.indexOf("select2-")!==0){adapted=adapter(this);if(adapted!=null){replacements.push(adapted)}}})}$dest.attr("class",replacements.join(" "))}return{syncCssClasses:syncCssClasses}});S2.define("select2/compat/containerCss",["jquery","./utils"],function($,CompatUtils){function _containerAdapter(clazz){return null}function ContainerCSS(){}ContainerCSS.prototype.render=function(decorated){var $container=decorated.call(this);var containerCssClass=this.options.get("containerCssClass")||"";if($.isFunction(containerCssClass)){containerCssClass=containerCssClass(this.$element)}var containerCssAdapter=this.options.get("adaptContainerCssClass");containerCssAdapter=containerCssAdapter||_containerAdapter;if(containerCssClass.indexOf(":all:")!==-1){containerCssClass=containerCssClass.replace(":all:","");var _cssAdapter=containerCssAdapter;containerCssAdapter=function(clazz){var adapted=_cssAdapter(clazz);if(adapted!=null){return adapted+" "+clazz}return clazz}}var containerCss=this.options.get("containerCss")||{};if($.isFunction(containerCss)){containerCss=containerCss(this.$element)}CompatUtils.syncCssClasses($container,this.$element,containerCssAdapter);$container.css(containerCss);$container.addClass(containerCssClass);return $container};return ContainerCSS});S2.define("select2/compat/dropdownCss",["jquery","./utils"],function($,CompatUtils){function _dropdownAdapter(clazz){return null}function DropdownCSS(){}DropdownCSS.prototype.render=function(decorated){var $dropdown=decorated.call(this);var dropdownCssClass=this.options.get("dropdownCssClass")||"";if($.isFunction(dropdownCssClass)){dropdownCssClass=dropdownCssClass(this.$element)}var dropdownCssAdapter=this.options.get("adaptDropdownCssClass");dropdownCssAdapter=dropdownCssAdapter||_dropdownAdapter;if(dropdownCssClass.indexOf(":all:")!==-1){dropdownCssClass=dropdownCssClass.replace(":all:","");var _cssAdapter=dropdownCssAdapter;dropdownCssAdapter=function(clazz){var adapted=_cssAdapter(clazz);if(adapted!=null){return adapted+" "+clazz}return clazz}}var dropdownCss=this.options.get("dropdownCss")||{};if($.isFunction(dropdownCss)){dropdownCss=dropdownCss(this.$element)}CompatUtils.syncCssClasses($dropdown,this.$element,dropdownCssAdapter);$dropdown.css(dropdownCss);$dropdown.addClass(dropdownCssClass);return $dropdown};return DropdownCSS});S2.define("select2/compat/initSelection",["jquery"],function($){function InitSelection(decorated,$element,options){if(options.get("debug")&&window.console&&console.warn){console.warn("Select2: The `initSelection` option has been deprecated in favor"+" of a custom data adapter that overrides the `current` method. "+"This method is now called multiple times instead of a single "+"time when the instance is initialized. Support will be removed "+"for the `initSelection` option in future versions of Select2")}this.initSelection=options.get("initSelection");this._isInitialized=false;decorated.call(this,$element,options)}InitSelection.prototype.current=function(decorated,callback){var self=this;if(this._isInitialized){decorated.call(this,callback);return}this.initSelection.call(null,this.$element,function(data){self._isInitialized=true;if(!$.isArray(data)){data=[data]}callback(data)})};return InitSelection});S2.define("select2/compat/inputData",["jquery","../utils"],function($,Utils){function InputData(decorated,$element,options){this._currentData=[];this._valueSeparator=options.get("valueSeparator")||",";if($element.prop("type")==="hidden"){if(options.get("debug")&&console&&console.warn){console.warn("Select2: Using a hidden input with Select2 is no longer "+"supported and may stop working in the future. It is recommended "+"to use a `<select>` element instead.")}}decorated.call(this,$element,options)}InputData.prototype.current=function(_,callback){function getSelected(data,selectedIds){var selected=[];if(data.selected||$.inArray(data.id,selectedIds)!==-1){data.selected=true;selected.push(data)}else{data.selected=false}if(data.children){selected.push.apply(selected,getSelected(data.children,selectedIds))}return selected}var selected=[];for(var d=0;d<this._currentData.length;d++){var data=this._currentData[d];selected.push.apply(selected,getSelected(data,this.$element.val().split(this._valueSeparator)))}callback(selected)};InputData.prototype.select=function(_,data){if(!this.options.get("multiple")){this.current(function(allData){$.map(allData,function(data){data.selected=false})});this.$element.val(data.id);this.$element.trigger("change")}else{var value=this.$element.val();value+=this._valueSeparator+data.id;this.$element.val(value);this.$element.trigger("change")}};InputData.prototype.unselect=function(_,data){var self=this;data.selected=false;this.current(function(allData){var values=[];for(var d=0;d<allData.length;d++){var item=allData[d];if(data.id==item.id){continue}values.push(item.id)}self.$element.val(values.join(self._valueSeparator));self.$element.trigger("change")})};InputData.prototype.query=function(_,params,callback){var results=[];for(var d=0;d<this._currentData.length;d++){var data=this._currentData[d];var matches=this.matches(params,data);if(matches!==null){results.push(matches)}}callback({results:results})};InputData.prototype.addOptions=function(_,$options){var options=$.map($options,function($option){return Utils.GetData($option[0],"data")});this._currentData.push.apply(this._currentData,options)};return InputData});S2.define("select2/compat/matcher",["jquery"],function($){function oldMatcher(matcher){function wrappedMatcher(params,data){var match=$.extend(true,{},data);if(params.term==null||$.trim(params.term)===""){return match}if(data.children){for(var c=data.children.length-1;c>=0;c--){var child=data.children[c];var doesMatch=matcher(params.term,child.text,child);if(!doesMatch){match.children.splice(c,1)}}if(match.children.length>0){return match}}if(matcher(params.term,data.text,data)){return match}return null}return wrappedMatcher}return oldMatcher});S2.define("select2/compat/query",[],function(){function Query(decorated,$element,options){if(options.get("debug")&&window.console&&console.warn){console.warn("Select2: The `query` option has been deprecated in favor of a "+"custom data adapter that overrides the `query` method. Support "+"will be removed for the `query` option in future versions of "+"Select2.")}decorated.call(this,$element,options)}Query.prototype.query=function(_,params,callback){params.callback=callback;var query=this.options.get("query");query.call(null,params)};return Query});S2.define("select2/dropdown/attachContainer",[],function(){function AttachContainer(decorated,$element,options){decorated.call(this,$element,options)}AttachContainer.prototype.position=function(decorated,$dropdown,$container){var $dropdownContainer=$container.find(".dropdown-wrapper");$dropdownContainer.append($dropdown);$dropdown.addClass("select2-dropdown--below");$container.addClass("select2-container--below")};return AttachContainer});S2.define("select2/dropdown/stopPropagation",[],function(){function StopPropagation(){}StopPropagation.prototype.bind=function(decorated,container,$container){decorated.call(this,container,$container);var stoppedEvents=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(stoppedEvents.join(" "),function(evt){evt.stopPropagation()})};return StopPropagation});S2.define("select2/selection/stopPropagation",[],function(){function StopPropagation(){}StopPropagation.prototype.bind=function(decorated,container,$container){decorated.call(this,container,$container);var stoppedEvents=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(stoppedEvents.join(" "),function(evt){evt.stopPropagation()})};return StopPropagation});(function(factory){if(typeof S2.define==="function"&&S2.define.amd){S2.define("jquery-mousewheel",["jquery"],factory)}else if(typeof exports==="object"){module.exports=factory}else{factory(jQuery)}})(function($){var toFix=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],toBind="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],slice=Array.prototype.slice,nullLowestDeltaTimeout,lowestDelta;if($.event.fixHooks){for(var i=toFix.length;i;){$.event.fixHooks[toFix[--i]]=$.event.mouseHooks}}var special=$.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener){for(var i=toBind.length;i;){this.addEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=handler}$.data(this,"mousewheel-line-height",special.getLineHeight(this));$.data(this,"mousewheel-page-height",special.getPageHeight(this))},teardown:function(){if(this.removeEventListener){for(var i=toBind.length;i;){this.removeEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=null}$.removeData(this,"mousewheel-line-height");$.removeData(this,"mousewheel-page-height")},getLineHeight:function(elem){var $elem=$(elem),$parent=$elem["offsetParent"in $.fn?"offsetParent":"parent"]();if(!$parent.length){$parent=$("body")}return parseInt($parent.css("fontSize"),10)||parseInt($elem.css("fontSize"),10)||16},getPageHeight:function(elem){return $(elem).height()},settings:{adjustOldDeltas:true,normalizeOffset:true}};$.fn.extend({mousewheel:function(fn){return fn?this.bind("mousewheel",fn):this.trigger("mousewheel")},unmousewheel:function(fn){return this.unbind("mousewheel",fn)}});function handler(event){var orgEvent=event||window.event,args=slice.call(arguments,1),delta=0,deltaX=0,deltaY=0,absDelta=0,offsetX=0,offsetY=0;event=$.event.fix(orgEvent);event.type="mousewheel";if("detail"in orgEvent){deltaY=orgEvent.detail*-1}if("wheelDelta"in orgEvent){deltaY=orgEvent.wheelDelta}if("wheelDeltaY"in orgEvent){deltaY=orgEvent.wheelDeltaY}if("wheelDeltaX"in orgEvent){deltaX=orgEvent.wheelDeltaX*-1}if("axis"in orgEvent&&orgEvent.axis===orgEvent.HORIZONTAL_AXIS){deltaX=deltaY*-1;deltaY=0}delta=deltaY===0?deltaX:deltaY;if("deltaY"in orgEvent){deltaY=orgEvent.deltaY*-1;delta=deltaY}if("deltaX"in orgEvent){deltaX=orgEvent.deltaX;if(deltaY===0){delta=deltaX*-1}}if(deltaY===0&&deltaX===0){return}if(orgEvent.deltaMode===1){var lineHeight=$.data(this,"mousewheel-line-height");delta*=lineHeight;deltaY*=lineHeight;deltaX*=lineHeight}else if(orgEvent.deltaMode===2){var pageHeight=$.data(this,"mousewheel-page-height");delta*=pageHeight;deltaY*=pageHeight;deltaX*=pageHeight}absDelta=Math.max(Math.abs(deltaY),Math.abs(deltaX));if(!lowestDelta||absDelta<lowestDelta){lowestDelta=absDelta;if(shouldAdjustOldDeltas(orgEvent,absDelta)){lowestDelta/=40}}if(shouldAdjustOldDeltas(orgEvent,absDelta)){delta/=40;deltaX/=40;deltaY/=40}delta=Math[delta>=1?"floor":"ceil"](delta/lowestDelta);deltaX=Math[deltaX>=1?"floor":"ceil"](deltaX/lowestDelta);deltaY=Math[deltaY>=1?"floor":"ceil"](deltaY/lowestDelta);if(special.settings.normalizeOffset&&this.getBoundingClientRect){var boundingRect=this.getBoundingClientRect();offsetX=event.clientX-boundingRect.left;offsetY=event.clientY-boundingRect.top}event.deltaX=deltaX;event.deltaY=deltaY;event.deltaFactor=lowestDelta;event.offsetX=offsetX;event.offsetY=offsetY;event.deltaMode=0;args.unshift(event,delta,deltaX,deltaY);if(nullLowestDeltaTimeout){clearTimeout(nullLowestDeltaTimeout)}nullLowestDeltaTimeout=setTimeout(nullLowestDelta,200);return($.event.dispatch||$.event.handle).apply(this,args)}function nullLowestDelta(){lowestDelta=null}function shouldAdjustOldDeltas(orgEvent,absDelta){return special.settings.adjustOldDeltas&&orgEvent.type==="mousewheel"&&absDelta%120===0}});S2.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function($,_,Select2,Defaults,Utils){if($.fn.select2==null){var thisMethods=["open","close","destroy"];$.fn.select2=function(options){options=options||{};if(typeof options==="object"){this.each(function(){var instanceOptions=$.extend(true,{},options);var instance=new Select2($(this),instanceOptions)});return this}else if(typeof options==="string"){var ret;var args=Array.prototype.slice.call(arguments,1);this.each(function(){var instance=Utils.GetData(this,"select2");if(instance==null&&window.console&&console.error){console.error("The select2('"+options+"') method was called on an "+"element that is not using Select2.")}ret=instance[options].apply(instance,args)});if($.inArray(options,thisMethods)>-1){return this}return ret}else{throw new Error("Invalid arguments for Select2: "+options)}}}if($.fn.select2.defaults==null){$.fn.select2.defaults=Defaults}return Select2});return{define:S2.define,require:S2.require}}();var select2=S2.require("jquery.select2");jQuery.fn.select2.amd=S2;return select2}); wizard/assets/select2/js/select2.full.js 0000644 00000504411 15154444756 0014207 0 ustar 00 /*! * Select2 4.0.6-rc.1 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ ;(function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof module === 'object' && module.exports) { // Node/CommonJS module.exports = function (root, jQuery) { if (jQuery === undefined) { // require('jQuery') returns a factory that requires window to // build a jQuery instance, we normalize how we use modules // that require this pattern but the window provided is a noop // if it's defined (how jquery works) if (typeof window !== 'undefined') { jQuery = require('jquery'); } else { jQuery = require('jquery')(root); } } factory(jQuery); return jQuery; }; } else { // Browser globals factory(jQuery); } } (function (jQuery) { // This is needed so we can catch the AMD loader configuration and use it // The inner file should be wrapped (by `banner.start.js`) in a function that // returns the AMD loader references. var S2 =(function () { // Restore the Select2 AMD loader so it can be used // Needed mostly in the language files, where the loader is not inserted if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { var S2 = jQuery.fn.select2.amd; } var S2;(function () { if (!S2 || !S2.requirejs) { if (!S2) { S2 = {}; } else { require = S2; } /** * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. * Released under MIT license, http://github.com/requirejs/almond/LICENSE */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. /*global setTimeout: false */ var requirejs, require, define; (function (undef) { var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\.js$/; function hasProp(obj, prop) { return hasOwn.call(obj, prop); } /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. if (name) { name = name.split('/'); lastIndex = name.length - 1; // If wanting node ID compatibility, strip .js from end // of IDs. Have to do this here, and not in nameToUrl // because node allows either .js or non .js to map // to same file. if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } // Starts with a '.' so need the baseName if (name[0].charAt(0) === '.' && baseParts) { //Convert baseName to array, and lop off the last part, //so that . matches that 'directory' and not name of the baseName's //module. For instance, baseName of 'one/two/three', maps to //'one/two/three.js', but we want the directory, 'one/two' for //this normalization. normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); name = normalizedBaseParts.concat(name); } //start trimDots for (i = 0; i < name.length; i++) { part = name[i]; if (part === '.') { name.splice(i, 1); i -= 1; } else if (part === '..') { // If at the start, or previous value is still .., // keep them so that when converted to a path it may // still work when converted to a path, even though // as an ID it is less than ideal. In larger point // releases, may be better to just kick out an error. if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { continue; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } } //end trimDots name = name.join('/'); } //Apply map config if available. if ((baseParts || starMap) && map) { nameParts = name.split('/'); for (i = nameParts.length; i > 0; i -= 1) { nameSegment = nameParts.slice(0, i).join("/"); if (baseParts) { //Find the longest baseName segment match in the config. //So, do joins on the biggest to smallest lengths of baseParts. for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; foundI = i; break; } } } } if (foundMap) { break; } //Check for a star map match, but just hold on to it, //if there is a shorter segment match later in a matching //config, then favor over this star map. if (!foundStarMap && starMap && starMap[nameSegment]) { foundStarMap = starMap[nameSegment]; starI = i; } } if (!foundMap && foundStarMap) { foundMap = foundStarMap; foundI = starI; } if (foundMap) { nameParts.splice(0, foundI, foundMap); name = nameParts.join('/'); } } return name; } function makeRequire(relName, forceSync) { return function () { //A version of a require function that passes a moduleName //value for items that may need to //look up paths relative to the moduleName var args = aps.call(arguments, 0); //If first arg is not require('string'), and there is only //one arg, it is the array form without a callback. Insert //a null so that the following concat is correct. if (typeof args[0] !== 'string' && args.length === 1) { args.push(null); } return req.apply(undef, args.concat([relName, forceSync])); }; } function makeNormalize(relName) { return function (name) { return normalize(name, relName); }; } function makeLoad(depName) { return function (value) { defined[depName] = value; }; } function callDep(name) { if (hasProp(waiting, name)) { var args = waiting[name]; delete waiting[name]; defining[name] = true; main.apply(undef, args); } if (!hasProp(defined, name) && !hasProp(defining, name)) { throw new Error('No ' + name); } return defined[name]; } //Turns a plugin!resource to [plugin, resource] //with the plugin being undefined if the name //did not have a plugin prefix. function splitPrefix(name) { var prefix, index = name ? name.indexOf('!') : -1; if (index > -1) { prefix = name.substring(0, index); name = name.substring(index + 1, name.length); } return [prefix, name]; } //Creates a parts array for a relName where first part is plugin ID, //second part is resource ID. Assumes relName has already been normalized. function makeRelParts(relName) { return relName ? splitPrefix(relName) : []; } /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ makeMap = function (name, relParts) { var plugin, parts = splitPrefix(name), prefix = parts[0], relResourceName = relParts[1]; name = parts[1]; if (prefix) { prefix = normalize(prefix, relResourceName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { name = plugin.normalize(name, makeNormalize(relResourceName)); } else { name = normalize(name, relResourceName); } } else { name = normalize(name, relResourceName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; if (prefix) { plugin = callDep(prefix); } } //Using ridiculous property names for space reasons return { f: prefix ? prefix + '!' + name : name, //fullName n: name, pr: prefix, p: plugin }; }; function makeConfig(name) { return function () { return (config && config.config && config.config[name]) || {}; }; } handlers = { require: function (name) { return makeRequire(name); }, exports: function (name) { var e = defined[name]; if (typeof e !== 'undefined') { return e; } else { return (defined[name] = {}); } }, module: function (name) { return { id: name, uri: '', exports: defined[name], config: makeConfig(name) }; } }; main = function (name, deps, callback, relName) { var cjsModule, depName, ret, map, i, relParts, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; relParts = makeRelParts(relName); //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { //Pull out the defined dependencies and pass the ordered //values to the callback. //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { map = makeMap(deps[i], relParts); depName = map.f; //Fast path CommonJS standard dependencies. if (depName === "require") { args[i] = handlers.require(name); } else if (depName === "exports") { //CommonJS module spec 1.1 args[i] = handlers.exports(name); usingExports = true; } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = handlers.module(name); } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; } else { throw new Error(name + ' missing ' + depName); } } ret = callback ? callback.apply(defined[name], args) : undefined; if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { //May just be an object definition for the module. Only //worry about defining if have a module name. defined[name] = callback; } }; requirejs = require = req = function (deps, callback, relName, forceSync, alt) { if (typeof deps === "string") { if (handlers[deps]) { //callback in this case is really relName return handlers[deps](callback); } //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, makeRelParts(callback)).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; if (config.deps) { req(config.deps, config.callback); } if (!callback) { return; } if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; callback = relName; relName = null; } else { deps = undef; } } //Support require(['a']) callback = callback || function () {}; //If relName is a function, it is an errback handler, //so remove it. if (typeof relName === 'function') { relName = forceSync; forceSync = alt; } //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { //Using a non-zero value because of concern for what old browsers //do, and latest browsers "upgrade" to 4 if lower value is used: //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: //If want a value immediately, use require('id') instead -- something //that works in almond on the global level, but not guaranteed and //unlikely to work in other AMD implementations. setTimeout(function () { main(undef, deps, callback, relName); }, 4); } return req; }; /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ req.config = function (cfg) { return req(cfg); }; /** * Expose module registry for debugging and tooling */ requirejs._defined = defined; define = function (name, deps, callback) { if (typeof name !== 'string') { throw new Error('See almond README: incorrect module build, no module name'); } //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means //an object literal or factory function for //the value. Adjust args. callback = deps; deps = []; } if (!hasProp(defined, name) && !hasProp(waiting, name)) { waiting[name] = [name, deps, callback]; } }; define.amd = { jQuery: true }; }()); S2.requirejs = requirejs;S2.require = require;S2.define = define; } }()); S2.define("almond", function(){}); /* global jQuery:false, $:false */ S2.define('jquery',[],function () { var _$ = jQuery || $; if (_$ == null && console && console.error) { console.error( 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.' ); } return _$; }); S2.define('select2/utils',[ 'jquery' ], function ($) { var Utils = {}; Utils.Extend = function (ChildClass, SuperClass) { var __hasProp = {}.hasOwnProperty; function BaseConstructor () { this.constructor = ChildClass; } for (var key in SuperClass) { if (__hasProp.call(SuperClass, key)) { ChildClass[key] = SuperClass[key]; } } BaseConstructor.prototype = SuperClass.prototype; ChildClass.prototype = new BaseConstructor(); ChildClass.__super__ = SuperClass.prototype; return ChildClass; }; function getMethods (theClass) { var proto = theClass.prototype; var methods = []; for (var methodName in proto) { var m = proto[methodName]; if (typeof m !== 'function') { continue; } if (methodName === 'constructor') { continue; } methods.push(methodName); } return methods; } Utils.Decorate = function (SuperClass, DecoratorClass) { var decoratedMethods = getMethods(DecoratorClass); var superMethods = getMethods(SuperClass); function DecoratedClass () { var unshift = Array.prototype.unshift; var argCount = DecoratorClass.prototype.constructor.length; var calledConstructor = SuperClass.prototype.constructor; if (argCount > 0) { unshift.call(arguments, SuperClass.prototype.constructor); calledConstructor = DecoratorClass.prototype.constructor; } calledConstructor.apply(this, arguments); } DecoratorClass.displayName = SuperClass.displayName; function ctr () { this.constructor = DecoratedClass; } DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { var superMethod = superMethods[m]; DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { // Stub out the original method if it's not decorating an actual method var originalMethod = function () {}; if (methodName in DecoratedClass.prototype) { originalMethod = DecoratedClass.prototype[methodName]; } var decoratedMethod = DecoratorClass.prototype[methodName]; return function () { var unshift = Array.prototype.unshift; unshift.call(arguments, originalMethod); return decoratedMethod.apply(this, arguments); }; }; for (var d = 0; d < decoratedMethods.length; d++) { var decoratedMethod = decoratedMethods[d]; DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); } return DecoratedClass; }; var Observable = function () { this.listeners = {}; }; Observable.prototype.on = function (event, callback) { this.listeners = this.listeners || {}; if (event in this.listeners) { this.listeners[event].push(callback); } else { this.listeners[event] = [callback]; } }; Observable.prototype.trigger = function (event) { var slice = Array.prototype.slice; var params = slice.call(arguments, 1); this.listeners = this.listeners || {}; // Params should always come in as an array if (params == null) { params = []; } // If there are no arguments to the event, use a temporary object if (params.length === 0) { params.push({}); } // Set the `_type` of the first object to the event params[0]._type = event; if (event in this.listeners) { this.invoke(this.listeners[event], slice.call(arguments, 1)); } if ('*' in this.listeners) { this.invoke(this.listeners['*'], arguments); } }; Observable.prototype.invoke = function (listeners, params) { for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].apply(this, params); } }; Utils.Observable = Observable; Utils.generateChars = function (length) { var chars = ''; for (var i = 0; i < length; i++) { var randomChar = Math.floor(Math.random() * 36); chars += randomChar.toString(36); } return chars; }; Utils.bind = function (func, context) { return function () { func.apply(context, arguments); }; }; Utils._convertData = function (data) { for (var originalKey in data) { var keys = originalKey.split('-'); var dataLevel = data; if (keys.length === 1) { continue; } for (var k = 0; k < keys.length; k++) { var key = keys[k]; // Lowercase the first letter // By default, dash-separated becomes camelCase key = key.substring(0, 1).toLowerCase() + key.substring(1); if (!(key in dataLevel)) { dataLevel[key] = {}; } if (k == keys.length - 1) { dataLevel[key] = data[originalKey]; } dataLevel = dataLevel[key]; } delete data[originalKey]; } return data; }; Utils.hasScroll = function (index, el) { // Adapted from the function created by @ShadowScripter // and adapted by @BillBarry on the Stack Exchange Code Review website. // The original code can be found at // http://codereview.stackexchange.com/q/13338 // and was designed to be used with the Sizzle selector engine. var $el = $(el); var overflowX = el.style.overflowX; var overflowY = el.style.overflowY; //Check both x and y declarations if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) { return false; } if (overflowX === 'scroll' || overflowY === 'scroll') { return true; } return ($el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth); }; Utils.escapeMarkup = function (markup) { var replaceMap = { '\\': '\', '&': '&', '<': '<', '>': '>', '"': '"', '\'': ''', '/': '/' }; // Do not try to escape the markup if it's not a string if (typeof markup !== 'string') { return markup; } return String(markup).replace(/[&<>"'\/\\]/g, function (match) { return replaceMap[match]; }); }; // Append an array of jQuery nodes to a given element. Utils.appendMany = function ($element, $nodes) { // jQuery 1.7.x does not support $.fn.append() with an array // Fall back to a jQuery object collection using $.fn.add() if ($.fn.jquery.substr(0, 3) === '1.7') { var $jqNodes = $(); $.map($nodes, function (node) { $jqNodes = $jqNodes.add(node); }); $nodes = $jqNodes; } $element.append($nodes); }; // Cache objects in Utils.__cache instead of $.data (see #4346) Utils.__cache = {}; var id = 0; Utils.GetUniqueElementId = function (element) { // Get a unique element Id. If element has no id, // creates a new unique number, stores it in the id // attribute and returns the new id. // If an id already exists, it simply returns it. var select2Id = element.getAttribute('data-select2-id'); if (select2Id == null) { // If element has id, use it. if (element.id) { select2Id = element.id; element.setAttribute('data-select2-id', select2Id); } else { element.setAttribute('data-select2-id', ++id); select2Id = id.toString(); } } return select2Id; }; Utils.StoreData = function (element, name, value) { // Stores an item in the cache for a specified element. // name is the cache key. var id = Utils.GetUniqueElementId(element); if (!Utils.__cache[id]) { Utils.__cache[id] = {}; } Utils.__cache[id][name] = value; }; Utils.GetData = function (element, name) { // Retrieves a value from the cache by its key (name) // name is optional. If no name specified, return // all cache items for the specified element. // and for a specified element. var id = Utils.GetUniqueElementId(element); if (name) { if (Utils.__cache[id]) { return Utils.__cache[id][name] != null ? Utils.__cache[id][name]: $(element).data(name); // Fallback to HTML5 data attribs. } return $(element).data(name); // Fallback to HTML5 data attribs. } else { return Utils.__cache[id]; } }; Utils.RemoveData = function (element) { // Removes all cached items for a specified element. var id = Utils.GetUniqueElementId(element); if (Utils.__cache[id] != null) { delete Utils.__cache[id]; } }; return Utils; }); S2.define('select2/results',[ 'jquery', './utils' ], function ($, Utils) { function Results ($element, options, dataAdapter) { this.$element = $element; this.data = dataAdapter; this.options = options; Results.__super__.constructor.call(this); } Utils.Extend(Results, Utils.Observable); Results.prototype.render = function () { var $results = $( '<ul class="select2-results__options" role="tree"></ul>' ); if (this.options.get('multiple')) { $results.attr('aria-multiselectable', 'true'); } this.$results = $results; return $results; }; Results.prototype.clear = function () { this.$results.empty(); }; Results.prototype.displayMessage = function (params) { var escapeMarkup = this.options.get('escapeMarkup'); this.clear(); this.hideLoading(); var $message = $( '<li role="treeitem" aria-live="assertive"' + ' class="select2-results__option"></li>' ); var message = this.options.get('translations').get(params.message); $message.append( escapeMarkup( message(params.args) ) ); $message[0].className += ' select2-results__message'; this.$results.append($message); }; Results.prototype.hideMessages = function () { this.$results.find('.select2-results__message').remove(); }; Results.prototype.append = function (data) { this.hideLoading(); var $options = []; if (data.results == null || data.results.length === 0) { if (this.$results.children().length === 0) { this.trigger('results:message', { message: 'noResults' }); } return; } data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) { var item = data.results[d]; var $option = this.option(item); $options.push($option); } this.$results.append($options); }; Results.prototype.position = function ($results, $dropdown) { var $resultsContainer = $dropdown.find('.select2-results'); $resultsContainer.append($results); }; Results.prototype.sort = function (data) { var sorter = this.options.get('sorter'); return sorter(data); }; Results.prototype.highlightFirstItem = function () { var $options = this.$results .find('.select2-results__option[aria-selected]'); var $selected = $options.filter('[aria-selected=true]'); // Check if there are any selected options if ($selected.length > 0) { // If there are selected options, highlight the first $selected.first().trigger('mouseenter'); } else { // If there are no selected options, highlight the first option // in the dropdown $options.first().trigger('mouseenter'); } this.ensureHighlightVisible(); }; Results.prototype.setClasses = function () { var self = this; this.data.current(function (selected) { var selectedIds = $.map(selected, function (s) { return s.id.toString(); }); var $options = self.$results .find('.select2-results__option[aria-selected]'); $options.each(function () { var $option = $(this); var item = Utils.GetData(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; if ((item.element != null && item.element.selected) || (item.element == null && $.inArray(id, selectedIds) > -1)) { $option.attr('aria-selected', 'true'); } else { $option.attr('aria-selected', 'false'); } }); }); }; Results.prototype.showLoading = function (params) { this.hideLoading(); var loadingMore = this.options.get('translations').get('searching'); var loading = { disabled: true, loading: true, text: loadingMore(params) }; var $loading = this.option(loading); $loading.className += ' loading-results'; this.$results.prepend($loading); }; Results.prototype.hideLoading = function () { this.$results.find('.loading-results').remove(); }; Results.prototype.option = function (data) { var option = document.createElement('li'); option.className = 'select2-results__option'; var attrs = { 'role': 'treeitem', 'aria-selected': 'false' }; if (data.disabled) { delete attrs['aria-selected']; attrs['aria-disabled'] = 'true'; } if (data.id == null) { delete attrs['aria-selected']; } if (data._resultId != null) { option.id = data._resultId; } if (data.title) { option.title = data.title; } if (data.children) { attrs.role = 'group'; attrs['aria-label'] = data.text; delete attrs['aria-selected']; } for (var attr in attrs) { var val = attrs[attr]; option.setAttribute(attr, val); } if (data.children) { var $option = $(option); var label = document.createElement('strong'); label.className = 'select2-results__group'; var $label = $(label); this.template(data, label); var $children = []; for (var c = 0; c < data.children.length; c++) { var child = data.children[c]; var $child = this.option(child); $children.push($child); } var $childrenContainer = $('<ul></ul>', { 'class': 'select2-results__options select2-results__options--nested' }); $childrenContainer.append($children); $option.append(label); $option.append($childrenContainer); } else { this.template(data, option); } Utils.StoreData(option, 'data', data); return option; }; Results.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-results'; this.$results.attr('id', id); container.on('results:all', function (params) { self.clear(); self.append(params.data); if (container.isOpen()) { self.setClasses(); self.highlightFirstItem(); } }); container.on('results:append', function (params) { self.append(params.data); if (container.isOpen()) { self.setClasses(); } }); container.on('query', function (params) { self.hideMessages(); self.showLoading(params); }); container.on('select', function () { if (!container.isOpen()) { return; } self.setClasses(); self.highlightFirstItem(); }); container.on('unselect', function () { if (!container.isOpen()) { return; } self.setClasses(); self.highlightFirstItem(); }); container.on('open', function () { // When the dropdown is open, aria-expended="true" self.$results.attr('aria-expanded', 'true'); self.$results.attr('aria-hidden', 'false'); self.setClasses(); self.ensureHighlightVisible(); }); container.on('close', function () { // When the dropdown is closed, aria-expended="false" self.$results.attr('aria-expanded', 'false'); self.$results.attr('aria-hidden', 'true'); self.$results.removeAttr('aria-activedescendant'); }); container.on('results:toggle', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } $highlighted.trigger('mouseup'); }); container.on('results:select', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } var data = Utils.GetData($highlighted[0], 'data'); if ($highlighted.attr('aria-selected') == 'true') { self.trigger('close', {}); } else { self.trigger('select', { data: data }); } }); container.on('results:previous', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); // If we are already at te top, don't move further // If no options, currentIndex will be -1 if (currentIndex <= 0) { return; } var nextIndex = currentIndex - 1; // If none are highlighted, highlight the first if ($highlighted.length === 0) { nextIndex = 0; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top; var nextTop = $next.offset().top; var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextTop - currentOffset < 0) { self.$results.scrollTop(nextOffset); } }); container.on('results:next', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var nextIndex = currentIndex + 1; // If we are at the last option, stay there if (nextIndex >= $options.length) { return; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var nextBottom = $next.offset().top + $next.outerHeight(false); var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextBottom > currentOffset) { self.$results.scrollTop(nextOffset); } }); container.on('results:focus', function (params) { params.element.addClass('select2-results__option--highlighted'); }); container.on('results:message', function (params) { self.displayMessage(params); }); if ($.fn.mousewheel) { this.$results.on('mousewheel', function (e) { var top = self.$results.scrollTop(); var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); if (isAtTop) { self.$results.scrollTop(0); e.preventDefault(); e.stopPropagation(); } else if (isAtBottom) { self.$results.scrollTop( self.$results.get(0).scrollHeight - self.$results.height() ); e.preventDefault(); e.stopPropagation(); } }); } this.$results.on('mouseup', '.select2-results__option[aria-selected]', function (evt) { var $this = $(this); var data = Utils.GetData(this, 'data'); if ($this.attr('aria-selected') === 'true') { if (self.options.get('multiple')) { self.trigger('unselect', { originalEvent: evt, data: data }); } else { self.trigger('close', {}); } return; } self.trigger('select', { originalEvent: evt, data: data }); }); this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) { var data = Utils.GetData(this, 'data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted'); self.trigger('results:focus', { data: data, element: $(this) }); }); }; Results.prototype.getHighlightedResults = function () { var $highlighted = this.$results .find('.select2-results__option--highlighted'); return $highlighted; }; Results.prototype.destroy = function () { this.$results.remove(); }; Results.prototype.ensureHighlightVisible = function () { var $highlighted = this.getHighlightedResults(); if ($highlighted.length === 0) { return; } var $options = this.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var currentOffset = this.$results.offset().top; var nextTop = $highlighted.offset().top; var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); var offsetDelta = nextTop - currentOffset; nextOffset -= $highlighted.outerHeight(false) * 2; if (currentIndex <= 2) { this.$results.scrollTop(0); } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { this.$results.scrollTop(nextOffset); } }; Results.prototype.template = function (result, container) { var template = this.options.get('templateResult'); var escapeMarkup = this.options.get('escapeMarkup'); var content = template(result, container); if (content == null) { container.style.display = 'none'; } else if (typeof content === 'string') { container.innerHTML = escapeMarkup(content); } else { $(container).append(content); } }; return Results; }); S2.define('select2/keys',[ ], function () { var KEYS = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }; return KEYS; }); S2.define('select2/selection/base',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function BaseSelection ($element, options) { this.$element = $element; this.options = options; BaseSelection.__super__.constructor.call(this); } Utils.Extend(BaseSelection, Utils.Observable); BaseSelection.prototype.render = function () { var $selection = $( '<span class="select2-selection" role="combobox" ' + ' aria-haspopup="true" aria-expanded="false">' + '</span>' ); this._tabindex = 0; if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); this.$selection = $selection; return $selection; }; BaseSelection.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-container'; var resultsId = container.id + '-results'; this.container = container; this.$selection.on('focus', function (evt) { self.trigger('focus', evt); }); this.$selection.on('blur', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', function (evt) { self.trigger('keypress', evt); if (evt.which === KEYS.SPACE) { evt.preventDefault(); } }); container.on('results:focus', function (params) { self.$selection.attr('aria-activedescendant', params.data._resultId); }); container.on('selection:update', function (params) { self.update(params.data); }); container.on('open', function () { // When the dropdown is open, aria-expanded="true" self.$selection.attr('aria-expanded', 'true'); self.$selection.attr('aria-owns', resultsId); self._attachCloseHandler(container); }); container.on('close', function () { // When the dropdown is closed, aria-expanded="false" self.$selection.attr('aria-expanded', 'false'); self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); self.$selection.focus(); window.setTimeout(function () { self.$selection.focus(); }, 0); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); }); }; BaseSelection.prototype._handleBlur = function (evt) { var self = this; // This needs to be delayed as the active element is the body when the tab // key is pressed, possibly along with others. window.setTimeout(function () { // Don't trigger `blur` if the focus is still in the selection if ( (document.activeElement == self.$selection[0]) || ($.contains(self.$selection[0], document.activeElement)) ) { return; } self.trigger('blur', evt); }, 1); }; BaseSelection.prototype._attachCloseHandler = function (container) { var self = this; $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); var $select = $target.closest('.select2'); var $all = $('.select2.select2-container--open'); $all.each(function () { var $this = $(this); if (this == $select[0]) { return; } var $element = Utils.GetData(this, 'element'); $element.select2('close'); }); }); }; BaseSelection.prototype._detachCloseHandler = function (container) { $(document.body).off('mousedown.select2.' + container.id); }; BaseSelection.prototype.position = function ($selection, $container) { var $selectionContainer = $container.find('.selection'); $selectionContainer.append($selection); }; BaseSelection.prototype.destroy = function () { this._detachCloseHandler(this.container); }; BaseSelection.prototype.update = function (data) { throw new Error('The `update` method must be defined in child classes.'); }; return BaseSelection; }); S2.define('select2/selection/single',[ 'jquery', './base', '../utils', '../keys' ], function ($, BaseSelection, Utils, KEYS) { function SingleSelection () { SingleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(SingleSelection, BaseSelection); SingleSelection.prototype.render = function () { var $selection = SingleSelection.__super__.render.call(this); $selection.addClass('select2-selection--single'); $selection.html( '<span class="select2-selection__rendered"></span>' + '<span class="select2-selection__arrow" role="presentation">' + '<b role="presentation"></b>' + '</span>' ); return $selection; }; SingleSelection.prototype.bind = function (container, $container) { var self = this; SingleSelection.__super__.bind.apply(this, arguments); var id = container.id + '-container'; this.$selection.find('.select2-selection__rendered') .attr('id', id) .attr('role', 'textbox') .attr('aria-readonly', 'true'); this.$selection.attr('aria-labelledby', id); this.$selection.on('mousedown', function (evt) { // Only respond to left clicks if (evt.which !== 1) { return; } self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on('focus', function (evt) { // User focuses on the container }); this.$selection.on('blur', function (evt) { // User exits the container }); container.on('focus', function (evt) { if (!container.isOpen()) { self.$selection.focus(); } }); }; SingleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); // clear tooltip on empty }; SingleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; SingleSelection.prototype.selectionContainer = function () { return $('<span></span>'); }; SingleSelection.prototype.update = function (data) { if (data.length === 0) { this.clear(); return; } var selection = data[0]; var $rendered = this.$selection.find('.select2-selection__rendered'); var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); $rendered.attr('title', selection.title || selection.text); }; return SingleSelection; }); S2.define('select2/selection/multiple',[ 'jquery', './base', '../utils' ], function ($, BaseSelection, Utils) { function MultipleSelection ($element, options) { MultipleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(MultipleSelection, BaseSelection); MultipleSelection.prototype.render = function () { var $selection = MultipleSelection.__super__.render.call(this); $selection.addClass('select2-selection--multiple'); $selection.html( '<ul class="select2-selection__rendered"></ul>' ); return $selection; }; MultipleSelection.prototype.bind = function (container, $container) { var self = this; MultipleSelection.__super__.bind.apply(this, arguments); this.$selection.on('click', function (evt) { self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on( 'click', '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled if (self.options.get('disabled')) { return; } var $remove = $(this); var $selection = $remove.parent(); var data = Utils.GetData($selection[0], 'data'); self.trigger('unselect', { originalEvent: evt, data: data }); } ); }; MultipleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); }; MultipleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; MultipleSelection.prototype.selectionContainer = function () { var $container = $( '<li class="select2-selection__choice">' + '<span class="select2-selection__choice__remove" role="presentation">' + '×' + '</span>' + '</li>' ); return $container; }; MultipleSelection.prototype.update = function (data) { this.clear(); if (data.length === 0) { return; } var $selections = []; for (var d = 0; d < data.length; d++) { var selection = data[d]; var $selection = this.selectionContainer(); var formatted = this.display(selection, $selection); $selection.append(formatted); $selection.attr('title', selection.title || selection.text); Utils.StoreData($selection[0], 'data', selection); $selections.push($selection); } var $rendered = this.$selection.find('.select2-selection__rendered'); Utils.appendMany($rendered, $selections); }; return MultipleSelection; }); S2.define('select2/selection/placeholder',[ '../utils' ], function (Utils) { function Placeholder (decorated, $element, options) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options); } Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { var $placeholder = this.selectionContainer(); $placeholder.html(this.display(placeholder)); $placeholder.addClass('select2-selection__placeholder') .removeClass('select2-selection__choice'); return $placeholder; }; Placeholder.prototype.update = function (decorated, data) { var singlePlaceholder = ( data.length == 1 && data[0].id != this.placeholder.id ); var multipleSelections = data.length > 1; if (multipleSelections || singlePlaceholder) { return decorated.call(this, data); } this.clear(); var $placeholder = this.createPlaceholder(this.placeholder); this.$selection.find('.select2-selection__rendered').append($placeholder); }; return Placeholder; }); S2.define('select2/selection/allowClear',[ 'jquery', '../keys', '../utils' ], function ($, KEYS, Utils) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); if (this.placeholder == null) { if (this.options.get('debug') && window.console && console.error) { console.error( 'Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.' ); } } this.$selection.on('mousedown', '.select2-selection__clear', function (evt) { self._handleClear(evt); }); container.on('keypress', function (evt) { self._handleKeyboardClear(evt, container); }); }; AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled if (this.options.get('disabled')) { return; } var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected if ($clear.length === 0) { return; } evt.stopPropagation(); var data = Utils.GetData($clear[0], 'data'); var previousVal = this.$element.val(); this.$element.val(this.placeholder.id); var unselectData = { data: data }; this.trigger('clear', unselectData); if (unselectData.prevented) { this.$element.val(previousVal); return; } for (var d = 0; d < data.length; d++) { unselectData = { data: data[d] }; // Trigger the `unselect` event, so people can prevent it from being // cleared. this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out. if (unselectData.prevented) { this.$element.val(previousVal); return; } } this.$element.trigger('change'); this.trigger('toggle', {}); }; AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { if (container.isOpen()) { return; } if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { this._handleClear(evt); } }; AllowClear.prototype.update = function (decorated, data) { decorated.call(this, data); if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) { return; } var $remove = $( '<span class="select2-selection__clear">' + '×' + '</span>' ); Utils.StoreData($remove[0], 'data', data); this.$selection.find('.select2-selection__rendered').prepend($remove); }; return AllowClear; }); S2.define('select2/selection/search',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function Search (decorated, $element, options) { decorated.call(this, $element, options); } Search.prototype.render = function (decorated) { var $search = $( '<li class="select2-search select2-search--inline">' + '<input class="select2-search__field" type="search" tabindex="-1"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' spellcheck="false" role="textbox" aria-autocomplete="list" />' + '</li>' ); this.$searchContainer = $search; this.$search = $search.find('input'); var $rendered = decorated.call(this); this._transferTabIndex(); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { self.$search.attr('aria-activedescendant', params.id); }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$searchContainer .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.$selection.find('.select2-selection__rendered') .append(this.$searchContainer); this.resizeSearch(); if (searchHadFocus) { var isTagInput = this.$element.find('[data-select2-tag]').length; if (isTagInput) { // fix IE11 bug where tag input lost focus this.$element.focus(); } else { this.$search.focus(); } } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = ''; if (this.$search.attr('placeholder') !== '') { width = this.$selection.find('.select2-selection__rendered').innerWidth(); } else { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting', 'clear', 'clearing' ]; var preventableEvents = [ 'opening', 'closing', 'selecting', 'unselecting', 'clearing' ]; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if ($.inArray(name, relayEvents) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if ($.inArray(name, preventableEvents) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03C9': '\u03C9', '\u03C2': '\u03C3' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ($(data.element).is('option')) { data.element.selected = true; this.$element.trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if ($.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ($(data.element).is('option')) { data.element.selected = false; this.$element.trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && $.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 Utils.RemoveData(this); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { var $option = $(this); if (!$option.is('option') && !$option.is('optgroup')) { return; } var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { Utils.appendMany(this.$element, $options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id !== undefined) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var $option = $(option); var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data Utils.StoreData(option, 'data', normalizedData); return $option; }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = Utils.GetData($option[0], 'data'); if (data != null) { return data; } if ($option.is('option')) { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if ($option.is('optgroup')) { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (item !== Object(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { var data = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if ($.inArray(item.id, existingIds) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); Utils.appendMany($option, $children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if ($.isFunction(this._request.abort)) { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !$.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property if ('status' in $request && ($request.status === 0 || $request.status === '0')) { return; } self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term != null) { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if ($.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var optionText = (option.text || '').toUpperCase(); var paramsTerm = (params.term || '').toUpperCase(); var checkText = optionText === paramsTerm; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', true); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { var term = $.trim(params.term); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var tag = this._lastTag; var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function createAndSelect (data) { // Normalize the data object so we can use it for checks var item = self._normalizeItem(data); // Check if the data object already exists as a tag // Select it if it doesn't var $existingOptions = self.$element.find('option').filter(function () { return $(this).val() === item.id; }); // If an existing option wasn't found for it, create the option if (!$existingOptions.length) { var $option = self.option(item); $option.attr('data-select2-tag', true); self._removeOldTags(); self.addOptions([$option]); } // Select the item, now that we know there is an option for it select(item); } function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, createAndSelect); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.focus(); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if ($.inArray(termChar, separators) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } decorated.call(self, params, callback); }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '<span class="select2-dropdown">' + '<span class="select2-results"></span>' + '</span>' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implmented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery', '../utils' ], function ($, Utils) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var $search = $( '<span class="select2-search select2-search--dropdown">' + '<input class="select2-search__field" type="search" tabindex="-1"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' spellcheck="false" role="textbox" />' + '</span>' ); this.$searchContainer = $search; this.$search = $search.find('input'); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.focus(); window.setTimeout(function () { self.$search.focus(); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.val(''); self.$search.blur(); }); container.on('focus', function () { if (!container.isOpen()) { self.$search.focus(); } }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer.removeClass('select2-search--hide'); } else { self.$searchContainer.addClass('select2-search--hide'); } } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', function () { var isLoadMoreVisible = $.contains( document.documentElement, self.$loadingMore[0] ); if (self.loading || !isLoadMoreVisible) { return; } var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var loadingMoreOffset = self.$loadingMore.offset().top + self.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { self.loadMore(); } }); }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '<li ' + 'class="select2-results__option select2-results__option--load-more"' + 'role="treeitem" aria-disabled="true"></li>' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = options.get('dropdownParent') || $(document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; var setupResultsEvents = false; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); if (!setupResultsEvents) { setupResultsEvents = true; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); } }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown.removeClass('select2'); $dropdown.addClass('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $('<span></span>'); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calciulating the offset var $offsetParent = this.$dropdownParent; // For statically positoned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = $offsetParent.offset(); css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - parentOffset.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.position = 'relative'; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ '../utils' ], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function (params) { self._handleSelectOnClose(params); }); }; SelectOnClose.prototype._handleSelectOnClose = function (_, params) { if (params && params.originalSelect2Event != null) { var event = params.originalSelect2Event; // Don't select an item if the close event was triggered from a select or // unselect event if (event._type === 'select' || event._type === 'unselect') { return; } } var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && originalEvent.ctrlKey) { return; } this.trigger('close', { originalEvent: originalEvent, originalSelect2Event: evt }); }; return CloseOnSelect; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; } }; }); S2.define('select2/defaults',[ 'jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en' ], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } if (options.query != null) { var Query = require(options.amdBase + 'compat/query'); options.dataAdapter = Utils.Decorate( options.dataAdapter, Query ); } if (options.initSelection != null) { var InitSelection = require(options.amdBase + 'compat/initSelection'); options.dataAdapter = Utils.Decorate( options.dataAdapter, InitSelection ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if ( options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null ) { var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if ( options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null ) { var ContainerCSS = require(options.amdBase + 'compat/containerCss'); options.selectionAdapter = Utils.Decorate( options.selectionAdapter, ContainerCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } if (typeof options.language === 'string') { // Check if the language is specified with a region if (options.language.indexOf('-') > 0) { // Extract the region information if it is included var languageParts = options.language.split('-'); var baseLanguage = languageParts[0]; options.language = [options.language, baseLanguage]; } else { options.language = [options.language]; } } if ($.isArray(options.language)) { var languages = new Translation(); options.language.push('en'); var languageNames = options.language; for (var l = 0; l < languageNames.length; l++) { var name = languageNames[l]; var language = {}; try { // Try to load it with the original name language = Translation.loadPath(name); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path name = this.defaults.amdLanguageBase + name; language = Translation.loadPath(name); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files. if (options.debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + name + '" could not be ' + 'automatically loaded. A fallback will be used instead.' ); } continue; } } languages.extend(language); } options.translations = languages; } else { var baseTranslation = Translation.loadPath( this.defaults.amdLanguageBase + 'en' ); var customTranslation = new Translation(options.language); customTranslation.extend(baseTranslation); options.translations = customTranslation; } return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if ($.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdBase: './', amdLanguageBase: './i18n/', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: EnglishTranslation, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'require', 'jquery', './defaults', './utils' ], function (require, $, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { var InputCompat = require(this.get('amdBase') + 'compat/inputData'); this.options.dataAdapter = Utils.Decorate( this.options.dataAdapter, InputCompat ); } } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.language == null) { if ($e.prop('lang')) { this.options.language = $e.prop('lang').toLowerCase(); } else if ($e.closest('[lang]').prop('lang')) { this.options.language = $e.closest('[lang]').prop('lang'); } } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); Utils.StoreData($e[0], 'tags', true); } if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, Utils.GetData($e[0])); } else { dataset = Utils.GetData($e[0]); } var data = $.extend(true, {}, dataset); data = Utils._convertData(data); for (var key in data) { if ($.inArray(key, excludedData) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if (Utils.GetData($element[0], 'select2') != null) { Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element.addClass('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); Utils.StoreData($element[0], 'select2', this); // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this.$element.on('focus.select2', function (evt) { self.trigger('focus', evt); }); this._syncA = Utils.bind(this._syncAttributes, this); this._syncS = Utils.bind(this._syncSubtree, this); if (this.$element[0].attachEvent) { this.$element[0].attachEvent('onpropertychange', this._syncA); } var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver ; if (observer != null) { this._observer = new observer(function (mutations) { $.each(mutations, self._syncA); $.each(mutations, self._syncS); }); this._observer.observe(this.$element[0], { attributes: true, childList: true, subtree: false }); } else if (this.$element[0].addEventListener) { this.$element[0].addEventListener( 'DOMAttrModified', self._syncA, false ); this.$element[0].addEventListener( 'DOMNodeInserted', self._syncS, false ); this.$element[0].addEventListener( 'DOMNodeRemoved', self._syncS, false ); } }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if ($.inArray(name, nonRelayEvents) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container.addClass('select2-container--open'); }); this.on('close', function () { self.$container.removeClass('select2-container--open'); }); this.on('enable', function () { self.$container.removeClass('select2-container--disabled'); }); this.on('disable', function () { self.$container.addClass('select2-container--disabled'); }); this.on('blur', function () { self.$container.removeClass('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { self.close(); evt.preventDefault(); } else if (key === KEYS.ENTER) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.options.get('disabled')) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; Select2.prototype._syncSubtree = function (evt, mutations) { var changed = false; var self = this; // Ignore any mutation events raised for elements that aren't options or // optgroups. This handles the case when the select element is destroyed if ( evt && evt.target && ( evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' ) ) { return; } if (!mutations) { // If mutation events aren't supported, then we can only assume that the // change affected the selections changed = true; } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { for (var n = 0; n < mutations.addedNodes.length; n++) { var node = mutations.addedNodes[n]; if (node.selected) { changed = true; } } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; } // Only re-pull the data if we think there is a change if (changed) { this.dataAdapter.current(function (currentData) { self.trigger('selection:update', { data: currentData }); }); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting', 'clear': 'clearing' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.options.get('disabled')) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function () { if (!this.isOpen()) { return; } this.trigger('close', {}); }; Select2.prototype.isOpen = function () { return this.$container.hasClass('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container.hasClass('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container.addClass('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if ($.isArray(newVal)) { newVal = $.map(newVal, function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('change'); }; Select2.prototype.destroy = function () { this.$container.remove(); if (this.$element[0].detachEvent) { this.$element[0].detachEvent('onpropertychange', this._syncA); } if (this._observer != null) { this._observer.disconnect(); this._observer = null; } else if (this.$element[0].removeEventListener) { this.$element[0] .removeEventListener('DOMAttrModified', this._syncA, false); this.$element[0] .removeEventListener('DOMNodeInserted', this._syncS, false); this.$element[0] .removeEventListener('DOMNodeRemoved', this._syncS, false); } this._syncA = null; this._syncS = null; this.$element.off('.select2'); this.$element.attr('tabindex', Utils.GetData(this.$element[0], 'old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '<span class="select2 select2-container">' + '<span class="selection"></span>' + '<span class="dropdown-wrapper" aria-hidden="true"></span>' + '</span>' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container.addClass('select2-container--' + this.options.get('theme')); Utils.StoreData($container[0], 'element', this.$element); return $container; }; return Select2; }); S2.define('select2/compat/utils',[ 'jquery' ], function ($) { function syncCssClasses ($dest, $src, adapter) { var classes, replacements = [], adapted; classes = $.trim($dest.attr('class')); if (classes) { classes = '' + classes; // for IE which returns object $(classes.split(/\s+/)).each(function () { // Save all Select2 classes if (this.indexOf('select2-') === 0) { replacements.push(this); } }); } classes = $.trim($src.attr('class')); if (classes) { classes = '' + classes; // for IE which returns object $(classes.split(/\s+/)).each(function () { // Only adapt non-Select2 classes if (this.indexOf('select2-') !== 0) { adapted = adapter(this); if (adapted != null) { replacements.push(adapted); } } }); } $dest.attr('class', replacements.join(' ')); } return { syncCssClasses: syncCssClasses }; }); S2.define('select2/compat/containerCss',[ 'jquery', './utils' ], function ($, CompatUtils) { // No-op CSS adapter that discards all classes by default function _containerAdapter (clazz) { return null; } function ContainerCSS () { } ContainerCSS.prototype.render = function (decorated) { var $container = decorated.call(this); var containerCssClass = this.options.get('containerCssClass') || ''; if ($.isFunction(containerCssClass)) { containerCssClass = containerCssClass(this.$element); } var containerCssAdapter = this.options.get('adaptContainerCssClass'); containerCssAdapter = containerCssAdapter || _containerAdapter; if (containerCssClass.indexOf(':all:') !== -1) { containerCssClass = containerCssClass.replace(':all:', ''); var _cssAdapter = containerCssAdapter; containerCssAdapter = function (clazz) { var adapted = _cssAdapter(clazz); if (adapted != null) { // Append the old one along with the adapted one return adapted + ' ' + clazz; } return clazz; }; } var containerCss = this.options.get('containerCss') || {}; if ($.isFunction(containerCss)) { containerCss = containerCss(this.$element); } CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); $container.css(containerCss); $container.addClass(containerCssClass); return $container; }; return ContainerCSS; }); S2.define('select2/compat/dropdownCss',[ 'jquery', './utils' ], function ($, CompatUtils) { // No-op CSS adapter that discards all classes by default function _dropdownAdapter (clazz) { return null; } function DropdownCSS () { } DropdownCSS.prototype.render = function (decorated) { var $dropdown = decorated.call(this); var dropdownCssClass = this.options.get('dropdownCssClass') || ''; if ($.isFunction(dropdownCssClass)) { dropdownCssClass = dropdownCssClass(this.$element); } var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; if (dropdownCssClass.indexOf(':all:') !== -1) { dropdownCssClass = dropdownCssClass.replace(':all:', ''); var _cssAdapter = dropdownCssAdapter; dropdownCssAdapter = function (clazz) { var adapted = _cssAdapter(clazz); if (adapted != null) { // Append the old one along with the adapted one return adapted + ' ' + clazz; } return clazz; }; } var dropdownCss = this.options.get('dropdownCss') || {}; if ($.isFunction(dropdownCss)) { dropdownCss = dropdownCss(this.$element); } CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); $dropdown.css(dropdownCss); $dropdown.addClass(dropdownCssClass); return $dropdown; }; return DropdownCSS; }); S2.define('select2/compat/initSelection',[ 'jquery' ], function ($) { function InitSelection (decorated, $element, options) { if (options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `initSelection` option has been deprecated in favor' + ' of a custom data adapter that overrides the `current` method. ' + 'This method is now called multiple times instead of a single ' + 'time when the instance is initialized. Support will be removed ' + 'for the `initSelection` option in future versions of Select2' ); } this.initSelection = options.get('initSelection'); this._isInitialized = false; decorated.call(this, $element, options); } InitSelection.prototype.current = function (decorated, callback) { var self = this; if (this._isInitialized) { decorated.call(this, callback); return; } this.initSelection.call(null, this.$element, function (data) { self._isInitialized = true; if (!$.isArray(data)) { data = [data]; } callback(data); }); }; return InitSelection; }); S2.define('select2/compat/inputData',[ 'jquery', '../utils' ], function ($, Utils) { function InputData (decorated, $element, options) { this._currentData = []; this._valueSeparator = options.get('valueSeparator') || ','; if ($element.prop('type') === 'hidden') { if (options.get('debug') && console && console.warn) { console.warn( 'Select2: Using a hidden input with Select2 is no longer ' + 'supported and may stop working in the future. It is recommended ' + 'to use a `<select>` element instead.' ); } } decorated.call(this, $element, options); } InputData.prototype.current = function (_, callback) { function getSelected (data, selectedIds) { var selected = []; if (data.selected || $.inArray(data.id, selectedIds) !== -1) { data.selected = true; selected.push(data); } else { data.selected = false; } if (data.children) { selected.push.apply(selected, getSelected(data.children, selectedIds)); } return selected; } var selected = []; for (var d = 0; d < this._currentData.length; d++) { var data = this._currentData[d]; selected.push.apply( selected, getSelected( data, this.$element.val().split( this._valueSeparator ) ) ); } callback(selected); }; InputData.prototype.select = function (_, data) { if (!this.options.get('multiple')) { this.current(function (allData) { $.map(allData, function (data) { data.selected = false; }); }); this.$element.val(data.id); this.$element.trigger('change'); } else { var value = this.$element.val(); value += this._valueSeparator + data.id; this.$element.val(value); this.$element.trigger('change'); } }; InputData.prototype.unselect = function (_, data) { var self = this; data.selected = false; this.current(function (allData) { var values = []; for (var d = 0; d < allData.length; d++) { var item = allData[d]; if (data.id == item.id) { continue; } values.push(item.id); } self.$element.val(values.join(self._valueSeparator)); self.$element.trigger('change'); }); }; InputData.prototype.query = function (_, params, callback) { var results = []; for (var d = 0; d < this._currentData.length; d++) { var data = this._currentData[d]; var matches = this.matches(params, data); if (matches !== null) { results.push(matches); } } callback({ results: results }); }; InputData.prototype.addOptions = function (_, $options) { var options = $.map($options, function ($option) { return Utils.GetData($option[0], 'data'); }); this._currentData.push.apply(this._currentData, options); }; return InputData; }); S2.define('select2/compat/matcher',[ 'jquery' ], function ($) { function oldMatcher (matcher) { function wrappedMatcher (params, data) { var match = $.extend(true, {}, data); if (params.term == null || $.trim(params.term) === '') { return match; } if (data.children) { for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; // Check if the child object matches // The old matcher returned a boolean true or false var doesMatch = matcher(params.term, child.text, child); // If the child didn't match, pop it off if (!doesMatch) { match.children.splice(c, 1); } } if (match.children.length > 0) { return match; } } if (matcher(params.term, data.text, data)) { return match; } return null; } return wrappedMatcher; } return oldMatcher; }); S2.define('select2/compat/query',[ ], function () { function Query (decorated, $element, options) { if (options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `query` option has been deprecated in favor of a ' + 'custom data adapter that overrides the `query` method. Support ' + 'will be removed for the `query` option in future versions of ' + 'Select2.' ); } decorated.call(this, $element, options); } Query.prototype.query = function (_, params, callback) { params.callback = callback; var query = this.options.get('query'); query.call(null, params); }; return Query; }); S2.define('select2/dropdown/attachContainer',[ ], function () { function AttachContainer (decorated, $element, options) { decorated.call(this, $element, options); } AttachContainer.prototype.position = function (decorated, $dropdown, $container) { var $dropdownContainer = $container.find('.dropdown-wrapper'); $dropdownContainer.append($dropdown); $dropdown.addClass('select2-dropdown--below'); $container.addClass('select2-container--below'); }; return AttachContainer; }); S2.define('select2/dropdown/stopPropagation',[ ], function () { function StopPropagation () { } StopPropagation.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); var stoppedEvents = [ 'blur', 'change', 'click', 'dblclick', 'focus', 'focusin', 'focusout', 'input', 'keydown', 'keyup', 'keypress', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseover', 'mouseup', 'search', 'touchend', 'touchstart' ]; this.$dropdown.on(stoppedEvents.join(' '), function (evt) { evt.stopPropagation(); }); }; return StopPropagation; }); S2.define('select2/selection/stopPropagation',[ ], function () { function StopPropagation () { } StopPropagation.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); var stoppedEvents = [ 'blur', 'change', 'click', 'dblclick', 'focus', 'focusin', 'focusout', 'input', 'keydown', 'keyup', 'keypress', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseover', 'mouseup', 'search', 'touchend', 'touchstart' ]; this.$selection.on(stoppedEvents.join(' '), function (evt) { evt.stopPropagation(); }); }; return StopPropagation; }); /*! * jQuery Mousewheel 3.1.13 * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license */ (function (factory) { if ( typeof S2.define === 'function' && S2.define.amd ) { // AMD. Register as an anonymous module. S2.define('jquery-mousewheel',['jquery'], factory); } else if (typeof exports === 'object') { // Node/CommonJS style for Browserify module.exports = factory; } else { // Browser globals factory(jQuery); } }(function ($) { var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], slice = Array.prototype.slice, nullLowestDeltaTimeout, lowestDelta; if ( $.event.fixHooks ) { for ( var i = toFix.length; i; ) { $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; } } var special = $.event.special.mousewheel = { version: '3.1.12', setup: function() { if ( this.addEventListener ) { for ( var i = toBind.length; i; ) { this.addEventListener( toBind[--i], handler, false ); } } else { this.onmousewheel = handler; } // Store the line height and page height for this particular element $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); }, teardown: function() { if ( this.removeEventListener ) { for ( var i = toBind.length; i; ) { this.removeEventListener( toBind[--i], handler, false ); } } else { this.onmousewheel = null; } // Clean up the data we added to the element $.removeData(this, 'mousewheel-line-height'); $.removeData(this, 'mousewheel-page-height'); }, getLineHeight: function(elem) { var $elem = $(elem), $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); if (!$parent.length) { $parent = $('body'); } return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; }, getPageHeight: function(elem) { return $(elem).height(); }, settings: { adjustOldDeltas: true, // see shouldAdjustOldDeltas() below normalizeOffset: true // calls getBoundingClientRect for each event } }; $.fn.extend({ mousewheel: function(fn) { return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); }, unmousewheel: function(fn) { return this.unbind('mousewheel', fn); } }); function handler(event) { var orgEvent = event || window.event, args = slice.call(arguments, 1), delta = 0, deltaX = 0, deltaY = 0, absDelta = 0, offsetX = 0, offsetY = 0; event = $.event.fix(orgEvent); event.type = 'mousewheel'; // Old school scrollwheel delta if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } // Firefox < 17 horizontal scrolling related to DOMMouseScroll event if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { deltaX = deltaY * -1; deltaY = 0; } // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy delta = deltaY === 0 ? deltaX : deltaY; // New school wheel delta (wheel event) if ( 'deltaY' in orgEvent ) { deltaY = orgEvent.deltaY * -1; delta = deltaY; } if ( 'deltaX' in orgEvent ) { deltaX = orgEvent.deltaX; if ( deltaY === 0 ) { delta = deltaX * -1; } } // No change actually happened, no reason to go any further if ( deltaY === 0 && deltaX === 0 ) { return; } // Need to convert lines and pages to pixels if we aren't already in pixels // There are three delta modes: // * deltaMode 0 is by pixels, nothing to do // * deltaMode 1 is by lines // * deltaMode 2 is by pages if ( orgEvent.deltaMode === 1 ) { var lineHeight = $.data(this, 'mousewheel-line-height'); delta *= lineHeight; deltaY *= lineHeight; deltaX *= lineHeight; } else if ( orgEvent.deltaMode === 2 ) { var pageHeight = $.data(this, 'mousewheel-page-height'); delta *= pageHeight; deltaY *= pageHeight; deltaX *= pageHeight; } // Store lowest absolute delta to normalize the delta values absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; // Adjust older deltas if necessary if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { lowestDelta /= 40; } } // Adjust older deltas if necessary if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { // Divide all the things by 40! delta /= 40; deltaX /= 40; deltaY /= 40; } // Get a whole, normalized value for the deltas delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); // Normalise offsetX and offsetY properties if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { var boundingRect = this.getBoundingClientRect(); offsetX = event.clientX - boundingRect.left; offsetY = event.clientY - boundingRect.top; } // Add information to the event object event.deltaX = deltaX; event.deltaY = deltaY; event.deltaFactor = lowestDelta; event.offsetX = offsetX; event.offsetY = offsetY; // Go ahead and set deltaMode to 0 since we converted to pixels // Although this is a little odd since we overwrite the deltaX/Y // properties with normalized deltas. event.deltaMode = 0; // Add event and delta to the front of the arguments args.unshift(event, delta, deltaX, deltaY); // Clearout lowestDelta after sometime to better // handle multiple device types that give different // a different lowestDelta // Ex: trackpad = 3 and mouse wheel = 120 if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); return ($.event.dispatch || $.event.handle).apply(this, args); } function nullLowestDelta() { lowestDelta = null; } function shouldAdjustOldDeltas(orgEvent, absDelta) { // If this is an older event and the delta is divisable by 120, // then we are assuming that the browser is treating this as an // older mouse wheel event and that we should divide the deltas // by 40 to try and get a more usable deltaFactor. // Side note, this actually impacts the reported scroll distance // in older browsers and can cause scrolling to be slower than native. // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; } })); S2.define('jquery.select2',[ 'jquery', 'jquery-mousewheel', './select2/core', './select2/defaults', './select2/utils' ], function ($, _, Select2, Defaults, Utils) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; $.fn.select2 = function (options) { options = options || {}; if (typeof options === 'object') { this.each(function () { var instanceOptions = $.extend(true, {}, options); var instance = new Select2($(this), instanceOptions); }); return this; } else if (typeof options === 'string') { var ret; var args = Array.prototype.slice.call(arguments, 1); this.each(function () { var instance = Utils.GetData(this, 'select2'); if (instance == null && window.console && console.error) { console.error( 'The select2(\'' + options + '\') method was called on an ' + 'element that is not using Select2.' ); } ret = instance[options].apply(instance, args); }); // Check if we should be returning `this` if ($.inArray(options, thisMethods) > -1) { return this; } return ret; } else { throw new Error('Invalid arguments for Select2: ' + options); } }; } if ($.fn.select2.defaults == null) { $.fn.select2.defaults = Defaults; } return Select2; }); // Return the AMD loader configuration so it can be used outside of this file return { define: S2.define, require: S2.require }; }()); // Autoload the jQuery bindings // We know that all of the modules exist above this, so we're safe var select2 = S2.require('jquery.select2'); // Hold the AMD module references on the jQuery function that was just loaded // This allows Select2 to use the internal loader outside of this file, such // as in the language files. jQuery.fn.select2.amd = S2; // Return the Select2 instance for anyone who is importing it. return select2; })); wizard/assets/select2/js/select2.min.js 0000644 00000262665 15154444756 0014044 0 ustar 00 (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else if(typeof module==="object"&&module.exports){module.exports=function(root,jQuery){if(jQuery===undefined){if(typeof window!=="undefined"){jQuery=require("jquery")}else{jQuery=require("jquery")(root)}}factory(jQuery);return jQuery}}else{factory(jQuery)}})(function(jQuery){var S2=function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd){var S2=jQuery.fn.select2.amd}var S2;(function(){if(!S2||!S2.requirejs){if(!S2){S2={}}else{require=S2}var requirejs,require,define;(function(undef){var main,req,makeMap,handlers,defined={},waiting={},config={},defining={},hasOwn=Object.prototype.hasOwnProperty,aps=[].slice,jsSuffixRegExp=/\.js$/;function hasProp(obj,prop){return hasOwn.call(obj,prop)}function normalize(name,baseName){var nameParts,nameSegment,mapValue,foundMap,lastIndex,foundI,foundStarMap,starI,i,j,part,normalizedBaseParts,baseParts=baseName&&baseName.split("/"),map=config.map,starMap=map&&map["*"]||{};if(name){name=name.split("/");lastIndex=name.length-1;if(config.nodeIdCompat&&jsSuffixRegExp.test(name[lastIndex])){name[lastIndex]=name[lastIndex].replace(jsSuffixRegExp,"")}if(name[0].charAt(0)==="."&&baseParts){normalizedBaseParts=baseParts.slice(0,baseParts.length-1);name=normalizedBaseParts.concat(name)}for(i=0;i<name.length;i++){part=name[i];if(part==="."){name.splice(i,1);i-=1}else if(part===".."){if(i===0||i===1&&name[2]===".."||name[i-1]===".."){continue}else if(i>0){name.splice(i-1,2);i-=2}}}name=name.join("/")}if((baseParts||starMap)&&map){nameParts=name.split("/");for(i=nameParts.length;i>0;i-=1){nameSegment=nameParts.slice(0,i).join("/");if(baseParts){for(j=baseParts.length;j>0;j-=1){mapValue=map[baseParts.slice(0,j).join("/")];if(mapValue){mapValue=mapValue[nameSegment];if(mapValue){foundMap=mapValue;foundI=i;break}}}}if(foundMap){break}if(!foundStarMap&&starMap&&starMap[nameSegment]){foundStarMap=starMap[nameSegment];starI=i}}if(!foundMap&&foundStarMap){foundMap=foundStarMap;foundI=starI}if(foundMap){nameParts.splice(0,foundI,foundMap);name=nameParts.join("/")}}return name}function makeRequire(relName,forceSync){return function(){var args=aps.call(arguments,0);if(typeof args[0]!=="string"&&args.length===1){args.push(null)}return req.apply(undef,args.concat([relName,forceSync]))}}function makeNormalize(relName){return function(name){return normalize(name,relName)}}function makeLoad(depName){return function(value){defined[depName]=value}}function callDep(name){if(hasProp(waiting,name)){var args=waiting[name];delete waiting[name];defining[name]=true;main.apply(undef,args)}if(!hasProp(defined,name)&&!hasProp(defining,name)){throw new Error("No "+name)}return defined[name]}function splitPrefix(name){var prefix,index=name?name.indexOf("!"):-1;if(index>-1){prefix=name.substring(0,index);name=name.substring(index+1,name.length)}return[prefix,name]}function makeRelParts(relName){return relName?splitPrefix(relName):[]}makeMap=function(name,relParts){var plugin,parts=splitPrefix(name),prefix=parts[0],relResourceName=relParts[1];name=parts[1];if(prefix){prefix=normalize(prefix,relResourceName);plugin=callDep(prefix)}if(prefix){if(plugin&&plugin.normalize){name=plugin.normalize(name,makeNormalize(relResourceName))}else{name=normalize(name,relResourceName)}}else{name=normalize(name,relResourceName);parts=splitPrefix(name);prefix=parts[0];name=parts[1];if(prefix){plugin=callDep(prefix)}}return{f:prefix?prefix+"!"+name:name,n:name,pr:prefix,p:plugin}};function makeConfig(name){return function(){return config&&config.config&&config.config[name]||{}}}handlers={require:function(name){return makeRequire(name)},exports:function(name){var e=defined[name];if(typeof e!=="undefined"){return e}else{return defined[name]={}}},module:function(name){return{id:name,uri:"",exports:defined[name],config:makeConfig(name)}}};main=function(name,deps,callback,relName){var cjsModule,depName,ret,map,i,relParts,args=[],callbackType=typeof callback,usingExports;relName=relName||name;relParts=makeRelParts(relName);if(callbackType==="undefined"||callbackType==="function"){deps=!deps.length&&callback.length?["require","exports","module"]:deps;for(i=0;i<deps.length;i+=1){map=makeMap(deps[i],relParts);depName=map.f;if(depName==="require"){args[i]=handlers.require(name)}else if(depName==="exports"){args[i]=handlers.exports(name);usingExports=true}else if(depName==="module"){cjsModule=args[i]=handlers.module(name)}else if(hasProp(defined,depName)||hasProp(waiting,depName)||hasProp(defining,depName)){args[i]=callDep(depName)}else if(map.p){map.p.load(map.n,makeRequire(relName,true),makeLoad(depName),{});args[i]=defined[depName]}else{throw new Error(name+" missing "+depName)}}ret=callback?callback.apply(defined[name],args):undefined;if(name){if(cjsModule&&cjsModule.exports!==undef&&cjsModule.exports!==defined[name]){defined[name]=cjsModule.exports}else if(ret!==undef||!usingExports){defined[name]=ret}}}else if(name){defined[name]=callback}};requirejs=require=req=function(deps,callback,relName,forceSync,alt){if(typeof deps==="string"){if(handlers[deps]){return handlers[deps](callback)}return callDep(makeMap(deps,makeRelParts(callback)).f)}else if(!deps.splice){config=deps;if(config.deps){req(config.deps,config.callback)}if(!callback){return}if(callback.splice){deps=callback;callback=relName;relName=null}else{deps=undef}}callback=callback||function(){};if(typeof relName==="function"){relName=forceSync;forceSync=alt}if(forceSync){main(undef,deps,callback,relName)}else{setTimeout(function(){main(undef,deps,callback,relName)},4)}return req};req.config=function(cfg){return req(cfg)};requirejs._defined=defined;define=function(name,deps,callback){if(typeof name!=="string"){throw new Error("See almond README: incorrect module build, no module name")}if(!deps.splice){callback=deps;deps=[]}if(!hasProp(defined,name)&&!hasProp(waiting,name)){waiting[name]=[name,deps,callback]}};define.amd={jQuery:true}})();S2.requirejs=requirejs;S2.require=require;S2.define=define}})();S2.define("almond",function(){});S2.define("jquery",[],function(){var _$=jQuery||$;if(_$==null&&console&&console.error){console.error("Select2: An instance of jQuery or a jQuery-compatible library was not "+"found. Make sure that you are including jQuery before Select2 on your "+"web page.")}return _$});S2.define("select2/utils",["jquery"],function($){var Utils={};Utils.Extend=function(ChildClass,SuperClass){var __hasProp={}.hasOwnProperty;function BaseConstructor(){this.constructor=ChildClass}for(var key in SuperClass){if(__hasProp.call(SuperClass,key)){ChildClass[key]=SuperClass[key]}}BaseConstructor.prototype=SuperClass.prototype;ChildClass.prototype=new BaseConstructor;ChildClass.__super__=SuperClass.prototype;return ChildClass};function getMethods(theClass){var proto=theClass.prototype;var methods=[];for(var methodName in proto){var m=proto[methodName];if(typeof m!=="function"){continue}if(methodName==="constructor"){continue}methods.push(methodName)}return methods}Utils.Decorate=function(SuperClass,DecoratorClass){var decoratedMethods=getMethods(DecoratorClass);var superMethods=getMethods(SuperClass);function DecoratedClass(){var unshift=Array.prototype.unshift;var argCount=DecoratorClass.prototype.constructor.length;var calledConstructor=SuperClass.prototype.constructor;if(argCount>0){unshift.call(arguments,SuperClass.prototype.constructor);calledConstructor=DecoratorClass.prototype.constructor}calledConstructor.apply(this,arguments)}DecoratorClass.displayName=SuperClass.displayName;function ctr(){this.constructor=DecoratedClass}DecoratedClass.prototype=new ctr;for(var m=0;m<superMethods.length;m++){var superMethod=superMethods[m];DecoratedClass.prototype[superMethod]=SuperClass.prototype[superMethod]}var calledMethod=function(methodName){var originalMethod=function(){};if(methodName in DecoratedClass.prototype){originalMethod=DecoratedClass.prototype[methodName]}var decoratedMethod=DecoratorClass.prototype[methodName];return function(){var unshift=Array.prototype.unshift;unshift.call(arguments,originalMethod);return decoratedMethod.apply(this,arguments)}};for(var d=0;d<decoratedMethods.length;d++){var decoratedMethod=decoratedMethods[d];DecoratedClass.prototype[decoratedMethod]=calledMethod(decoratedMethod)}return DecoratedClass};var Observable=function(){this.listeners={}};Observable.prototype.on=function(event,callback){this.listeners=this.listeners||{};if(event in this.listeners){this.listeners[event].push(callback)}else{this.listeners[event]=[callback]}};Observable.prototype.trigger=function(event){var slice=Array.prototype.slice;var params=slice.call(arguments,1);this.listeners=this.listeners||{};if(params==null){params=[]}if(params.length===0){params.push({})}params[0]._type=event;if(event in this.listeners){this.invoke(this.listeners[event],slice.call(arguments,1))}if("*"in this.listeners){this.invoke(this.listeners["*"],arguments)}};Observable.prototype.invoke=function(listeners,params){for(var i=0,len=listeners.length;i<len;i++){listeners[i].apply(this,params)}};Utils.Observable=Observable;Utils.generateChars=function(length){var chars="";for(var i=0;i<length;i++){var randomChar=Math.floor(Math.random()*36);chars+=randomChar.toString(36)}return chars};Utils.bind=function(func,context){return function(){func.apply(context,arguments)}};Utils._convertData=function(data){for(var originalKey in data){var keys=originalKey.split("-");var dataLevel=data;if(keys.length===1){continue}for(var k=0;k<keys.length;k++){var key=keys[k];key=key.substring(0,1).toLowerCase()+key.substring(1);if(!(key in dataLevel)){dataLevel[key]={}}if(k==keys.length-1){dataLevel[key]=data[originalKey]}dataLevel=dataLevel[key]}delete data[originalKey]}return data};Utils.hasScroll=function(index,el){var $el=$(el);var overflowX=el.style.overflowX;var overflowY=el.style.overflowY;if(overflowX===overflowY&&(overflowY==="hidden"||overflowY==="visible")){return false}if(overflowX==="scroll"||overflowY==="scroll"){return true}return $el.innerHeight()<el.scrollHeight||$el.innerWidth()<el.scrollWidth};Utils.escapeMarkup=function(markup){var replaceMap={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};if(typeof markup!=="string"){return markup}return String(markup).replace(/[&<>"'\/\\]/g,function(match){return replaceMap[match]})};Utils.appendMany=function($element,$nodes){if($.fn.jquery.substr(0,3)==="1.7"){var $jqNodes=$();$.map($nodes,function(node){$jqNodes=$jqNodes.add(node)});$nodes=$jqNodes}$element.append($nodes)};Utils.__cache={};var id=0;Utils.GetUniqueElementId=function(element){var select2Id=element.getAttribute("data-select2-id");if(select2Id==null){if(element.id){select2Id=element.id;element.setAttribute("data-select2-id",select2Id)}else{element.setAttribute("data-select2-id",++id);select2Id=id.toString()}}return select2Id};Utils.StoreData=function(element,name,value){var id=Utils.GetUniqueElementId(element);if(!Utils.__cache[id]){Utils.__cache[id]={}}Utils.__cache[id][name]=value};Utils.GetData=function(element,name){var id=Utils.GetUniqueElementId(element);if(name){if(Utils.__cache[id]){return Utils.__cache[id][name]!=null?Utils.__cache[id][name]:$(element).data(name)}return $(element).data(name)}else{return Utils.__cache[id]}};Utils.RemoveData=function(element){var id=Utils.GetUniqueElementId(element);if(Utils.__cache[id]!=null){delete Utils.__cache[id]}};return Utils});S2.define("select2/results",["jquery","./utils"],function($,Utils){function Results($element,options,dataAdapter){this.$element=$element;this.data=dataAdapter;this.options=options;Results.__super__.constructor.call(this)}Utils.Extend(Results,Utils.Observable);Results.prototype.render=function(){var $results=$('<ul class="select2-results__options" role="tree"></ul>');if(this.options.get("multiple")){$results.attr("aria-multiselectable","true")}this.$results=$results;return $results};Results.prototype.clear=function(){this.$results.empty()};Results.prototype.displayMessage=function(params){var escapeMarkup=this.options.get("escapeMarkup");this.clear();this.hideLoading();var $message=$('<li role="treeitem" aria-live="assertive"'+' class="select2-results__option"></li>');var message=this.options.get("translations").get(params.message);$message.append(escapeMarkup(message(params.args)));$message[0].className+=" select2-results__message";this.$results.append($message)};Results.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()};Results.prototype.append=function(data){this.hideLoading();var $options=[];if(data.results==null||data.results.length===0){if(this.$results.children().length===0){this.trigger("results:message",{message:"noResults"})}return}data.results=this.sort(data.results);for(var d=0;d<data.results.length;d++){var item=data.results[d];var $option=this.option(item);$options.push($option)}this.$results.append($options)};Results.prototype.position=function($results,$dropdown){var $resultsContainer=$dropdown.find(".select2-results");$resultsContainer.append($results)};Results.prototype.sort=function(data){var sorter=this.options.get("sorter");return sorter(data)};Results.prototype.highlightFirstItem=function(){var $options=this.$results.find(".select2-results__option[aria-selected]");var $selected=$options.filter("[aria-selected=true]");if($selected.length>0){$selected.first().trigger("mouseenter")}else{$options.first().trigger("mouseenter")}this.ensureHighlightVisible()};Results.prototype.setClasses=function(){var self=this;this.data.current(function(selected){var selectedIds=$.map(selected,function(s){return s.id.toString()});var $options=self.$results.find(".select2-results__option[aria-selected]");$options.each(function(){var $option=$(this);var item=Utils.GetData(this,"data");var id=""+item.id;if(item.element!=null&&item.element.selected||item.element==null&&$.inArray(id,selectedIds)>-1){$option.attr("aria-selected","true")}else{$option.attr("aria-selected","false")}})})};Results.prototype.showLoading=function(params){this.hideLoading();var loadingMore=this.options.get("translations").get("searching");var loading={disabled:true,loading:true,text:loadingMore(params)};var $loading=this.option(loading);$loading.className+=" loading-results";this.$results.prepend($loading)};Results.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()};Results.prototype.option=function(data){var option=document.createElement("li");option.className="select2-results__option";var attrs={role:"treeitem","aria-selected":"false"};if(data.disabled){delete attrs["aria-selected"];attrs["aria-disabled"]="true"}if(data.id==null){delete attrs["aria-selected"]}if(data._resultId!=null){option.id=data._resultId}if(data.title){option.title=data.title}if(data.children){attrs.role="group";attrs["aria-label"]=data.text;delete attrs["aria-selected"]}for(var attr in attrs){var val=attrs[attr];option.setAttribute(attr,val)}if(data.children){var $option=$(option);var label=document.createElement("strong");label.className="select2-results__group";var $label=$(label);this.template(data,label);var $children=[];for(var c=0;c<data.children.length;c++){var child=data.children[c];var $child=this.option(child);$children.push($child)}var $childrenContainer=$("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});$childrenContainer.append($children);$option.append(label);$option.append($childrenContainer)}else{this.template(data,option)}Utils.StoreData(option,"data",data);return option};Results.prototype.bind=function(container,$container){var self=this;var id=container.id+"-results";this.$results.attr("id",id);container.on("results:all",function(params){self.clear();self.append(params.data);if(container.isOpen()){self.setClasses();self.highlightFirstItem()}});container.on("results:append",function(params){self.append(params.data);if(container.isOpen()){self.setClasses()}});container.on("query",function(params){self.hideMessages();self.showLoading(params)});container.on("select",function(){if(!container.isOpen()){return}self.setClasses();self.highlightFirstItem()});container.on("unselect",function(){if(!container.isOpen()){return}self.setClasses();self.highlightFirstItem()});container.on("open",function(){self.$results.attr("aria-expanded","true");self.$results.attr("aria-hidden","false");self.setClasses();self.ensureHighlightVisible()});container.on("close",function(){self.$results.attr("aria-expanded","false");self.$results.attr("aria-hidden","true");self.$results.removeAttr("aria-activedescendant")});container.on("results:toggle",function(){var $highlighted=self.getHighlightedResults();if($highlighted.length===0){return}$highlighted.trigger("mouseup")});container.on("results:select",function(){var $highlighted=self.getHighlightedResults();if($highlighted.length===0){return}var data=Utils.GetData($highlighted[0],"data");if($highlighted.attr("aria-selected")=="true"){self.trigger("close",{})}else{self.trigger("select",{data:data})}});container.on("results:previous",function(){var $highlighted=self.getHighlightedResults();var $options=self.$results.find("[aria-selected]");var currentIndex=$options.index($highlighted);if(currentIndex<=0){return}var nextIndex=currentIndex-1;if($highlighted.length===0){nextIndex=0}var $next=$options.eq(nextIndex);$next.trigger("mouseenter");var currentOffset=self.$results.offset().top;var nextTop=$next.offset().top;var nextOffset=self.$results.scrollTop()+(nextTop-currentOffset);if(nextIndex===0){self.$results.scrollTop(0)}else if(nextTop-currentOffset<0){self.$results.scrollTop(nextOffset)}});container.on("results:next",function(){var $highlighted=self.getHighlightedResults();var $options=self.$results.find("[aria-selected]");var currentIndex=$options.index($highlighted);var nextIndex=currentIndex+1;if(nextIndex>=$options.length){return}var $next=$options.eq(nextIndex);$next.trigger("mouseenter");var currentOffset=self.$results.offset().top+self.$results.outerHeight(false);var nextBottom=$next.offset().top+$next.outerHeight(false);var nextOffset=self.$results.scrollTop()+nextBottom-currentOffset;if(nextIndex===0){self.$results.scrollTop(0)}else if(nextBottom>currentOffset){self.$results.scrollTop(nextOffset)}});container.on("results:focus",function(params){params.element.addClass("select2-results__option--highlighted")});container.on("results:message",function(params){self.displayMessage(params)});if($.fn.mousewheel){this.$results.on("mousewheel",function(e){var top=self.$results.scrollTop();var bottom=self.$results.get(0).scrollHeight-top+e.deltaY;var isAtTop=e.deltaY>0&&top-e.deltaY<=0;var isAtBottom=e.deltaY<0&&bottom<=self.$results.height();if(isAtTop){self.$results.scrollTop(0);e.preventDefault();e.stopPropagation()}else if(isAtBottom){self.$results.scrollTop(self.$results.get(0).scrollHeight-self.$results.height());e.preventDefault();e.stopPropagation()}})}this.$results.on("mouseup",".select2-results__option[aria-selected]",function(evt){var $this=$(this);var data=Utils.GetData(this,"data");if($this.attr("aria-selected")==="true"){if(self.options.get("multiple")){self.trigger("unselect",{originalEvent:evt,data:data})}else{self.trigger("close",{})}return}self.trigger("select",{originalEvent:evt,data:data})});this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(evt){var data=Utils.GetData(this,"data");self.getHighlightedResults().removeClass("select2-results__option--highlighted");self.trigger("results:focus",{data:data,element:$(this)})})};Results.prototype.getHighlightedResults=function(){var $highlighted=this.$results.find(".select2-results__option--highlighted");return $highlighted};Results.prototype.destroy=function(){this.$results.remove()};Results.prototype.ensureHighlightVisible=function(){var $highlighted=this.getHighlightedResults();if($highlighted.length===0){return}var $options=this.$results.find("[aria-selected]");var currentIndex=$options.index($highlighted);var currentOffset=this.$results.offset().top;var nextTop=$highlighted.offset().top;var nextOffset=this.$results.scrollTop()+(nextTop-currentOffset);var offsetDelta=nextTop-currentOffset;nextOffset-=$highlighted.outerHeight(false)*2;if(currentIndex<=2){this.$results.scrollTop(0)}else if(offsetDelta>this.$results.outerHeight()||offsetDelta<0){this.$results.scrollTop(nextOffset)}};Results.prototype.template=function(result,container){var template=this.options.get("templateResult");var escapeMarkup=this.options.get("escapeMarkup");var content=template(result,container);if(content==null){container.style.display="none"}else if(typeof content==="string"){container.innerHTML=escapeMarkup(content)}else{$(container).append(content)}};return Results});S2.define("select2/keys",[],function(){var KEYS={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return KEYS});S2.define("select2/selection/base",["jquery","../utils","../keys"],function($,Utils,KEYS){function BaseSelection($element,options){this.$element=$element;this.options=options;BaseSelection.__super__.constructor.call(this)}Utils.Extend(BaseSelection,Utils.Observable);BaseSelection.prototype.render=function(){var $selection=$('<span class="select2-selection" role="combobox" '+' aria-haspopup="true" aria-expanded="false">'+"</span>");this._tabindex=0;if(Utils.GetData(this.$element[0],"old-tabindex")!=null){this._tabindex=Utils.GetData(this.$element[0],"old-tabindex")}else if(this.$element.attr("tabindex")!=null){this._tabindex=this.$element.attr("tabindex")}$selection.attr("title",this.$element.attr("title"));$selection.attr("tabindex",this._tabindex);this.$selection=$selection;return $selection};BaseSelection.prototype.bind=function(container,$container){var self=this;var id=container.id+"-container";var resultsId=container.id+"-results";this.container=container;this.$selection.on("focus",function(evt){self.trigger("focus",evt)});this.$selection.on("blur",function(evt){self._handleBlur(evt)});this.$selection.on("keydown",function(evt){self.trigger("keypress",evt);if(evt.which===KEYS.SPACE){evt.preventDefault()}});container.on("results:focus",function(params){self.$selection.attr("aria-activedescendant",params.data._resultId)});container.on("selection:update",function(params){self.update(params.data)});container.on("open",function(){self.$selection.attr("aria-expanded","true");self.$selection.attr("aria-owns",resultsId);self._attachCloseHandler(container)});container.on("close",function(){self.$selection.attr("aria-expanded","false");self.$selection.removeAttr("aria-activedescendant");self.$selection.removeAttr("aria-owns");self.$selection.focus();window.setTimeout(function(){self.$selection.focus()},0);self._detachCloseHandler(container)});container.on("enable",function(){self.$selection.attr("tabindex",self._tabindex)});container.on("disable",function(){self.$selection.attr("tabindex","-1")})};BaseSelection.prototype._handleBlur=function(evt){var self=this;window.setTimeout(function(){if(document.activeElement==self.$selection[0]||$.contains(self.$selection[0],document.activeElement)){return}self.trigger("blur",evt)},1)};BaseSelection.prototype._attachCloseHandler=function(container){var self=this;$(document.body).on("mousedown.select2."+container.id,function(e){var $target=$(e.target);var $select=$target.closest(".select2");var $all=$(".select2.select2-container--open");$all.each(function(){var $this=$(this);if(this==$select[0]){return}var $element=Utils.GetData(this,"element");$element.select2("close")})})};BaseSelection.prototype._detachCloseHandler=function(container){$(document.body).off("mousedown.select2."+container.id)};BaseSelection.prototype.position=function($selection,$container){var $selectionContainer=$container.find(".selection");$selectionContainer.append($selection)};BaseSelection.prototype.destroy=function(){this._detachCloseHandler(this.container)};BaseSelection.prototype.update=function(data){throw new Error("The `update` method must be defined in child classes.")};return BaseSelection});S2.define("select2/selection/single",["jquery","./base","../utils","../keys"],function($,BaseSelection,Utils,KEYS){function SingleSelection(){SingleSelection.__super__.constructor.apply(this,arguments)}Utils.Extend(SingleSelection,BaseSelection);SingleSelection.prototype.render=function(){var $selection=SingleSelection.__super__.render.call(this);$selection.addClass("select2-selection--single");$selection.html('<span class="select2-selection__rendered"></span>'+'<span class="select2-selection__arrow" role="presentation">'+'<b role="presentation"></b>'+"</span>");return $selection};SingleSelection.prototype.bind=function(container,$container){var self=this;SingleSelection.__super__.bind.apply(this,arguments);var id=container.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",id).attr("role","textbox").attr("aria-readonly","true");this.$selection.attr("aria-labelledby",id);this.$selection.on("mousedown",function(evt){if(evt.which!==1){return}self.trigger("toggle",{originalEvent:evt})});this.$selection.on("focus",function(evt){});this.$selection.on("blur",function(evt){});container.on("focus",function(evt){if(!container.isOpen()){self.$selection.focus()}})};SingleSelection.prototype.clear=function(){var $rendered=this.$selection.find(".select2-selection__rendered");$rendered.empty();$rendered.removeAttr("title")};SingleSelection.prototype.display=function(data,container){var template=this.options.get("templateSelection");var escapeMarkup=this.options.get("escapeMarkup");return escapeMarkup(template(data,container))};SingleSelection.prototype.selectionContainer=function(){return $("<span></span>")};SingleSelection.prototype.update=function(data){if(data.length===0){this.clear();return}var selection=data[0];var $rendered=this.$selection.find(".select2-selection__rendered");var formatted=this.display(selection,$rendered);$rendered.empty().append(formatted);$rendered.attr("title",selection.title||selection.text)};return SingleSelection});S2.define("select2/selection/multiple",["jquery","./base","../utils"],function($,BaseSelection,Utils){function MultipleSelection($element,options){MultipleSelection.__super__.constructor.apply(this,arguments)}Utils.Extend(MultipleSelection,BaseSelection);MultipleSelection.prototype.render=function(){var $selection=MultipleSelection.__super__.render.call(this);$selection.addClass("select2-selection--multiple");$selection.html('<ul class="select2-selection__rendered"></ul>');return $selection};MultipleSelection.prototype.bind=function(container,$container){var self=this;MultipleSelection.__super__.bind.apply(this,arguments);this.$selection.on("click",function(evt){self.trigger("toggle",{originalEvent:evt})});this.$selection.on("click",".select2-selection__choice__remove",function(evt){if(self.options.get("disabled")){return}var $remove=$(this);var $selection=$remove.parent();var data=Utils.GetData($selection[0],"data");self.trigger("unselect",{originalEvent:evt,data:data})})};MultipleSelection.prototype.clear=function(){var $rendered=this.$selection.find(".select2-selection__rendered");$rendered.empty();$rendered.removeAttr("title")};MultipleSelection.prototype.display=function(data,container){var template=this.options.get("templateSelection");var escapeMarkup=this.options.get("escapeMarkup");return escapeMarkup(template(data,container))};MultipleSelection.prototype.selectionContainer=function(){var $container=$('<li class="select2-selection__choice">'+'<span class="select2-selection__choice__remove" role="presentation">'+"×"+"</span>"+"</li>");return $container};MultipleSelection.prototype.update=function(data){this.clear();if(data.length===0){return}var $selections=[];for(var d=0;d<data.length;d++){var selection=data[d];var $selection=this.selectionContainer();var formatted=this.display(selection,$selection);$selection.append(formatted);$selection.attr("title",selection.title||selection.text);Utils.StoreData($selection[0],"data",selection);$selections.push($selection)}var $rendered=this.$selection.find(".select2-selection__rendered");Utils.appendMany($rendered,$selections)};return MultipleSelection});S2.define("select2/selection/placeholder",["../utils"],function(Utils){function Placeholder(decorated,$element,options){this.placeholder=this.normalizePlaceholder(options.get("placeholder"));decorated.call(this,$element,options)}Placeholder.prototype.normalizePlaceholder=function(_,placeholder){if(typeof placeholder==="string"){placeholder={id:"",text:placeholder}}return placeholder};Placeholder.prototype.createPlaceholder=function(decorated,placeholder){var $placeholder=this.selectionContainer();$placeholder.html(this.display(placeholder));$placeholder.addClass("select2-selection__placeholder").removeClass("select2-selection__choice");return $placeholder};Placeholder.prototype.update=function(decorated,data){var singlePlaceholder=data.length==1&&data[0].id!=this.placeholder.id;var multipleSelections=data.length>1;if(multipleSelections||singlePlaceholder){return decorated.call(this,data)}this.clear();var $placeholder=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append($placeholder)};return Placeholder});S2.define("select2/selection/allowClear",["jquery","../keys","../utils"],function($,KEYS,Utils){function AllowClear(){}AllowClear.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);if(this.placeholder==null){if(this.options.get("debug")&&window.console&&console.error){console.error("Select2: The `allowClear` option should be used in combination "+"with the `placeholder` option.")}}this.$selection.on("mousedown",".select2-selection__clear",function(evt){self._handleClear(evt)});container.on("keypress",function(evt){self._handleKeyboardClear(evt,container)})};AllowClear.prototype._handleClear=function(_,evt){if(this.options.get("disabled")){return}var $clear=this.$selection.find(".select2-selection__clear");if($clear.length===0){return}evt.stopPropagation();var data=Utils.GetData($clear[0],"data");var previousVal=this.$element.val();this.$element.val(this.placeholder.id);var unselectData={data:data};this.trigger("clear",unselectData);if(unselectData.prevented){this.$element.val(previousVal);return}for(var d=0;d<data.length;d++){unselectData={data:data[d]};this.trigger("unselect",unselectData);if(unselectData.prevented){this.$element.val(previousVal);return}}this.$element.trigger("change");this.trigger("toggle",{})};AllowClear.prototype._handleKeyboardClear=function(_,evt,container){if(container.isOpen()){return}if(evt.which==KEYS.DELETE||evt.which==KEYS.BACKSPACE){this._handleClear(evt)}};AllowClear.prototype.update=function(decorated,data){decorated.call(this,data);if(this.$selection.find(".select2-selection__placeholder").length>0||data.length===0){return}var $remove=$('<span class="select2-selection__clear">'+"×"+"</span>");Utils.StoreData($remove[0],"data",data);this.$selection.find(".select2-selection__rendered").prepend($remove)};return AllowClear});S2.define("select2/selection/search",["jquery","../utils","../keys"],function($,Utils,KEYS){function Search(decorated,$element,options){decorated.call(this,$element,options)}Search.prototype.render=function(decorated){var $search=$('<li class="select2-search select2-search--inline">'+'<input class="select2-search__field" type="search" tabindex="-1"'+' autocomplete="off" autocorrect="off" autocapitalize="none"'+' spellcheck="false" role="textbox" aria-autocomplete="list" />'+"</li>");this.$searchContainer=$search;this.$search=$search.find("input");var $rendered=decorated.call(this);this._transferTabIndex();return $rendered};Search.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("open",function(){self.$search.trigger("focus")});container.on("close",function(){self.$search.val("");self.$search.removeAttr("aria-activedescendant");self.$search.trigger("focus")});container.on("enable",function(){self.$search.prop("disabled",false);self._transferTabIndex()});container.on("disable",function(){self.$search.prop("disabled",true)});container.on("focus",function(evt){self.$search.trigger("focus")});container.on("results:focus",function(params){self.$search.attr("aria-activedescendant",params.id)});this.$selection.on("focusin",".select2-search--inline",function(evt){self.trigger("focus",evt)});this.$selection.on("focusout",".select2-search--inline",function(evt){self._handleBlur(evt)});this.$selection.on("keydown",".select2-search--inline",function(evt){evt.stopPropagation();self.trigger("keypress",evt);self._keyUpPrevented=evt.isDefaultPrevented();var key=evt.which;if(key===KEYS.BACKSPACE&&self.$search.val()===""){var $previousChoice=self.$searchContainer.prev(".select2-selection__choice");if($previousChoice.length>0){var item=Utils.GetData($previousChoice[0],"data");self.searchRemoveChoice(item);evt.preventDefault()}}});var msie=document.documentMode;var disableInputEvents=msie&&msie<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(evt){if(disableInputEvents){self.$selection.off("input.search input.searchcheck");return}self.$selection.off("keyup.search")});this.$selection.on("keyup.search input.search",".select2-search--inline",function(evt){if(disableInputEvents&&evt.type==="input"){self.$selection.off("input.search input.searchcheck");return}var key=evt.which;if(key==KEYS.SHIFT||key==KEYS.CTRL||key==KEYS.ALT){return}if(key==KEYS.TAB){return}self.handleSearch(evt)})};Search.prototype._transferTabIndex=function(decorated){this.$search.attr("tabindex",this.$selection.attr("tabindex"));this.$selection.attr("tabindex","-1")};Search.prototype.createPlaceholder=function(decorated,placeholder){this.$search.attr("placeholder",placeholder.text)};Search.prototype.update=function(decorated,data){var searchHadFocus=this.$search[0]==document.activeElement;this.$search.attr("placeholder","");decorated.call(this,data);this.$selection.find(".select2-selection__rendered").append(this.$searchContainer);this.resizeSearch();if(searchHadFocus){var isTagInput=this.$element.find("[data-select2-tag]").length;if(isTagInput){this.$element.focus()}else{this.$search.focus()}}};Search.prototype.handleSearch=function(){this.resizeSearch();if(!this._keyUpPrevented){var input=this.$search.val();this.trigger("query",{term:input})}this._keyUpPrevented=false};Search.prototype.searchRemoveChoice=function(decorated,item){this.trigger("unselect",{data:item});this.$search.val(item.text);this.handleSearch()};Search.prototype.resizeSearch=function(){this.$search.css("width","25px");var width="";if(this.$search.attr("placeholder")!==""){width=this.$selection.find(".select2-selection__rendered").innerWidth()}else{var minimumWidth=this.$search.val().length+1;width=minimumWidth*.75+"em"}this.$search.css("width",width)};return Search});S2.define("select2/selection/eventRelay",["jquery"],function($){function EventRelay(){}EventRelay.prototype.bind=function(decorated,container,$container){var self=this;var relayEvents=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"];var preventableEvents=["opening","closing","selecting","unselecting","clearing"];decorated.call(this,container,$container);container.on("*",function(name,params){if($.inArray(name,relayEvents)===-1){return}params=params||{};var evt=$.Event("select2:"+name,{params:params});self.$element.trigger(evt);if($.inArray(name,preventableEvents)===-1){return}params.prevented=evt.isDefaultPrevented()})};return EventRelay});S2.define("select2/translation",["jquery","require"],function($,require){function Translation(dict){this.dict=dict||{}}Translation.prototype.all=function(){return this.dict};Translation.prototype.get=function(key){return this.dict[key]};Translation.prototype.extend=function(translation){this.dict=$.extend({},translation.all(),this.dict)};Translation._cache={};Translation.loadPath=function(path){if(!(path in Translation._cache)){var translations=require(path);Translation._cache[path]=translations}return new Translation(Translation._cache[path])};return Translation});S2.define("select2/diacritics",[],function(){var diacritics={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return diacritics});S2.define("select2/data/base",["../utils"],function(Utils){function BaseAdapter($element,options){BaseAdapter.__super__.constructor.call(this)}Utils.Extend(BaseAdapter,Utils.Observable);BaseAdapter.prototype.current=function(callback){throw new Error("The `current` method must be defined in child classes.")};BaseAdapter.prototype.query=function(params,callback){throw new Error("The `query` method must be defined in child classes.")};BaseAdapter.prototype.bind=function(container,$container){};BaseAdapter.prototype.destroy=function(){};BaseAdapter.prototype.generateResultId=function(container,data){var id=container.id+"-result-";id+=Utils.generateChars(4);if(data.id!=null){id+="-"+data.id.toString()}else{id+="-"+Utils.generateChars(4)}return id};return BaseAdapter});S2.define("select2/data/select",["./base","../utils","jquery"],function(BaseAdapter,Utils,$){function SelectAdapter($element,options){this.$element=$element;this.options=options;SelectAdapter.__super__.constructor.call(this)}Utils.Extend(SelectAdapter,BaseAdapter);SelectAdapter.prototype.current=function(callback){var data=[];var self=this;this.$element.find(":selected").each(function(){var $option=$(this);var option=self.item($option);data.push(option)});callback(data)};SelectAdapter.prototype.select=function(data){var self=this;data.selected=true;if($(data.element).is("option")){data.element.selected=true;this.$element.trigger("change");return}if(this.$element.prop("multiple")){this.current(function(currentData){var val=[];data=[data];data.push.apply(data,currentData);for(var d=0;d<data.length;d++){var id=data[d].id;if($.inArray(id,val)===-1){val.push(id)}}self.$element.val(val);self.$element.trigger("change")})}else{var val=data.id;this.$element.val(val);this.$element.trigger("change")}};SelectAdapter.prototype.unselect=function(data){var self=this;if(!this.$element.prop("multiple")){return}data.selected=false;if($(data.element).is("option")){data.element.selected=false;this.$element.trigger("change");return}this.current(function(currentData){var val=[];for(var d=0;d<currentData.length;d++){var id=currentData[d].id;if(id!==data.id&&$.inArray(id,val)===-1){val.push(id)}}self.$element.val(val);self.$element.trigger("change")})};SelectAdapter.prototype.bind=function(container,$container){var self=this;this.container=container;container.on("select",function(params){self.select(params.data)});container.on("unselect",function(params){self.unselect(params.data)})};SelectAdapter.prototype.destroy=function(){this.$element.find("*").each(function(){Utils.RemoveData(this)})};SelectAdapter.prototype.query=function(params,callback){var data=[];var self=this;var $options=this.$element.children();$options.each(function(){var $option=$(this);if(!$option.is("option")&&!$option.is("optgroup")){return}var option=self.item($option);var matches=self.matches(params,option);if(matches!==null){data.push(matches)}});callback({results:data})};SelectAdapter.prototype.addOptions=function($options){Utils.appendMany(this.$element,$options)};SelectAdapter.prototype.option=function(data){var option;if(data.children){option=document.createElement("optgroup");option.label=data.text}else{option=document.createElement("option");if(option.textContent!==undefined){option.textContent=data.text}else{option.innerText=data.text}}if(data.id!==undefined){option.value=data.id}if(data.disabled){option.disabled=true}if(data.selected){option.selected=true}if(data.title){option.title=data.title}var $option=$(option);var normalizedData=this._normalizeItem(data);normalizedData.element=option;Utils.StoreData(option,"data",normalizedData);return $option};SelectAdapter.prototype.item=function($option){var data={};data=Utils.GetData($option[0],"data");if(data!=null){return data}if($option.is("option")){data={id:$option.val(),text:$option.text(),disabled:$option.prop("disabled"),selected:$option.prop("selected"),title:$option.prop("title")}}else if($option.is("optgroup")){data={text:$option.prop("label"),children:[],title:$option.prop("title")};var $children=$option.children("option");var children=[];for(var c=0;c<$children.length;c++){var $child=$($children[c]);var child=this.item($child);children.push(child)}data.children=children}data=this._normalizeItem(data);data.element=$option[0];Utils.StoreData($option[0],"data",data);return data};SelectAdapter.prototype._normalizeItem=function(item){if(item!==Object(item)){item={id:item,text:item}}item=$.extend({},{text:""},item);var defaults={selected:false,disabled:false};if(item.id!=null){item.id=item.id.toString()}if(item.text!=null){item.text=item.text.toString()}if(item._resultId==null&&item.id&&this.container!=null){item._resultId=this.generateResultId(this.container,item)}return $.extend({},defaults,item)};SelectAdapter.prototype.matches=function(params,data){var matcher=this.options.get("matcher");return matcher(params,data)};return SelectAdapter});S2.define("select2/data/array",["./select","../utils","jquery"],function(SelectAdapter,Utils,$){function ArrayAdapter($element,options){var data=options.get("data")||[];ArrayAdapter.__super__.constructor.call(this,$element,options);this.addOptions(this.convertToOptions(data))}Utils.Extend(ArrayAdapter,SelectAdapter);ArrayAdapter.prototype.select=function(data){var $option=this.$element.find("option").filter(function(i,elm){return elm.value==data.id.toString()});if($option.length===0){$option=this.option(data);this.addOptions($option)}ArrayAdapter.__super__.select.call(this,data)};ArrayAdapter.prototype.convertToOptions=function(data){var self=this;var $existing=this.$element.find("option");var existingIds=$existing.map(function(){return self.item($(this)).id}).get();var $options=[];function onlyItem(item){return function(){return $(this).val()==item.id}}for(var d=0;d<data.length;d++){var item=this._normalizeItem(data[d]);if($.inArray(item.id,existingIds)>=0){var $existingOption=$existing.filter(onlyItem(item));var existingData=this.item($existingOption);var newData=$.extend(true,{},item,existingData);var $newOption=this.option(newData);$existingOption.replaceWith($newOption);continue}var $option=this.option(item);if(item.children){var $children=this.convertToOptions(item.children);Utils.appendMany($option,$children)}$options.push($option)}return $options};return ArrayAdapter});S2.define("select2/data/ajax",["./array","../utils","jquery"],function(ArrayAdapter,Utils,$){function AjaxAdapter($element,options){this.ajaxOptions=this._applyDefaults(options.get("ajax"));if(this.ajaxOptions.processResults!=null){this.processResults=this.ajaxOptions.processResults}AjaxAdapter.__super__.constructor.call(this,$element,options)}Utils.Extend(AjaxAdapter,ArrayAdapter);AjaxAdapter.prototype._applyDefaults=function(options){var defaults={data:function(params){return $.extend({},params,{q:params.term})},transport:function(params,success,failure){var $request=$.ajax(params);$request.then(success);$request.fail(failure);return $request}};return $.extend({},defaults,options,true)};AjaxAdapter.prototype.processResults=function(results){return results};AjaxAdapter.prototype.query=function(params,callback){var matches=[];var self=this;if(this._request!=null){if($.isFunction(this._request.abort)){this._request.abort()}this._request=null}var options=$.extend({type:"GET"},this.ajaxOptions);if(typeof options.url==="function"){options.url=options.url.call(this.$element,params)}if(typeof options.data==="function"){options.data=options.data.call(this.$element,params)}function request(){var $request=options.transport(options,function(data){var results=self.processResults(data,params);if(self.options.get("debug")&&window.console&&console.error){if(!results||!results.results||!$.isArray(results.results)){console.error("Select2: The AJAX results did not return an array in the "+"`results` key of the response.")}}callback(results)},function(){if("status"in $request&&($request.status===0||$request.status==="0")){return}self.trigger("results:message",{message:"errorLoading"})});self._request=$request}if(this.ajaxOptions.delay&¶ms.term!=null){if(this._queryTimeout){window.clearTimeout(this._queryTimeout)}this._queryTimeout=window.setTimeout(request,this.ajaxOptions.delay)}else{request()}};return AjaxAdapter});S2.define("select2/data/tags",["jquery"],function($){function Tags(decorated,$element,options){var tags=options.get("tags");var createTag=options.get("createTag");if(createTag!==undefined){this.createTag=createTag}var insertTag=options.get("insertTag");if(insertTag!==undefined){this.insertTag=insertTag}decorated.call(this,$element,options);if($.isArray(tags)){for(var t=0;t<tags.length;t++){var tag=tags[t];var item=this._normalizeItem(tag);var $option=this.option(item);this.$element.append($option)}}}Tags.prototype.query=function(decorated,params,callback){var self=this;this._removeOldTags();if(params.term==null||params.page!=null){decorated.call(this,params,callback);return}function wrapper(obj,child){var data=obj.results;for(var i=0;i<data.length;i++){var option=data[i];var checkChildren=option.children!=null&&!wrapper({results:option.children},true);var optionText=(option.text||"").toUpperCase();var paramsTerm=(params.term||"").toUpperCase();var checkText=optionText===paramsTerm;if(checkText||checkChildren){if(child){return false}obj.data=data;callback(obj);return}}if(child){return true}var tag=self.createTag(params);if(tag!=null){var $option=self.option(tag);$option.attr("data-select2-tag",true);self.addOptions([$option]);self.insertTag(data,tag)}obj.results=data;callback(obj)}decorated.call(this,params,wrapper)};Tags.prototype.createTag=function(decorated,params){var term=$.trim(params.term);if(term===""){return null}return{id:term,text:term}};Tags.prototype.insertTag=function(_,data,tag){data.unshift(tag)};Tags.prototype._removeOldTags=function(_){var tag=this._lastTag;var $options=this.$element.find("option[data-select2-tag]");$options.each(function(){if(this.selected){return}$(this).remove()})};return Tags});S2.define("select2/data/tokenizer",["jquery"],function($){function Tokenizer(decorated,$element,options){var tokenizer=options.get("tokenizer");if(tokenizer!==undefined){this.tokenizer=tokenizer}decorated.call(this,$element,options)}Tokenizer.prototype.bind=function(decorated,container,$container){decorated.call(this,container,$container);this.$search=container.dropdown.$search||container.selection.$search||$container.find(".select2-search__field")};Tokenizer.prototype.query=function(decorated,params,callback){var self=this;function createAndSelect(data){var item=self._normalizeItem(data);var $existingOptions=self.$element.find("option").filter(function(){return $(this).val()===item.id});if(!$existingOptions.length){var $option=self.option(item);$option.attr("data-select2-tag",true);self._removeOldTags();self.addOptions([$option])}select(item)}function select(data){self.trigger("select",{data:data})}params.term=params.term||"";var tokenData=this.tokenizer(params,this.options,createAndSelect);if(tokenData.term!==params.term){if(this.$search.length){this.$search.val(tokenData.term);this.$search.focus()}params.term=tokenData.term}decorated.call(this,params,callback)};Tokenizer.prototype.tokenizer=function(_,params,options,callback){var separators=options.get("tokenSeparators")||[];var term=params.term;var i=0;var createTag=this.createTag||function(params){return{id:params.term,text:params.term}};while(i<term.length){var termChar=term[i];if($.inArray(termChar,separators)===-1){i++;continue}var part=term.substr(0,i);var partParams=$.extend({},params,{term:part});var data=createTag(partParams);if(data==null){i++;continue}callback(data);term=term.substr(i+1)||"";i=0}return{term:term}};return Tokenizer});S2.define("select2/data/minimumInputLength",[],function(){function MinimumInputLength(decorated,$e,options){this.minimumInputLength=options.get("minimumInputLength");decorated.call(this,$e,options)}MinimumInputLength.prototype.query=function(decorated,params,callback){params.term=params.term||"";if(params.term.length<this.minimumInputLength){this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:params.term,params:params}});return}decorated.call(this,params,callback)};return MinimumInputLength});S2.define("select2/data/maximumInputLength",[],function(){function MaximumInputLength(decorated,$e,options){this.maximumInputLength=options.get("maximumInputLength");decorated.call(this,$e,options)}MaximumInputLength.prototype.query=function(decorated,params,callback){params.term=params.term||"";if(this.maximumInputLength>0&¶ms.term.length>this.maximumInputLength){this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:params.term,params:params}});return}decorated.call(this,params,callback)};return MaximumInputLength});S2.define("select2/data/maximumSelectionLength",[],function(){function MaximumSelectionLength(decorated,$e,options){this.maximumSelectionLength=options.get("maximumSelectionLength");decorated.call(this,$e,options)}MaximumSelectionLength.prototype.query=function(decorated,params,callback){var self=this;this.current(function(currentData){var count=currentData!=null?currentData.length:0;if(self.maximumSelectionLength>0&&count>=self.maximumSelectionLength){self.trigger("results:message",{message:"maximumSelected",args:{maximum:self.maximumSelectionLength}});return}decorated.call(self,params,callback)})};return MaximumSelectionLength});S2.define("select2/dropdown",["jquery","./utils"],function($,Utils){function Dropdown($element,options){this.$element=$element;this.options=options;Dropdown.__super__.constructor.call(this)}Utils.Extend(Dropdown,Utils.Observable);Dropdown.prototype.render=function(){var $dropdown=$('<span class="select2-dropdown">'+'<span class="select2-results"></span>'+"</span>");$dropdown.attr("dir",this.options.get("dir"));this.$dropdown=$dropdown;return $dropdown};Dropdown.prototype.bind=function(){};Dropdown.prototype.position=function($dropdown,$container){};Dropdown.prototype.destroy=function(){this.$dropdown.remove()};return Dropdown});S2.define("select2/dropdown/search",["jquery","../utils"],function($,Utils){function Search(){}Search.prototype.render=function(decorated){var $rendered=decorated.call(this);var $search=$('<span class="select2-search select2-search--dropdown">'+'<input class="select2-search__field" type="search" tabindex="-1"'+' autocomplete="off" autocorrect="off" autocapitalize="none"'+' spellcheck="false" role="textbox" />'+"</span>");this.$searchContainer=$search;this.$search=$search.find("input");$rendered.prepend($search);return $rendered};Search.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);this.$search.on("keydown",function(evt){self.trigger("keypress",evt);self._keyUpPrevented=evt.isDefaultPrevented()});this.$search.on("input",function(evt){$(this).off("keyup")});this.$search.on("keyup input",function(evt){self.handleSearch(evt)});container.on("open",function(){self.$search.attr("tabindex",0);self.$search.focus();window.setTimeout(function(){self.$search.focus()},0)});container.on("close",function(){self.$search.attr("tabindex",-1);self.$search.val("");self.$search.blur()});container.on("focus",function(){if(!container.isOpen()){self.$search.focus()}});container.on("results:all",function(params){if(params.query.term==null||params.query.term===""){var showSearch=self.showSearch(params);if(showSearch){self.$searchContainer.removeClass("select2-search--hide")}else{self.$searchContainer.addClass("select2-search--hide")}}})};Search.prototype.handleSearch=function(evt){if(!this._keyUpPrevented){var input=this.$search.val();this.trigger("query",{term:input})}this._keyUpPrevented=false};Search.prototype.showSearch=function(_,params){return true};return Search});S2.define("select2/dropdown/hidePlaceholder",[],function(){function HidePlaceholder(decorated,$element,options,dataAdapter){this.placeholder=this.normalizePlaceholder(options.get("placeholder"));decorated.call(this,$element,options,dataAdapter)}HidePlaceholder.prototype.append=function(decorated,data){data.results=this.removePlaceholder(data.results);decorated.call(this,data)};HidePlaceholder.prototype.normalizePlaceholder=function(_,placeholder){if(typeof placeholder==="string"){placeholder={id:"",text:placeholder}}return placeholder};HidePlaceholder.prototype.removePlaceholder=function(_,data){var modifiedData=data.slice(0);for(var d=data.length-1;d>=0;d--){var item=data[d];if(this.placeholder.id===item.id){modifiedData.splice(d,1)}}return modifiedData};return HidePlaceholder});S2.define("select2/dropdown/infiniteScroll",["jquery"],function($){function InfiniteScroll(decorated,$element,options,dataAdapter){this.lastParams={};decorated.call(this,$element,options,dataAdapter);this.$loadingMore=this.createLoadingMore();this.loading=false}InfiniteScroll.prototype.append=function(decorated,data){this.$loadingMore.remove();this.loading=false;decorated.call(this,data);if(this.showLoadingMore(data)){this.$results.append(this.$loadingMore)}};InfiniteScroll.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("query",function(params){self.lastParams=params;self.loading=true});container.on("query:append",function(params){self.lastParams=params;self.loading=true});this.$results.on("scroll",function(){var isLoadMoreVisible=$.contains(document.documentElement,self.$loadingMore[0]);if(self.loading||!isLoadMoreVisible){return}var currentOffset=self.$results.offset().top+self.$results.outerHeight(false);var loadingMoreOffset=self.$loadingMore.offset().top+self.$loadingMore.outerHeight(false);if(currentOffset+50>=loadingMoreOffset){self.loadMore()}})};InfiniteScroll.prototype.loadMore=function(){this.loading=true;var params=$.extend({},{page:1},this.lastParams);params.page++;this.trigger("query:append",params)};InfiniteScroll.prototype.showLoadingMore=function(_,data){return data.pagination&&data.pagination.more};InfiniteScroll.prototype.createLoadingMore=function(){var $option=$("<li "+'class="select2-results__option select2-results__option--load-more"'+'role="treeitem" aria-disabled="true"></li>');var message=this.options.get("translations").get("loadingMore");$option.html(message(this.lastParams));return $option};return InfiniteScroll});S2.define("select2/dropdown/attachBody",["jquery","../utils"],function($,Utils){function AttachBody(decorated,$element,options){this.$dropdownParent=options.get("dropdownParent")||$(document.body);decorated.call(this,$element,options)}AttachBody.prototype.bind=function(decorated,container,$container){var self=this;var setupResultsEvents=false;decorated.call(this,container,$container);container.on("open",function(){self._showDropdown();self._attachPositioningHandler(container);if(!setupResultsEvents){setupResultsEvents=true;container.on("results:all",function(){self._positionDropdown();self._resizeDropdown()});container.on("results:append",function(){self._positionDropdown();self._resizeDropdown()})}});container.on("close",function(){self._hideDropdown();self._detachPositioningHandler(container)});this.$dropdownContainer.on("mousedown",function(evt){evt.stopPropagation()})};AttachBody.prototype.destroy=function(decorated){decorated.call(this);this.$dropdownContainer.remove()};AttachBody.prototype.position=function(decorated,$dropdown,$container){$dropdown.attr("class",$container.attr("class"));$dropdown.removeClass("select2");$dropdown.addClass("select2-container--open");$dropdown.css({position:"absolute",top:-999999});this.$container=$container};AttachBody.prototype.render=function(decorated){var $container=$("<span></span>");var $dropdown=decorated.call(this);$container.append($dropdown);this.$dropdownContainer=$container;return $container};AttachBody.prototype._hideDropdown=function(decorated){this.$dropdownContainer.detach()};AttachBody.prototype._attachPositioningHandler=function(decorated,container){var self=this;var scrollEvent="scroll.select2."+container.id;var resizeEvent="resize.select2."+container.id;var orientationEvent="orientationchange.select2."+container.id;var $watchers=this.$container.parents().filter(Utils.hasScroll);$watchers.each(function(){Utils.StoreData(this,"select2-scroll-position",{x:$(this).scrollLeft(),y:$(this).scrollTop()})});$watchers.on(scrollEvent,function(ev){var position=Utils.GetData(this,"select2-scroll-position");$(this).scrollTop(position.y)});$(window).on(scrollEvent+" "+resizeEvent+" "+orientationEvent,function(e){self._positionDropdown();self._resizeDropdown()})};AttachBody.prototype._detachPositioningHandler=function(decorated,container){var scrollEvent="scroll.select2."+container.id;var resizeEvent="resize.select2."+container.id;var orientationEvent="orientationchange.select2."+container.id;var $watchers=this.$container.parents().filter(Utils.hasScroll);$watchers.off(scrollEvent);$(window).off(scrollEvent+" "+resizeEvent+" "+orientationEvent)};AttachBody.prototype._positionDropdown=function(){var $window=$(window);var isCurrentlyAbove=this.$dropdown.hasClass("select2-dropdown--above");var isCurrentlyBelow=this.$dropdown.hasClass("select2-dropdown--below");var newDirection=null;var offset=this.$container.offset();offset.bottom=offset.top+this.$container.outerHeight(false);var container={height:this.$container.outerHeight(false)};container.top=offset.top;container.bottom=offset.top+container.height;var dropdown={height:this.$dropdown.outerHeight(false)};var viewport={top:$window.scrollTop(),bottom:$window.scrollTop()+$window.height()};var enoughRoomAbove=viewport.top<offset.top-dropdown.height;var enoughRoomBelow=viewport.bottom>offset.bottom+dropdown.height;var css={left:offset.left,top:container.bottom};var $offsetParent=this.$dropdownParent;if($offsetParent.css("position")==="static"){$offsetParent=$offsetParent.offsetParent()}var parentOffset=$offsetParent.offset();css.top-=parentOffset.top;css.left-=parentOffset.left;if(!isCurrentlyAbove&&!isCurrentlyBelow){newDirection="below"}if(!enoughRoomBelow&&enoughRoomAbove&&!isCurrentlyAbove){newDirection="above"}else if(!enoughRoomAbove&&enoughRoomBelow&&isCurrentlyAbove){newDirection="below"}if(newDirection=="above"||isCurrentlyAbove&&newDirection!=="below"){css.top=container.top-parentOffset.top-dropdown.height}if(newDirection!=null){this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+newDirection);this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+newDirection)}this.$dropdownContainer.css(css)};AttachBody.prototype._resizeDropdown=function(){var css={width:this.$container.outerWidth(false)+"px"};if(this.options.get("dropdownAutoWidth")){css.minWidth=css.width;css.position="relative";css.width="auto"}this.$dropdown.css(css)};AttachBody.prototype._showDropdown=function(decorated){this.$dropdownContainer.appendTo(this.$dropdownParent);this._positionDropdown();this._resizeDropdown()};return AttachBody});S2.define("select2/dropdown/minimumResultsForSearch",[],function(){function countResults(data){var count=0;for(var d=0;d<data.length;d++){var item=data[d];if(item.children){count+=countResults(item.children)}else{count++}}return count}function MinimumResultsForSearch(decorated,$element,options,dataAdapter){this.minimumResultsForSearch=options.get("minimumResultsForSearch");if(this.minimumResultsForSearch<0){this.minimumResultsForSearch=Infinity}decorated.call(this,$element,options,dataAdapter)}MinimumResultsForSearch.prototype.showSearch=function(decorated,params){if(countResults(params.data.results)<this.minimumResultsForSearch){return false}return decorated.call(this,params)};return MinimumResultsForSearch});S2.define("select2/dropdown/selectOnClose",["../utils"],function(Utils){function SelectOnClose(){}SelectOnClose.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("close",function(params){self._handleSelectOnClose(params)})};SelectOnClose.prototype._handleSelectOnClose=function(_,params){if(params&¶ms.originalSelect2Event!=null){var event=params.originalSelect2Event;if(event._type==="select"||event._type==="unselect"){return}}var $highlightedResults=this.getHighlightedResults();if($highlightedResults.length<1){return}var data=Utils.GetData($highlightedResults[0],"data");if(data.element!=null&&data.element.selected||data.element==null&&data.selected){return}this.trigger("select",{data:data})};return SelectOnClose});S2.define("select2/dropdown/closeOnSelect",[],function(){function CloseOnSelect(){}CloseOnSelect.prototype.bind=function(decorated,container,$container){var self=this;decorated.call(this,container,$container);container.on("select",function(evt){self._selectTriggered(evt)});container.on("unselect",function(evt){self._selectTriggered(evt)})};CloseOnSelect.prototype._selectTriggered=function(_,evt){var originalEvent=evt.originalEvent;if(originalEvent&&originalEvent.ctrlKey){return}this.trigger("close",{originalEvent:originalEvent,originalSelect2Event:evt})};return CloseOnSelect});S2.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(args){var overChars=args.input.length-args.maximum;var message="Please delete "+overChars+" character";if(overChars!=1){message+="s"}return message},inputTooShort:function(args){var remainingChars=args.minimum-args.input.length;var message="Please enter "+remainingChars+" or more characters";return message},loadingMore:function(){return"Loading more results…"},maximumSelected:function(args){var message="You can only select "+args.maximum+" item";if(args.maximum!=1){message+="s"}return message},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}});S2.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function($,require,ResultsList,SingleSelection,MultipleSelection,Placeholder,AllowClear,SelectionSearch,EventRelay,Utils,Translation,DIACRITICS,SelectData,ArrayData,AjaxData,Tags,Tokenizer,MinimumInputLength,MaximumInputLength,MaximumSelectionLength,Dropdown,DropdownSearch,HidePlaceholder,InfiniteScroll,AttachBody,MinimumResultsForSearch,SelectOnClose,CloseOnSelect,EnglishTranslation){function Defaults(){this.reset()}Defaults.prototype.apply=function(options){options=$.extend(true,{},this.defaults,options);if(options.dataAdapter==null){if(options.ajax!=null){options.dataAdapter=AjaxData}else if(options.data!=null){options.dataAdapter=ArrayData}else{options.dataAdapter=SelectData}if(options.minimumInputLength>0){options.dataAdapter=Utils.Decorate(options.dataAdapter,MinimumInputLength)}if(options.maximumInputLength>0){options.dataAdapter=Utils.Decorate(options.dataAdapter,MaximumInputLength)}if(options.maximumSelectionLength>0){options.dataAdapter=Utils.Decorate(options.dataAdapter,MaximumSelectionLength)}if(options.tags){options.dataAdapter=Utils.Decorate(options.dataAdapter,Tags)}if(options.tokenSeparators!=null||options.tokenizer!=null){options.dataAdapter=Utils.Decorate(options.dataAdapter,Tokenizer)}if(options.query!=null){var Query=require(options.amdBase+"compat/query");options.dataAdapter=Utils.Decorate(options.dataAdapter,Query)}if(options.initSelection!=null){var InitSelection=require(options.amdBase+"compat/initSelection");options.dataAdapter=Utils.Decorate(options.dataAdapter,InitSelection)}}if(options.resultsAdapter==null){options.resultsAdapter=ResultsList;if(options.ajax!=null){options.resultsAdapter=Utils.Decorate(options.resultsAdapter,InfiniteScroll)}if(options.placeholder!=null){options.resultsAdapter=Utils.Decorate(options.resultsAdapter,HidePlaceholder)}if(options.selectOnClose){options.resultsAdapter=Utils.Decorate(options.resultsAdapter,SelectOnClose)}}if(options.dropdownAdapter==null){if(options.multiple){options.dropdownAdapter=Dropdown}else{var SearchableDropdown=Utils.Decorate(Dropdown,DropdownSearch);options.dropdownAdapter=SearchableDropdown}if(options.minimumResultsForSearch!==0){options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,MinimumResultsForSearch)}if(options.closeOnSelect){options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,CloseOnSelect)}if(options.dropdownCssClass!=null||options.dropdownCss!=null||options.adaptDropdownCssClass!=null){var DropdownCSS=require(options.amdBase+"compat/dropdownCss");options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,DropdownCSS)}options.dropdownAdapter=Utils.Decorate(options.dropdownAdapter,AttachBody)}if(options.selectionAdapter==null){if(options.multiple){options.selectionAdapter=MultipleSelection}else{options.selectionAdapter=SingleSelection}if(options.placeholder!=null){options.selectionAdapter=Utils.Decorate(options.selectionAdapter,Placeholder)}if(options.allowClear){options.selectionAdapter=Utils.Decorate(options.selectionAdapter,AllowClear)}if(options.multiple){options.selectionAdapter=Utils.Decorate(options.selectionAdapter,SelectionSearch)}if(options.containerCssClass!=null||options.containerCss!=null||options.adaptContainerCssClass!=null){var ContainerCSS=require(options.amdBase+"compat/containerCss");options.selectionAdapter=Utils.Decorate(options.selectionAdapter,ContainerCSS)}options.selectionAdapter=Utils.Decorate(options.selectionAdapter,EventRelay)}if(typeof options.language==="string"){if(options.language.indexOf("-")>0){var languageParts=options.language.split("-");var baseLanguage=languageParts[0];options.language=[options.language,baseLanguage]}else{options.language=[options.language]}}if($.isArray(options.language)){var languages=new Translation;options.language.push("en");var languageNames=options.language;for(var l=0;l<languageNames.length;l++){var name=languageNames[l];var language={};try{language=Translation.loadPath(name)}catch(e){try{name=this.defaults.amdLanguageBase+name;language=Translation.loadPath(name)}catch(ex){if(options.debug&&window.console&&console.warn){console.warn('Select2: The language file for "'+name+'" could not be '+"automatically loaded. A fallback will be used instead.")}continue}}languages.extend(language)}options.translations=languages}else{var baseTranslation=Translation.loadPath(this.defaults.amdLanguageBase+"en");var customTranslation=new Translation(options.language);customTranslation.extend(baseTranslation);options.translations=customTranslation}return options};Defaults.prototype.reset=function(){function stripDiacritics(text){function match(a){return DIACRITICS[a]||a}return text.replace(/[^\u0000-\u007E]/g,match)}function matcher(params,data){if($.trim(params.term)===""){return data}if(data.children&&data.children.length>0){var match=$.extend(true,{},data);for(var c=data.children.length-1;c>=0;c--){var child=data.children[c];var matches=matcher(params,child);if(matches==null){match.children.splice(c,1)}}if(match.children.length>0){return match}return matcher(params,match)}var original=stripDiacritics(data.text).toUpperCase();var term=stripDiacritics(params.term).toUpperCase();if(original.indexOf(term)>-1){return data}return null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:true,debug:false,dropdownAutoWidth:false,escapeMarkup:Utils.escapeMarkup,language:EnglishTranslation,matcher:matcher,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:false,sorter:function(data){return data},templateResult:function(result){return result.text},templateSelection:function(selection){return selection.text},theme:"default",width:"resolve"}};Defaults.prototype.set=function(key,value){var camelKey=$.camelCase(key);var data={};data[camelKey]=value;var convertedData=Utils._convertData(data);$.extend(true,this.defaults,convertedData)};var defaults=new Defaults;return defaults});S2.define("select2/options",["require","jquery","./defaults","./utils"],function(require,$,Defaults,Utils){function Options(options,$element){this.options=options;if($element!=null){this.fromElement($element)}this.options=Defaults.apply(this.options);if($element&&$element.is("input")){var InputCompat=require(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=Utils.Decorate(this.options.dataAdapter,InputCompat)}}Options.prototype.fromElement=function($e){var excludedData=["select2"];if(this.options.multiple==null){this.options.multiple=$e.prop("multiple")}if(this.options.disabled==null){this.options.disabled=$e.prop("disabled")}if(this.options.language==null){if($e.prop("lang")){this.options.language=$e.prop("lang").toLowerCase()}else if($e.closest("[lang]").prop("lang")){this.options.language=$e.closest("[lang]").prop("lang")}}if(this.options.dir==null){if($e.prop("dir")){this.options.dir=$e.prop("dir")}else if($e.closest("[dir]").prop("dir")){this.options.dir=$e.closest("[dir]").prop("dir")}else{this.options.dir="ltr"}}$e.prop("disabled",this.options.disabled);$e.prop("multiple",this.options.multiple);if(Utils.GetData($e[0],"select2Tags")){if(this.options.debug&&window.console&&console.warn){console.warn("Select2: The `data-select2-tags` attribute has been changed to "+'use the `data-data` and `data-tags="true"` attributes and will be '+"removed in future versions of Select2.")}Utils.StoreData($e[0],"data",Utils.GetData($e[0],"select2Tags"));Utils.StoreData($e[0],"tags",true)}if(Utils.GetData($e[0],"ajaxUrl")){if(this.options.debug&&window.console&&console.warn){console.warn("Select2: The `data-ajax-url` attribute has been changed to "+"`data-ajax--url` and support for the old attribute will be removed"+" in future versions of Select2.")}$e.attr("ajax--url",Utils.GetData($e[0],"ajaxUrl"));Utils.StoreData($e[0],"ajax-Url",Utils.GetData($e[0],"ajaxUrl"))}var dataset={};if($.fn.jquery&&$.fn.jquery.substr(0,2)=="1."&&$e[0].dataset){dataset=$.extend(true,{},$e[0].dataset,Utils.GetData($e[0]))}else{dataset=Utils.GetData($e[0])}var data=$.extend(true,{},dataset);data=Utils._convertData(data);for(var key in data){if($.inArray(key,excludedData)>-1){continue}if($.isPlainObject(this.options[key])){$.extend(this.options[key],data[key])}else{this.options[key]=data[key]}}return this};Options.prototype.get=function(key){return this.options[key]};Options.prototype.set=function(key,val){this.options[key]=val};return Options});S2.define("select2/core",["jquery","./options","./utils","./keys"],function($,Options,Utils,KEYS){var Select2=function($element,options){if(Utils.GetData($element[0],"select2")!=null){Utils.GetData($element[0],"select2").destroy()}this.$element=$element;this.id=this._generateId($element);options=options||{};this.options=new Options(options,$element);Select2.__super__.constructor.call(this);var tabindex=$element.attr("tabindex")||0;Utils.StoreData($element[0],"old-tabindex",tabindex);$element.attr("tabindex","-1");var DataAdapter=this.options.get("dataAdapter");this.dataAdapter=new DataAdapter($element,this.options);var $container=this.render();this._placeContainer($container);var SelectionAdapter=this.options.get("selectionAdapter");this.selection=new SelectionAdapter($element,this.options);this.$selection=this.selection.render();this.selection.position(this.$selection,$container);var DropdownAdapter=this.options.get("dropdownAdapter");this.dropdown=new DropdownAdapter($element,this.options);this.$dropdown=this.dropdown.render();this.dropdown.position(this.$dropdown,$container);var ResultsAdapter=this.options.get("resultsAdapter");this.results=new ResultsAdapter($element,this.options,this.dataAdapter);this.$results=this.results.render();this.results.position(this.$results,this.$dropdown);var self=this;this._bindAdapters();this._registerDomEvents();this._registerDataEvents();this._registerSelectionEvents();this._registerDropdownEvents();this._registerResultsEvents();this._registerEvents();this.dataAdapter.current(function(initialData){self.trigger("selection:update",{data:initialData})});$element.addClass("select2-hidden-accessible");$element.attr("aria-hidden","true");this._syncAttributes();Utils.StoreData($element[0],"select2",this);$element.data("select2",this)};Utils.Extend(Select2,Utils.Observable);Select2.prototype._generateId=function($element){var id="";if($element.attr("id")!=null){id=$element.attr("id")}else if($element.attr("name")!=null){id=$element.attr("name")+"-"+Utils.generateChars(2)}else{id=Utils.generateChars(4)}id=id.replace(/(:|\.|\[|\]|,)/g,"");id="select2-"+id;return id};Select2.prototype._placeContainer=function($container){$container.insertAfter(this.$element);var width=this._resolveWidth(this.$element,this.options.get("width"));if(width!=null){$container.css("width",width)}};Select2.prototype._resolveWidth=function($element,method){var WIDTH=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if(method=="resolve"){var styleWidth=this._resolveWidth($element,"style");if(styleWidth!=null){return styleWidth}return this._resolveWidth($element,"element")}if(method=="element"){var elementWidth=$element.outerWidth(false);if(elementWidth<=0){return"auto"}return elementWidth+"px"}if(method=="style"){var style=$element.attr("style");if(typeof style!=="string"){return null}var attrs=style.split(";");for(var i=0,l=attrs.length;i<l;i=i+1){var attr=attrs[i].replace(/\s/g,"");var matches=attr.match(WIDTH);if(matches!==null&&matches.length>=1){return matches[1]}}return null}return method};Select2.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container);this.selection.bind(this,this.$container);this.dropdown.bind(this,this.$container);this.results.bind(this,this.$container)};Select2.prototype._registerDomEvents=function(){var self=this;this.$element.on("change.select2",function(){self.dataAdapter.current(function(data){self.trigger("selection:update",{data:data})})});this.$element.on("focus.select2",function(evt){self.trigger("focus",evt)});this._syncA=Utils.bind(this._syncAttributes,this);this._syncS=Utils.bind(this._syncSubtree,this);if(this.$element[0].attachEvent){this.$element[0].attachEvent("onpropertychange",this._syncA)}var observer=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;if(observer!=null){this._observer=new observer(function(mutations){$.each(mutations,self._syncA);$.each(mutations,self._syncS)});this._observer.observe(this.$element[0],{attributes:true,childList:true,subtree:false})}else if(this.$element[0].addEventListener){this.$element[0].addEventListener("DOMAttrModified",self._syncA,false);this.$element[0].addEventListener("DOMNodeInserted",self._syncS,false);this.$element[0].addEventListener("DOMNodeRemoved",self._syncS,false)}};Select2.prototype._registerDataEvents=function(){var self=this;this.dataAdapter.on("*",function(name,params){self.trigger(name,params)})};Select2.prototype._registerSelectionEvents=function(){var self=this;var nonRelayEvents=["toggle","focus"];this.selection.on("toggle",function(){self.toggleDropdown()});this.selection.on("focus",function(params){self.focus(params)});this.selection.on("*",function(name,params){if($.inArray(name,nonRelayEvents)!==-1){return}self.trigger(name,params)})};Select2.prototype._registerDropdownEvents=function(){var self=this;this.dropdown.on("*",function(name,params){self.trigger(name,params)})};Select2.prototype._registerResultsEvents=function(){var self=this;this.results.on("*",function(name,params){self.trigger(name,params)})};Select2.prototype._registerEvents=function(){var self=this;this.on("open",function(){self.$container.addClass("select2-container--open")});this.on("close",function(){self.$container.removeClass("select2-container--open")});this.on("enable",function(){self.$container.removeClass("select2-container--disabled")});this.on("disable",function(){self.$container.addClass("select2-container--disabled")});this.on("blur",function(){self.$container.removeClass("select2-container--focus")});this.on("query",function(params){if(!self.isOpen()){self.trigger("open",{})}this.dataAdapter.query(params,function(data){self.trigger("results:all",{data:data,query:params})})});this.on("query:append",function(params){this.dataAdapter.query(params,function(data){self.trigger("results:append",{data:data,query:params})})});this.on("keypress",function(evt){var key=evt.which;if(self.isOpen()){if(key===KEYS.ESC||key===KEYS.TAB||key===KEYS.UP&&evt.altKey){self.close();evt.preventDefault()}else if(key===KEYS.ENTER){self.trigger("results:select",{});evt.preventDefault()}else if(key===KEYS.SPACE&&evt.ctrlKey){self.trigger("results:toggle",{});evt.preventDefault()}else if(key===KEYS.UP){self.trigger("results:previous",{});evt.preventDefault()}else if(key===KEYS.DOWN){self.trigger("results:next",{});evt.preventDefault()}}else{if(key===KEYS.ENTER||key===KEYS.SPACE||key===KEYS.DOWN&&evt.altKey){self.open();evt.preventDefault()}}})};Select2.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled"));if(this.options.get("disabled")){if(this.isOpen()){this.close()}this.trigger("disable",{})}else{this.trigger("enable",{})}};Select2.prototype._syncSubtree=function(evt,mutations){var changed=false;var self=this;if(evt&&evt.target&&(evt.target.nodeName!=="OPTION"&&evt.target.nodeName!=="OPTGROUP")){return}if(!mutations){changed=true}else if(mutations.addedNodes&&mutations.addedNodes.length>0){for(var n=0;n<mutations.addedNodes.length;n++){var node=mutations.addedNodes[n];if(node.selected){changed=true}}}else if(mutations.removedNodes&&mutations.removedNodes.length>0){changed=true}if(changed){this.dataAdapter.current(function(currentData){self.trigger("selection:update",{data:currentData})})}};Select2.prototype.trigger=function(name,args){var actualTrigger=Select2.__super__.trigger;var preTriggerMap={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(args===undefined){args={}}if(name in preTriggerMap){var preTriggerName=preTriggerMap[name];var preTriggerArgs={prevented:false,name:name,args:args};actualTrigger.call(this,preTriggerName,preTriggerArgs);if(preTriggerArgs.prevented){args.prevented=true;return}}actualTrigger.call(this,name,args)};Select2.prototype.toggleDropdown=function(){if(this.options.get("disabled")){return}if(this.isOpen()){this.close()}else{this.open()}};Select2.prototype.open=function(){if(this.isOpen()){return}this.trigger("query",{})};Select2.prototype.close=function(){if(!this.isOpen()){return}this.trigger("close",{})};Select2.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")};Select2.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")};Select2.prototype.focus=function(data){if(this.hasFocus()){return}this.$container.addClass("select2-container--focus");this.trigger("focus",{})};Select2.prototype.enable=function(args){if(this.options.get("debug")&&window.console&&console.warn){console.warn('Select2: The `select2("enable")` method has been deprecated and will'+' be removed in later Select2 versions. Use $element.prop("disabled")'+" instead.")}if(args==null||args.length===0){args=[true]}var disabled=!args[0];this.$element.prop("disabled",disabled)};Select2.prototype.data=function(){if(this.options.get("debug")&&arguments.length>0&&window.console&&console.warn){console.warn('Select2: Data can no longer be set using `select2("data")`. You '+"should consider setting the value instead using `$element.val()`.")}var data=[];this.dataAdapter.current(function(currentData){data=currentData});return data};Select2.prototype.val=function(args){if(this.options.get("debug")&&window.console&&console.warn){console.warn('Select2: The `select2("val")` method has been deprecated and will be'+" removed in later Select2 versions. Use $element.val() instead.")}if(args==null||args.length===0){return this.$element.val()}var newVal=args[0];if($.isArray(newVal)){newVal=$.map(newVal,function(obj){return obj.toString()})}this.$element.val(newVal).trigger("change")};Select2.prototype.destroy=function(){this.$container.remove();if(this.$element[0].detachEvent){this.$element[0].detachEvent("onpropertychange",this._syncA)}if(this._observer!=null){this._observer.disconnect();this._observer=null}else if(this.$element[0].removeEventListener){this.$element[0].removeEventListener("DOMAttrModified",this._syncA,false);this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,false);this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,false)}this._syncA=null;this._syncS=null;this.$element.off(".select2");this.$element.attr("tabindex",Utils.GetData(this.$element[0],"old-tabindex"));this.$element.removeClass("select2-hidden-accessible");this.$element.attr("aria-hidden","false");Utils.RemoveData(this.$element[0]);this.$element.removeData("select2");this.dataAdapter.destroy();this.selection.destroy();this.dropdown.destroy();this.results.destroy();this.dataAdapter=null;this.selection=null;this.dropdown=null;this.results=null};Select2.prototype.render=function(){var $container=$('<span class="select2 select2-container">'+'<span class="selection"></span>'+'<span class="dropdown-wrapper" aria-hidden="true"></span>'+"</span>");$container.attr("dir",this.options.get("dir"));this.$container=$container;this.$container.addClass("select2-container--"+this.options.get("theme"));Utils.StoreData($container[0],"element",this.$element);return $container};return Select2});S2.define("jquery-mousewheel",["jquery"],function($){return $});S2.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function($,_,Select2,Defaults,Utils){if($.fn.select2==null){var thisMethods=["open","close","destroy"];$.fn.select2=function(options){options=options||{};if(typeof options==="object"){this.each(function(){var instanceOptions=$.extend(true,{},options);var instance=new Select2($(this),instanceOptions)});return this}else if(typeof options==="string"){var ret;var args=Array.prototype.slice.call(arguments,1);this.each(function(){var instance=Utils.GetData(this,"select2");if(instance==null&&window.console&&console.error){console.error("The select2('"+options+"') method was called on an "+"element that is not using Select2.")}ret=instance[options].apply(instance,args)});if($.inArray(options,thisMethods)>-1){return this}return ret}else{throw new Error("Invalid arguments for Select2: "+options)}}}if($.fn.select2.defaults==null){$.fn.select2.defaults=Defaults}return Select2});return{define:S2.define,require:S2.require}}();var select2=S2.require("jquery.select2");jQuery.fn.select2.amd=S2;return select2}); wizard/assets/select2/js/i18n/zh-CN.js 0000644 00000001406 15154444756 0013377 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/uk.js 0000644 00000002142 15154444756 0013075 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/es.js 0000644 00000001601 15154444756 0013064 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/bs.js 0000644 00000001661 15154444756 0013067 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bs",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ru.min.js 0000644 00000002025 15154444756 0013666 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sl.js 0000644 00000001577 15154444756 0013107 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Prosim zbrišite "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Prosim vpišite še "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var t="Označite lahko največ "+e.maximum+" predmet";return e.maximum==2?t+="a":e.maximum!=1&&(t+="e"),t},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/cs.min.js 0000644 00000002222 15154444756 0013644 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadejte o jeden znak méně.":n<=4?"Prosím, zadejte o "+e(n,!0)+" znaky méně.":"Prosím, zadejte o "+n+" znaků méně."},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadejte ještě jeden znak.":n<=4?"Prosím, zadejte ještě další "+e(n,!0)+" znaky.":"Prosím, zadejte ještě dalších "+n+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku.":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky.":"Můžete zvolit maximálně "+n+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/lt.min.js 0000644 00000001477 15154444756 0013671 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/zh-TW.js 0000644 00000001311 15154444756 0013424 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ro.min.js 0000644 00000001474 15154444756 0013667 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+" sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ps.js 0000644 00000002000 15154444756 0013071 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="د مهربانۍ لمخي "+t+" توری ړنګ کړئ";return t!=1&&(n=n.replace("توری","توري")),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لږ تر لږه "+t+" يا ډېر توري وليکئ";return n},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(e){var t="تاسو يوازي "+e.maximum+" قلم په نښه کولای سی";return e.maximum!=1&&(t=t.replace("قلم","قلمونه")),t},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."}}}),{define:e.define,require:e.require}})();wizard/assets/select2/js/i18n/nb.min.js 0000644 00000001244 15154444756 0013641 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Vennligst skriv inn "+t+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/az.js 0000644 00000001302 15154444756 0013065 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/pt.min.js 0000644 00000001411 15154444756 0013661 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"caractere",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hy.min.js 0000644 00000001633 15154444756 0013664 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Խնդրում ենք հեռացնել "+t+" նշան";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Խնդրում ենք մուտքագրել "+t+" կամ ավել նշաններ";return n},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(e){var t="Դուք կարող եք ընտրել առավելագույնը "+e.maximum+" կետ";return t},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ar.min.js 0000644 00000001422 15154444756 0013642 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum;return"الرجاء حذف "+t+" عناصر"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"الرجاء إضافة "+t+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){return"تستطيع إختيار "+e.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/da.js 0000644 00000001455 15154444756 0013050 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Angiv venligst "+t+" tegn mindre"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Angiv venligst "+t+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ca.js 0000644 00000001561 15154444756 0013045 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/da.min.js 0000644 00000001326 15154444756 0013627 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Angiv venligst "+t+" tegn mindre"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Angiv venligst "+t+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hsb.min.js 0000644 00000001646 15154444756 0014024 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hsb",[],function(){var e=["znamješko","znamješce","znamješka","znamješkow"],t=["zapisk","zapiskaj","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Prošu zhašej "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Prošu zapodaj znajmjeńša "+r+" "+n(r,e)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(e){return"Móžeš jenož "+e.maximum+" "+n(e.maximum,t)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ja.js 0000644 00000001525 15154444756 0013054 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/pl.min.js 0000644 00000001513 15154444756 0013654 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sk.min.js 0000644 00000002240 15154444756 0013654 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/lv.min.js 0000644 00000001426 15154444756 0013665 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/bg.js 0000644 00000001617 15154444756 0013054 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hy.js 0000644 00000001762 15154444756 0013105 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Խնդրում ենք հեռացնել "+t+" նշան";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Խնդրում ենք մուտքագրել "+t+" կամ ավել նշաններ";return n},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(e){var t="Դուք կարող եք ընտրել առավելագույնը "+e.maximum+" կետ";return t},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/gl.js 0000644 00000001573 15154444756 0013067 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var t=e.input.length-e.maximum;return t===1?"Elimine un carácter":"Elimine "+t+" caracteres"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t===1?"Engada un carácter":"Engada "+t+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return e.maximum===1?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/el.min.js 0000644 00000002032 15154444756 0013636 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/eu.js 0000644 00000001521 15154444756 0013067 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/pt.js 0000644 00000001540 15154444756 0013102 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"caractere",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/nl.js 0000644 00000001605 15154444756 0013072 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/lt.js 0000644 00000001626 15154444756 0013103 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/km.min.js 0000644 00000001727 15154444756 0013657 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/cs.js 0000644 00000002351 15154444756 0013065 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadejte o jeden znak méně.":n<=4?"Prosím, zadejte o "+e(n,!0)+" znaky méně.":"Prosím, zadejte o "+n+" znaků méně."},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadejte ještě jeden znak.":n<=4?"Prosím, zadejte ještě další "+e(n,!0)+" znaky.":"Prosím, zadejte ještě dalších "+n+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku.":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky.":"Můžete zvolit maximálně "+n+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sr-Cyrl.min.js 0000644 00000001731 15154444756 0014576 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/de.js 0000644 00000001532 15154444756 0013050 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/tk.js 0000644 00000001414 15154444756 0013075 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" harp bozuň.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ýene-de iň az "+t+" harp ýazyň.";return n},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){var t="Diňe "+e.maximum+" sanysyny saýlaň.";return t},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/et.js 0000644 00000001414 15154444756 0013067 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ms.js 0000644 00000001434 15154444756 0013100 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sk.js 0000644 00000002367 15154444756 0013104 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/en.min.js 0000644 00000001351 15154444756 0013643 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/th.min.js 0000644 00000001706 15154444756 0013660 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/he.min.js 0000644 00000001545 15154444756 0013642 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/de.min.js 0000644 00000001403 15154444756 0013627 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/lv.js 0000644 00000001555 15154444756 0013106 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/bs.min.js 0000644 00000001532 15154444756 0013646 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bs",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/it.min.js 0000644 00000001432 15154444756 0013655 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/vi.min.js 0000644 00000001316 15154444756 0013660 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+" ký tự";return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ro.js 0000644 00000001623 15154444756 0013101 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+" sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/et.min.js 0000644 00000001265 15154444756 0013655 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/fi.js 0000644 00000001423 15154444756 0013055 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/tr.min.js 0000644 00000001263 15154444756 0013670 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ko.min.js 0000644 00000001404 15154444756 0013651 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hi.js 0000644 00000002152 15154444756 0013057 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/fi.min.js 0000644 00000001274 15154444756 0013643 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/th.js 0000644 00000002035 15154444756 0013072 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hr.min.js 0000644 00000001365 15154444756 0013657 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sl.min.js 0000644 00000001450 15154444756 0013657 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Prosim zbrišite "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Prosim vpišite še "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var t="Označite lahko največ "+e.maximum+" predmet";return e.maximum==2?t+="a":e.maximum!=1&&(t+="e"),t},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/az.min.js 0000644 00000001153 15154444756 0013653 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ca.min.js 0000644 00000001432 15154444756 0013624 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/bg.min.js 0000644 00000001470 15154444756 0013633 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/gl.min.js 0000644 00000001444 15154444756 0013646 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var t=e.input.length-e.maximum;return t===1?"Elimine un carácter":"Elimine "+t+" caracteres"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t===1?"Engada un carácter":"Engada "+t+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return e.maximum===1?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sv.js 0000644 00000001427 15154444756 0013113 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sv.min.js 0000644 00000001300 15154444756 0013663 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/fa.js 0000644 00000001761 15154444756 0013052 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها میتوانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجهای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/tk.min.js 0000644 00000001265 15154444756 0013663 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" harp bozuň.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ýene-de iň az "+t+" harp ýazyň.";return n},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){var t="Diňe "+e.maximum+" sanysyny saýlaň.";return t},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/id.js 0000644 00000001365 15154444756 0013060 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/pt-BR.js 0000644 00000001532 15154444756 0013404 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/zh-CN.min.js 0000644 00000001257 15154444756 0014165 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/eu.min.js 0000644 00000001372 15154444756 0013655 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ps.min.js 0000644 00000001651 15154444756 0013666 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="د مهربانۍ لمخي "+t+" توری ړنګ کړئ";return t!=1&&(n=n.replace("توری","توري")),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لږ تر لږه "+t+" يا ډېر توري وليکئ";return n},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(e){var t="تاسو يوازي "+e.maximum+" قلم په نښه کولای سی";return e.maximum!=1&&(t=t.replace("قلم","قلمونه")),t},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hu.js 0000644 00000001447 15154444756 0013101 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/fr.min.js 0000644 00000001441 15154444756 0013650 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Supprimez "+t+" caractère"+(t>1?"s":"")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Saisissez au moins "+t+" caractère"+(t>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hi.min.js 0000644 00000002023 15154444756 0013636 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/pt-BR.min.js 0000644 00000001403 15154444756 0014163 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/is.js 0000644 00000001412 15154444756 0013070 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/is.min.js 0000644 00000001263 15154444756 0013656 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/en.js 0000644 00000001500 15154444756 0013055 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ms.min.js 0000644 00000001305 15154444756 0013657 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/es.min.js 0000644 00000001452 15154444756 0013652 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hu.min.js 0000644 00000001320 15154444756 0013651 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/af.js 0000644 00000001523 15154444756 0013046 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Verwyders asseblief "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Voer asseblief "+t+" of meer karakters";return n},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var t="Kies asseblief net "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ko.js 0000644 00000001533 15154444756 0013072 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sr.min.js 0000644 00000001530 15154444756 0013664 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sr-Cyrl.js 0000644 00000002060 15154444756 0014010 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/vi.js 0000644 00000001445 15154444756 0013101 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+" ký tự";return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/id.min.js 0000644 00000001236 15154444756 0013637 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/dsb.min.js 0000644 00000001645 15154444756 0014017 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/dsb",[],function(){var e=["znamuško","znamušce","znamuška","znamuškow"],t=["zapisk","zapiska","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Pšosym lašuj "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Pšosym zapódaj nanejmjenjej "+r+" "+n(r,e)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(e){return"Móžoš jano "+e.maximum+" "+n(e.maximum,t)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hsb.js 0000644 00000001775 15154444756 0013245 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hsb",[],function(){var e=["znamješko","znamješce","znamješka","znamješkow"],t=["zapisk","zapiskaj","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Prošu zhašej "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Prošu zapodaj znajmjeńša "+r+" "+n(r,e)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(e){return"Móžeš jenož "+e.maximum+" "+n(e.maximum,t)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/sr.js 0000644 00000001657 15154444756 0013114 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/fa.min.js 0000644 00000001632 15154444756 0013631 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها میتوانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجهای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/dsb.js 0000644 00000001774 15154444756 0013240 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/dsb",[],function(){var e=["znamuško","znamušce","znamuška","znamuškow"],t=["zapisk","zapiska","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Pšosym lašuj "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Pšosym zapódaj nanejmjenjej "+r+" "+n(r,e)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(e){return"Móžoš jano "+e.maximum+" "+n(e.maximum,t)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/he.js 0000644 00000001674 15154444756 0013063 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ja.min.js 0000644 00000001376 15154444756 0013642 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/tr.js 0000644 00000001412 15154444756 0013102 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/nb.js 0000644 00000001373 15154444756 0013062 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Vennligst skriv inn "+t+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/km.js 0000644 00000002056 15154444756 0013071 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/pl.js 0000644 00000001642 15154444756 0013075 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/zh-TW.min.js 0000644 00000001162 15154444756 0014212 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/nl.min.js 0000644 00000001456 15154444756 0013660 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ru.js 0000644 00000002154 15154444756 0013107 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/it.js 0000644 00000001561 15154444756 0013076 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/fr.js 0000644 00000001570 15154444756 0013071 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Supprimez "+t+" caractère"+(t>1?"s":"")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Saisissez au moins "+t+" caractère"+(t>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/mk.min.js 0000644 00000001601 15154444756 0013646 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/ar.js 0000644 00000001551 15154444756 0013063 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum;return"الرجاء حذف "+t+" عناصر"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"الرجاء إضافة "+t+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){return"تستطيع إختيار "+e.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/uk.min.js 0000644 00000002013 15154444756 0013654 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/el.js 0000644 00000002161 15154444756 0013057 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/af.min.js 0000644 00000001374 15154444756 0013634 0 ustar 00 (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Verwyders asseblief "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Voer asseblief "+t+" of meer karakters";return n},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var t="Kies asseblief net "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/hr.js 0000644 00000001514 15154444756 0013071 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/js/i18n/mk.js 0000644 00000001730 15154444756 0013067 0 ustar 00 /*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); wizard/assets/select2/css/select2.css 0000644 00000042267 15154444756 0013604 0 ustar 00 .select2-container { box-sizing: border-box; display: inline-block; margin: 0; position: relative; vertical-align: middle; } .select2-container .select2-selection--single { box-sizing: border-box; cursor: pointer; display: block; height: 28px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--single .select2-selection__rendered { display: block; padding-left: 8px; padding-right: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-selection--single .select2-selection__clear { position: relative; } .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 8px; padding-left: 20px; } .select2-container .select2-selection--multiple { box-sizing: border-box; cursor: pointer; display: block; min-height: 32px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--multiple .select2-selection__rendered { display: inline-block; overflow: hidden; padding-left: 8px; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-search--inline { float: left; } .select2-container .select2-search--inline .select2-search__field { box-sizing: border-box; border: none; font-size: 100%; margin-top: 5px; padding: 0; } .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-dropdown { background-color: white; border: 1px solid #aaa; border-radius: 4px; box-sizing: border-box; display: block; position: absolute; left: -100000px; width: 100%; z-index: 1051; } .select2-results { display: block; } .select2-results__options { list-style: none; margin: 0; padding: 0; } .select2-results__option { padding: 6px; user-select: none; -webkit-user-select: none; } .select2-results__option[aria-selected] { cursor: pointer; } .select2-container--open .select2-dropdown { left: 0; } .select2-container--open .select2-dropdown--above { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--open .select2-dropdown--below { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-search--dropdown { display: block; padding: 4px; } .select2-search--dropdown .select2-search__field { padding: 4px; width: 100%; box-sizing: border-box; } .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-search--dropdown.select2-search--hide { display: none; } .select2-close-mask { border: 0; margin: 0; padding: 0; display: block; position: fixed; left: 0; top: 0; min-height: 100%; min-width: 100%; height: auto; width: auto; opacity: 0; z-index: 99; background-color: #fff; filter: alpha(opacity=0); } .select2-hidden-accessible { border: 0 !important; clip: rect(0 0 0 0) !important; -webkit-clip-path: inset(50%) !important; clip-path: inset(50%) !important; height: 1px !important; overflow: hidden !important; padding: 0 !important; position: absolute !important; width: 1px !important; white-space: nowrap !important; } .select2-container--default .select2-selection--single { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; } .select2-container--default .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--default .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; } .select2-container--default .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; } .select2-container--default .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { left: 1px; right: auto; } .select2-container--default.select2-container--disabled .select2-selection--single { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { display: none; } .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--default .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; } .select2-container--default .select2-selection--multiple .select2-selection__rendered { box-sizing: border-box; list-style: none; margin: 0; padding: 0 5px; width: 100%; } .select2-container--default .select2-selection--multiple .select2-selection__rendered li { list-style: none; } .select2-container--default .select2-selection--multiple .select2-selection__placeholder { color: #999; margin-top: 5px; float: left; } .select2-container--default .select2-selection--multiple .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-top: 5px; margin-right: 10px; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { color: #999; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #333; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { float: right; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--default.select2-container--focus .select2-selection--multiple { border: solid black 1px; outline: 0; } .select2-container--default.select2-container--disabled .select2-selection--multiple { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection__choice__remove { display: none; } .select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--default .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; } .select2-container--default .select2-search--inline .select2-search__field { background: transparent; border: none; outline: 0; box-shadow: none; -webkit-appearance: textfield; } .select2-container--default .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--default .select2-results__option[role=group] { padding: 0; } .select2-container--default .select2-results__option[aria-disabled=true] { color: #999; } .select2-container--default .select2-results__option[aria-selected=true] { background-color: #ddd; } .select2-container--default .select2-results__option .select2-results__option { padding-left: 1em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__group { padding-left: 0; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option { margin-left: -1em; padding-left: 2em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -2em; padding-left: 3em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -3em; padding-left: 4em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -4em; padding-left: 5em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -5em; padding-left: 6em; } .select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: #5897fb; color: white; } .select2-container--default .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic .select2-selection--single { background-color: #f7f7f7; border: 1px solid #aaa; border-radius: 4px; outline: 0; background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic .select2-selection--single:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--classic .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-right: 10px; } .select2-container--classic .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--classic .select2-selection--single .select2-selection__arrow { background-color: #ddd; border: none; border-left: 1px solid #aaa; border-top-right-radius: 4px; border-bottom-right-radius: 4px; height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } .select2-container--classic .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { border: none; border-right: 1px solid #aaa; border-radius: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; left: 1px; right: auto; } .select2-container--classic.select2-container--open .select2-selection--single { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { background: transparent; border: none; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } .select2-container--classic .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; outline: 0; } .select2-container--classic .select2-selection--multiple:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--multiple .select2-selection__rendered { list-style: none; margin: 0; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__clear { display: none; } .select2-container--classic .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { color: #888; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { color: #555; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { float: right; margin-left: 5px; margin-right: auto; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--classic.select2-container--open .select2-selection--multiple { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--classic .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; outline: 0; } .select2-container--classic .select2-search--inline .select2-search__field { outline: 0; box-shadow: none; } .select2-container--classic .select2-dropdown { background-color: white; border: 1px solid transparent; } .select2-container--classic .select2-dropdown--above { border-bottom: none; } .select2-container--classic .select2-dropdown--below { border-top: none; } .select2-container--classic .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--classic .select2-results__option[role=group] { padding: 0; } .select2-container--classic .select2-results__option[aria-disabled=true] { color: grey; } .select2-container--classic .select2-results__option--highlighted[aria-selected] { background-color: #3875d7; color: white; } .select2-container--classic .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic.select2-container--open .select2-dropdown { border-color: #5897fb; } wizard/assets/select2/css/select2.min.css 0000644 00000035414 15154444756 0014362 0 ustar 00 .select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:0;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:0;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,white 50%,#eee 100%);background-image:-o-linear-gradient(top,white 50%,#eee 100%);background-image:linear-gradient(to bottom,white 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF',endColorstr='#FFEEEEEE',GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:0;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE',endColorstr='#FFCCCCCC',GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:0;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:0}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:0;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,white 0,#eee 50%);background-image:-o-linear-gradient(top,white 0,#eee 50%);background-image:linear-gradient(to bottom,white 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF',endColorstr='#FFEEEEEE',GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,white 100%);background-image:-o-linear-gradient(top,#eee 50%,white 100%);background-image:linear-gradient(to bottom,#eee 50%,white 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE',endColorstr='#FFFFFFFF',GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:white;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:0}.select2-container--classic .select2-dropdown--below{border-top:0}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:white}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} wizard/class-field.php 0000644 00000141150 15154444756 0010764 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); if ( ! class_exists( "rsssl_field" ) ) { class rsssl_field { private static $_this; public $position; public $fields; public $default_args; public $form_errors = array(); function __construct() { if ( isset( self::$_this ) ) { wp_die( sprintf( '%s is a singleton class and you cannot create a second instance.', get_class( $this ) ) ); } self::$_this = $this; //safe before the fields are loaded in config, in init add_action( 'plugins_loaded', array( $this, 'process_save' ), 14 ); add_action( 'rsssl_before_label', array( $this, 'before_label' ), 10, 1 ); add_action( 'rsssl_label_html', array( $this, 'label_html' ), 10, 1 ); add_action( 'rsssl_after_label', array( $this, 'after_label' ), 10, 1 ); add_action( 'rsssl_after_field', array( $this, 'after_field' ), 10, 1 ); $this->load(); } static function this() { return self::$_this; } public function label_html( $args ) { ?> <label class="<?php if ( $args['disabled'] ) {echo 'rsssl-disabled';} ?>" for="<?php echo $args['fieldname'] ?>"> <div class="rsssl-label-wrap"><?php echo $args['label'] ?> <?php if ( isset($args['tooltip']) && $args['tooltip-position'] === 'title') { echo rsssl_icon('help', 'normal', $args['tooltip']); } ?> </div> <div class="rsssl-subtitle-wrap"><?php echo $args['sublabel'] ?></div> </label> <?php } public function load() { $this->default_args = array( "fieldname" => '', "type" => 'text', "required" => false, 'default' => '', 'label' => '', 'sublabel' => '', 'option_text' => false, 'table' => false, 'callback_condition' => false, 'condition' => false, 'callback' => false, 'placeholder' => '', 'optional' => false, 'disabled' => false, 'hidden' => false, 'region' => false, 'media' => true, 'first' => false, 'warn' => false, 'cols' => false, 'minimum' => 0, 'title' => '', 'tooltip-position' => '', ); } public function process_save() { if ( ! current_user_can( 'manage_options' ) ) { return; } if ( isset( $_POST['rsssl_le_nonce'] ) ) { if ( ! isset( $_POST['rsssl_le_nonce'] ) || ! wp_verify_nonce( $_POST['rsssl_le_nonce'], 'rsssl_save' ) ) { return; } //save data $posted_fields = array_filter( $_POST, array( $this, 'filter_rsssl_fields' ), ARRAY_FILTER_USE_KEY ); foreach ( $posted_fields as $fieldname => $fieldvalue ) { $this->save_field( $fieldname, $fieldvalue ); } do_action('rsssl_after_saved_all_fields', $posted_fields ); } } /** * santize an array for save storage * * @param $array * * @return mixed */ public function sanitize_array( $array ) { foreach ( $array as &$value ) { if ( ! is_array( $value ) ) { $value = sanitize_text_field( $value ); } //if ($value === 'on') $value = true; else { $this->sanitize_array( $value ); } } return $array; } /** * Check if this is a conditional field * * @param $fieldname * * @return bool */ public function is_conditional( $fieldname ) { $fields = RSSSL_LE()->config->fields(); if ( isset( $fields[ $fieldname ]['condition'] ) && $fields[ $fieldname ]['condition'] ) { return true; } return false; } /** * Check if this is a multiple field * * @param $fieldname * * @return bool */ public function is_multiple_field( $fieldname ) { $fields = RSSSL_LE()->config->fields(); if ( isset( $fields[ $fieldname ]['type'] ) && ( $fields[ $fieldname ]['type'] == 'thirdparties' ) ) { return true; } if ( isset( $fields[ $fieldname ]['type'] ) && ( $fields[ $fieldname ]['type'] == 'processors' ) ) { return true; } return false; } public function save_multiple( $fieldnames ) { if ( ! current_user_can( 'manage_options' ) ) { return; } $fields = RSSSL_LE()->config->fields(); foreach ( $fieldnames as $fieldname => $saved_fields ) { if ( ! isset( $fields[ $fieldname ] ) ) { return; } $page = $fields[ $fieldname ]['source']; $options = get_option( 'rsssl_options_' . $page ); $multiple_field = $this->get_value( $fieldname, array() ); foreach ( $saved_fields as $key => $value ) { $value = is_array( $value ) ? array_map( 'sanitize_text_field', $value ) : sanitize_text_field( $value ); //store the fact that this value was saved from the back-end, so should not get overwritten. $value['saved_by_user'] = true; $multiple_field[ $key ] = $value; } $options[ $fieldname ] = $multiple_field; if ( ! empty( $options ) ) { update_option( 'rsssl_options_' . $page, $options ); } } } /** * Save the field * @param string $fieldname * @param mixed $fieldvalue */ public function save_field( $fieldname, $fieldvalue ) { if ( ! current_user_can( 'manage_options' ) ) { return; } $fieldvalue = apply_filters("rsssl_fieldvalue", $fieldvalue, $fieldname); $fields = RSSSL_LE()->config->fields(); $fieldname = str_replace( "rsssl_", '', $fieldname ); //do not save callback fields if ( isset( $fields[ $fieldname ]['callback'] ) ) { return; } $type = $fields[ $fieldname ]['type']; $page = $fields[ $fieldname ]['source']; $required = isset( $fields[ $fieldname ]['required'] ) ? $fields[ $fieldname ]['required'] : false; $fieldvalue = $this->sanitize( $fieldvalue, $type ); if ( ! $this->is_conditional( $fieldname ) && $required && empty( $fieldvalue ) ) { $this->form_errors[] = $fieldname; } if ($type === 'password' ) { $fieldvalue = RSSSL_LE()->letsencrypt_handler->encode($fieldvalue); } $options = get_option( 'rsssl_options_' . $page ); if ( ! is_array( $options ) ) { $options = array(); } $prev_value = isset( $options[ $fieldname ] ) ? $options[ $fieldname ] : false; do_action( "rsssl_before_save_" . $page . "_option", $fieldname, $fieldvalue, $prev_value, $type ); $options[ $fieldname ] = $fieldvalue; if ( ! empty( $options ) ) { update_option( 'rsssl_options_' . $page, $options ); } do_action( "rsssl_after_save_" . $page . "_option", $fieldname, $fieldvalue, $prev_value, $type ); } public function add_multiple_field( $fieldname, $cookie_type = false ) { if ( ! current_user_can( 'manage_options' ) ) { return; } $fields = RSSSL_LE()->config->fields(); $page = $fields[ $fieldname ]['source']; $options = get_option( 'rsssl_options_' . $page ); $multiple_field = $this->get_value( $fieldname, array() ); if ( $fieldname === 'used_cookies' && ! $cookie_type ) { $cookie_type = 'custom_' . time(); } if ( ! is_array( $multiple_field ) ) { $multiple_field = array( $multiple_field ); } if ( $cookie_type ) { //prevent key from being added twice foreach ( $multiple_field as $index => $cookie ) { if ( $cookie['key'] === $cookie_type ) { return; } } //don't add field if it was deleted previously $deleted_cookies = get_option( 'rsssl_deleted_cookies' ); if ( ( $deleted_cookies && in_array( $cookie_type, $deleted_cookies ) ) ) { return; } //don't add default wordpress cookies if ( strpos( $cookie_type, 'wordpress_' ) !== false ) { return; } $multiple_field[] = array( 'key' => $cookie_type ); } else { $multiple_field[] = array(); } $options[ $fieldname ] = $multiple_field; if ( ! empty( $options ) ) { update_option( 'rsssl_options_' . $page, $options ); } } /** * Sanitize a field * @param $value * @param $type * * @return array|bool|int|string|void */ public function sanitize( $value, $type ) { if ( ! current_user_can( 'manage_options' ) ) { return false; } switch ( $type ) { case 'colorpicker': return sanitize_hex_color( $value ); case 'text': return sanitize_text_field( $value ); case 'multicheckbox': if ( ! is_array( $value ) ) { $value = array( $value ); } return array_map( 'sanitize_text_field', $value ); case 'phone': $value = sanitize_text_field( $value ); return $value; case 'email': return sanitize_email( $value ); case 'url': return esc_url_raw( $value ); case 'number': return intval( $value ); case 'css': case 'javascript': return $value ; case 'editor': case 'textarea': case 'password': return wp_kses_post( $value ); } return sanitize_text_field( $value ); } /**/ private function filter_rsssl_fields( $fieldname ) { if ( strpos( $fieldname, 'rsssl_' ) !== false && isset( RSSSL_LE()->config->fields[ str_replace( 'rsssl_', '', $fieldname ) ] ) ) { return true; } return false; } public function before_label( $args ) { $condition_class = ''; $condition_question = ''; $condition_answer = ''; if ( ! empty( $args['condition'] ) ) { $condition_count = 1; foreach ( $args['condition'] as $question => $answer ) { $question = esc_attr( $question ); $answer = esc_attr( $answer ); $condition_class .= "condition-check-{$condition_count} "; $condition_question .= "data-condition-answer-{$condition_count}='{$answer}' "; $condition_answer .= "data-condition-question-{$condition_count}='{$question}' "; $condition_count++; } } $hidden_class = ( $args['hidden'] ) ? 'hidden' : ''; $rsssl_hidden = $this->condition_applies( $args ) ? '' : 'rsssl-hidden'; $first_class = ( $args['first'] ) ? 'first' : ''; $type = $args['type'] === 'notice' ? '' : $args['type']; $cols_class = isset($args['cols']) && $args['cols'] ? "rsssl-cols-{$args['cols']}" : ''; $col_class = isset($args['col']) ? "rsssl-col-{$args['col']}" : ''; $colspan_class = isset($args['colspan']) ? "rsssl-colspan-{$args['colspan']}" : ''; $this->get_master_label( $args ); echo '<div class="field-group ' . esc_attr( $args['fieldname'] . ' ' . esc_attr( $cols_class ) . ' ' . esc_attr( $col_class ) . ' ' . esc_attr( $colspan_class ) . ' ' . 'rsssl-'. $type . ' ' . $hidden_class . ' ' . $first_class . ' ' . $condition_class . ' ' . $rsssl_hidden ) . '" '; echo $condition_question; echo $condition_answer; // Close div! echo '>'; // Required to give a checkbox a title if ($args['title']) { $title = $args['title']; echo "<div class='rsssl-title-wrap rsssl-field'>$title</div>"; } echo '<div class="rsssl-field">'; if ($args['label']) { echo '<div class="rsssl-label">'; } } public function get_master_label( $args ) { if ( ! isset( $args['master_label'] ) ) { return; } ?> <div class="rsssl-master-label"><h2><?php echo esc_html( $args['master_label'] ) ?></h2></div> <?php } /** * Show tooltip, if provided * @param $args */ public function in_label($args) { if ( isset($args['tooltip']) ) { echo rsssl_icon('help', 'normal', $args['tooltip']); } } public function after_label( $args ) { if ($args['label'] ) { echo '</div>'; } } public function after_field( $args ) { $this->get_comment( $args ); echo '</div><!--close in after field-->'; echo '<div class="rsssl-help-warning-wrap">'; if ( isset( $args['help'] ) ) { rsssl_sidebar_notice( wp_kses_post( $args['help'] ) ); } do_action( 'rsssl_notice_' . $args['fieldname'], $args ); echo '</div>'; echo '</div>'; } public function text( $args ) { if ( ! $this->show_field( $args ) ) { return; } $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); $required = $args['required'] ? 'required' : ''; $is_required = $args['required'] ? 'is-required' : ''; $check_icon = rsssl_icon('check', 'success'); ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <input <?php echo $required ?> class="validation <?php echo $is_required ?>" placeholder="<?php echo esc_html( $args['placeholder'] ) ?>" type="text" value="<?php echo esc_html( $value ) ?>" name="<?php echo esc_html( $fieldname ) ?>" <?php if ( $args['disabled'] ) { echo 'disabled'; } ?> > <?php echo $check_icon ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function password( $args ) { if ( ! $this->show_field( $args ) ) { return; } $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); $required = $args['required'] ? 'required' : ''; $is_required = $args['required'] ? 'is-required' : ''; $check_icon = rsssl_icon('check', 'success'); ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <input <?php echo $required ?> class="validation <?php echo $is_required ?>" placeholder="<?php echo esc_html( $args['placeholder'] ) ?>" type="password" value="<?php echo esc_html( $value ) ?>" name="<?php echo esc_html( $fieldname ) ?>" <?php if ( $args['disabled'] ) { echo 'disabled'; } ?> > <?php echo $check_icon ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function url( $args ) { if ( ! $this->show_field( $args ) ) { return; } $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); $required = $args['required'] ? 'required' : ''; $is_required = $args['required'] ? 'is-required' : ''; $check_icon = rsssl_icon('check', 'success'); $times_icon = rsssl_icon('check', 'failed'); ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <input <?php echo $required ?> class="validation <?php echo $is_required ?>" placeholder="<?php echo esc_html( $args['placeholder'] ) ?>" type="text" pattern="(http(s)?(:\/\/))?(www.)?[#a-zA-Z0-9-_\.\/:].*" value="<?php echo esc_html( $value ) ?>" name="<?php echo esc_html( $fieldname ) ?>" > <?php echo $check_icon ?> <?php echo $times_icon ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function email( $args ) { if ( ! $this->show_field( $args ) ) { return; } $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); $required = $args['required'] ? 'required' : ''; $is_required = $args['required'] ? 'is-required' : ''; $check_icon = rsssl_icon('check', 'success'); $times_icon = rsssl_icon('check', 'failed'); ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <input <?php echo $required ?> class="validation <?php echo $is_required ?>" placeholder="<?php echo esc_html( $args['placeholder'] ) ?>" type="email" value="<?php echo esc_html( $value ) ?>" name="<?php echo esc_html( $fieldname ) ?>" > <?php echo $check_icon ?> <?php echo $times_icon ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function phone( $args ) { if ( ! $this->show_field( $args ) ) { return; } $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); $required = $args['required'] ? 'required' : ''; $is_required = $args['required'] ? 'is-required' : ''; $check_icon = rsssl_icon('check', 'success'); $times_icon = rsssl_icon('check', 'failed'); ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <input autocomplete="tel" <?php echo $required ?> class="validation <?php echo $is_required ?>" placeholder="<?php echo esc_html( $args['placeholder'] ) ?>" type="text" value="<?php echo esc_html( $value ) ?>" name="<?php echo esc_html( $fieldname ) ?>" > <?php echo $check_icon ?> <?php echo $times_icon ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function number( $args ) { $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <input <?php if ( $args['required'] ) { echo 'required'; } ?> class="validation <?php if ( $args['required'] ) { echo 'is-required'; } ?>" placeholder="<?php echo esc_html( $args['placeholder'] ) ?>" type="number" value="<?php echo esc_html( $value ) ?>" name="<?php echo esc_html( $fieldname ) ?>" min="<?php echo $args['minimum']?>" step="<?php echo isset($args["validation_step"]) ? intval($args["validation_step"]) : 1?>" > <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function checkbox( $args, $force_value = false ) { $fieldname = 'rsssl_' . $args['fieldname']; $value = $force_value ? $force_value : $this->get_value( $args['fieldname'], $args['default'] ); $placeholder_value = ( $args['disabled'] && $value ) ? $value : 0; if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <label class="rsssl-switch"> <input name="<?php echo esc_html( $fieldname ) ?>" type="hidden" value="<?php echo $placeholder_value ?>"/> <input name="<?php echo esc_html( $fieldname ) ?>" size="40" type="checkbox" <?php if ( $args['disabled'] ) { echo 'disabled'; } ?> class="<?php if ( $args['required'] ) { echo 'is-required'; } ?>" value="1" <?php checked( 1, $value, true ) ?> /> <span class="rsssl-slider rsssl-round"></span> </label> <?php if ($args['option_text'] ) { ?> <div class="rsssl-wizard-settings-text"><?php echo $args['option_text'] ?></div> <?php if (isset($args['tooltip']) && $args['tooltip-position'] === 'after') { echo rsssl_icon('help', 'normal', $args['tooltip']); } } do_action( 'rsssl_after_field', $args ); ?> <?php } public function radio( $args ) { if ( ! $this->show_field( $args ) ) { return; } $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); $options = $args['options']; $required = $args['required'] ? 'required' : ''; $check_icon = rsssl_icon('bullet', 'success'); $disabled_index = array(); $default_index = array(); if ( ! empty( $options ) ) { // Disabled index foreach ($options as $option_value => $option_label) { if ( is_array($args['disabled']) && in_array($option_value, $args['disabled']) || $args['disabled'] === true ) { $disabled_index[$option_value] = 'rsssl-disabled'; } else { $disabled_index[$option_value] = ''; } } // Default index foreach ($options as $option_value => $option_label) { if ( is_array($args['default']) && in_array($option_value, $args['default']) ) { $default_index[$option_value] = 'rsssl-default'; } else { $default_index[$option_value] = ''; } } } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <?php if ( ! empty( $options ) ) { foreach ( $options as $option_value => $option_label ) { if ($disabled_index[$option_value] === 'rsssl-disabled') { echo '<div class="rsssl-not-allowed">'; } ?> <label class="rsssl-radio-container <?php echo $disabled_index[$option_value] ?>"><?php echo esc_html( $option_label ) ?> <input <?php echo $required ?> type="radio" id="<?php echo esc_html( $option_value ) ?>" name="<?php echo esc_html( $fieldname ) ?>" class="<?php echo esc_html( $fieldname ) ?>" value="<?php echo esc_html( $option_value ) ?>" <?php if ( $value == $option_value ) echo "checked" ?> > <div class="radiobtn <?php echo $default_index[$option_value] ?>" <?php echo $required ?> ><?php echo $check_icon ?></div> </label> <?php if ($disabled_index[$option_value] === 'rsssl-disabled') { echo '</div>'; // class="rsssl-not-allowed" } } } ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function show_field( $args ) { $show = ( $this->condition_applies( $args, 'callback_condition' ) ); return $show; } public function function_callback_applies( $func ) { $invert = false; if ( strpos( $func, 'NOT ' ) !== false ) { $invert = true; $func = str_replace( 'NOT ', '', $func ); } $show_field = $func(); if ( $invert ) { $show_field = ! $show_field; } if ( $show_field ) { return true; } else { return false; } } /** * If multiple condition, uses AND relation * * @param $args * @param false $type * * @return bool */ public function condition_applies( $args, $type = false) { $default_args = $this->default_args; $args = wp_parse_args( $args, $default_args ); if ( ! $type ) { if ( $args['condition'] ) { $type = 'condition'; } elseif ( $args['callback_condition'] ) { $type = 'callback_condition'; } } if ( ! $type || ! $args[ $type ] ) { return true; } //function callbacks $maybe_is_function = is_string($args[ $type ]) ? str_replace( 'NOT ', '', $args[ $type ] ) : ''; if ( ! is_array( $args[ $type ] ) && ! empty( $args[ $type ] ) && function_exists( $maybe_is_function ) ) { return $this->function_callback_applies( $args[ $type ] ); } $condition = $args[ $type ]; //if we're checking the condition, but there's also a callback condition, check that one as well. //but only if it's an array. Otherwise it's a func. if ( $type === 'condition' && isset( $args['callback_condition'] ) && is_array( $args['callback_condition'] ) ) { $condition += $args['callback_condition']; } foreach ( $condition as $c_fieldname => $c_value_content ) { $c_values = $c_value_content; //the possible multiple values are separated with comma instead of an array, so we can add NOT. if ( ! is_array( $c_value_content ) && strpos( $c_value_content, ',' ) !== false ) { $c_values = explode( ',', $c_value_content ); } $c_values = is_array( $c_values ) ? $c_values : array( $c_values ); foreach ( $c_values as $c_value ) { $maybe_is_function = str_replace( 'NOT ', '', $c_value ); if ( function_exists( $maybe_is_function ) ) { $match = $this->function_callback_applies( $c_value ); if ( ! $match ) { return false; } } else { $actual_value = rsssl_get_value( $c_fieldname ); if ( strpos( $c_value, 'NOT ' ) === false ) { $invert = false; } else { $invert = true; $c_value = str_replace( "NOT ", "", $c_value ); } //when the actual value is an array, it is enough when just one matches. //to be able to return false, for no match at all, we check all items, then return false if none matched //this way we can preserve the AND property of this function $match = ( $c_value === $actual_value || in_array( $actual_value, $c_values ) ); if ( $invert ) { $match = ! $match; } if ( ! $match ) { return false; } } } } return true; } public function get_field_type( $fieldname ) { if ( ! isset( RSSSL_LE()->config->fields[ $fieldname ] ) ) { return false; } return RSSSL_LE()->config->fields[ $fieldname ]['type']; } public function textarea( $args ) { $fieldname = 'rsssl_' . $args['fieldname']; $check_icon = rsssl_icon('check', 'success'); $times_icon = rsssl_icon('check', 'failed'); $value = $this->get_value( $args['fieldname'], $args['default'] ); if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <textarea name="<?php echo esc_html( $fieldname ) ?>" <?php if ( $args['required'] ) { echo 'required'; } ?> class="validation <?php if ( $args['required'] ) { echo 'is-required'; } ?>" placeholder="<?php echo esc_html( $args['placeholder'] ) ?>"><?php echo esc_html( $value ) ?></textarea> <?php echo $check_icon ?> <?php echo $times_icon ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } /* * Show field with editor * * * */ public function editor( $args, $step = '' ) { $fieldname = 'rsssl_' . $args['fieldname']; $args['first'] = true; $media = $args['media'] ? true : false; $value = $this->get_value( $args['fieldname'], $args['default'] ); if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <?php $settings = array( 'media_buttons' => $media, 'editor_height' => 300, // In pixels, takes precedence and has no default value 'textarea_rows' => 15, ); wp_editor( $value, $fieldname, $settings ); ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function javascript( $args ) { $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <div id="<?php echo esc_html( $fieldname ) ?>editor" style="height: 200px; width: 100%"><?php echo $value ?></div> <?php do_action( 'rsssl_after_field', $args ); ?> <script> var <?php echo esc_html( $fieldname )?> = ace.edit("<?php echo esc_html( $fieldname )?>editor"); <?php echo esc_html( $fieldname )?>.setTheme("ace/theme/monokai"); <?php echo esc_html( $fieldname )?>.session.setMode("ace/mode/javascript"); jQuery(document).ready(function ($) { var textarea = $('textarea[name="<?php echo esc_html( $fieldname )?>"]'); <?php echo esc_html( $fieldname )?>. getSession().on("change", function () { textarea.val(<?php echo esc_html( $fieldname )?>.getSession().getValue() ) }); }); </script> <textarea style="display:none" name="<?php echo esc_html( $fieldname ) ?>"><?php echo $value ?></textarea> <?php } public function css( $args ) { $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <div id="<?php echo esc_html( $fieldname ) ?>editor" style="height: 290px; width: 100%"><?php echo $value ?></div> <?php do_action( 'rsssl_after_field', $args ); ?> <script> var <?php echo esc_html( $fieldname )?> = ace.edit("<?php echo esc_html( $fieldname )?>editor"); <?php echo esc_html( $fieldname )?>.setTheme("ace/theme/monokai"); <?php echo esc_html( $fieldname )?>.session.setMode("ace/mode/css"); jQuery(document).ready(function ($) { var textarea = $('textarea[name="<?php echo esc_html( $fieldname )?>"]'); <?php echo esc_html( $fieldname )?>. getSession().on("change", function () { textarea.val(<?php echo esc_html( $fieldname )?>.getSession().getValue() ) }); }); </script> <textarea style="display:none" name="<?php echo esc_html( $fieldname ) ?>"><?php echo $value ?></textarea> <?php } /** * Check if a step has any fields * @param string $page * @param bool $step * @param bool $section * * @return bool */ public function step_has_fields( $page, $step = false, $section = false ) { $fields = RSSSL_LE()->config->fields( $page, $step, $section ); foreach ( $fields as $fieldname => $args ) { $default_args = $this->default_args; $args = wp_parse_args( $args, $default_args ); $args['fieldname'] = $fieldname; if ( $this->show_field( $args ) ) { return true; } } return false; } public function get_fields( $source, $step = false, $section = false, $get_by_fieldname = false ) { $fields = RSSSL_LE()->config->fields( $source, $step, $section, $get_by_fieldname ); $i = 0; foreach ( $fields as $fieldname => $args ) { if ( $i === 0 ) { $args['first'] = true; } $i ++; $default_args = $this->default_args; $args = wp_parse_args( $args, $default_args ); $type = ( $args['callback'] ) ? 'callback' : $args['type']; $args['fieldname'] = $fieldname; switch ( $type ) { case 'callback': $this->callback( $args ); break; case 'text': $this->text( $args ); break; case 'password': $this->password( $args ); break; case 'button': $this->button( $args ); break; case 'upload': $this->upload( $args ); break; case 'url': $this->url( $args ); break; case 'select': $this->select( $args ); break; case 'checkbox': $this->checkbox( $args ); break; case 'textarea': $this->textarea( $args ); break; case 'radio': $this->radio( $args ); break; case 'javascript': $this->javascript( $args ); break; case 'css': $this->css( $args ); break; case 'email': $this->email( $args ); break; case 'phone': $this->phone( $args ); break; case 'number': $this->number( $args ); break; case 'notice': $this->notice( $args ); break; case 'editor': $this->editor( $args, $step ); break; case 'label': $this->label( $args ); break; } } } public function callback( $args ) { $callback = $args['callback']; do_action( 'rsssl_before_label', $args ); do_action( 'rsssl_label_html' , $args ); do_action( 'rsssl_after_label', $args ); $file = trailingslashit(rsssl_le_wizard_path) . 'templates/' . $callback; if ( file_exists($file) ) { echo RSSSL()->really_simple_ssl->get_template($callback, $path = rsssl_le_wizard_path); } else { do_action( "rsssl_$callback", $args ); } do_action( 'rsssl_after_field', $args ); } public function notice( $args ) { if ( ! $this->show_field( $args ) ) { return; } do_action( 'rsssl_before_label', $args ); rsssl_notice( $args['label'], 'warning' ); do_action( 'rsssl_after_label', $args ); do_action( 'rsssl_after_field', $args ); } public function select( $args ) { $fieldname = 'rsssl_' . $args['fieldname']; $value = $this->get_value( $args['fieldname'], $args['default'] ); if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <select class="rsssl-select2" <?php if ( $args['required'] ) { echo 'required'; } ?> name="<?php echo esc_html( $fieldname ) ?>"> <?php foreach ( $args['options'] as $option_key => $option_label ) { ?> <option value="<?php echo esc_html( $option_key ) ?>" <?php echo ( $option_key == $value ) ? "selected" : "" ?>><?php echo esc_html( $option_label ) ?></option> <?php } ?> </select> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function label( $args ) { $fieldname = 'rsssl_' . $args['fieldname']; if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } /** * * Button/Action field * * @param $args * * @echo string $html */ public function button( $args ) { $fieldname = 'rsssl_' . $args['fieldname']; if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <?php if ( $args['post_get'] === 'get' ) { ?> <a <?php if ( $args['disabled'] ) echo "disabled" ?>href="<?php echo $args['disabled'] ? "#" : rsssl_letsencrypt_wizard_url().'&action=' . $args['action'] ?>" class="button"><?php echo esc_html( $args['label'] ) ?></a> <?php } else { ?> <input <?php if ( $args['warn'] ) echo 'onclick="return confirm(\'' . $args['warn'] . '\');"' ?> <?php if ( $args['disabled'] ) echo "disabled" ?> class="button" type="submit" name="<?php echo $args['action'] ?>" value="<?php echo esc_html( $args['label'] ) ?>"> <?php } ?> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } /** * Upload field * * @param $args * * @echo string $html */ public function upload( $args ) { if ( ! $this->show_field( $args ) ) { return; } ?> <?php do_action( 'rsssl_before_label', $args ); ?> <?php do_action( 'rsssl_label_html' , $args );?> <?php do_action( 'rsssl_after_label', $args ); ?> <input type="file" type="submit" name="rsssl-upload-file" value="<?php echo esc_html( $args['label'] ) ?>"> <input <?php if ( $args['disabled'] ) echo "disabled" ?> class="button" type="submit" name="<?php echo $args['action'] ?>" value="<?php _e( 'Start', 'really-simple-ssl' ) ?>"> <?php do_action( 'rsssl_after_field', $args ); ?> <?php } public function save_button() { $button_text = __( "Save", 'really-simple-ssl' ); $button_name = 'rsssl-save'; $step = RSSSL_LE()->wizard->calculate_next('step'); $section = RSSSL_LE()->wizard->calculate_next('section'); $fields = RSSSL_LE()->config->fields( 'lets-encrypt', $step, $section); reset($fields); foreach ($fields as $key => $field ) { if (isset($field['callback']) && strpos($field['callback'], '.php')!==false) { $button_text = __( "Refresh", 'really-simple-ssl' ); $button_name = 'rsssl-refresh'; } } return '<input class="button button-secondary" type="submit" name="'.$button_name.'" value="'.$button_text.'">'; } /** * Get value of this fieldname * * @param $fieldname * @param string $default * * @return mixed */ public function get_value( $fieldname, $default = '' ) { $fields = RSSSL_LE()->config->fields(); if ( ! isset( $fields[ $fieldname ] ) ) { return false; } $source = $fields[ $fieldname ]['source']; $options = get_option( 'rsssl_options_' . $source ); $value = isset( $options[ $fieldname ] ) ? $options[ $fieldname ] : false; //if no value isset, pass a default $value = ( $value !== false ) ? $value : apply_filters( 'rsssl_default_value', $default, $fieldname ); return $value; } /** * Checks if a fieldname exists in the rsssl field list. * * @param string $fieldname * * @return bool */ public function sanitize_fieldname( $fieldname ) { $fields = RSSSL_LE()->config->fields(); if ( array_key_exists( $fieldname, $fields ) ) { return sanitize_text_field($fieldname); } return false; } public function get_comment( $args ) { if ( ! isset( $args['comment'] ) ) { return; } ?> <div class="rsssl-comment"><?php echo $args['comment'] ?></div> <?php } public function has_errors() { if ( count( $this->form_errors ) > 0 ) { return true; } return false; } } } //class closure wizard/config/steps.php 0000644 00000016026 15154444756 0011204 0 ustar 00 <?php defined( 'ABSPATH' ) or die( ); $this->steps = array( 'lets-encrypt' => array( 1 => array( "id" => "system-status", "title" => __( "System Status", 'really-simple-ssl' ), "intro" => __( "Detected status of your setup.", "really-simple-ssl" ), 'actions' => array( array( 'description' => __("Checking PHP version...", "really-simple-ssl"), 'action'=> 'rsssl_php_requirement_met', 'attempts' => 1, ), array( 'description' => __("Checking SSL certificate...", "really-simple-ssl"), 'action'=> 'certificate_status', 'attempts' => 1, ), array( 'description' => __("Checking if CURL is available...", "really-simple-ssl"), 'action'=> 'curl_exists', 'attempts' => 1, ), array( 'description' => __("Checking server software...", "really-simple-ssl"), 'action'=> 'server_software', 'attempts' => 1, ), array( 'description' => __("Checking alias domain...", "really-simple-ssl"), 'action'=> 'alias_domain_available', 'attempts' => 3, ), array( 'description' => __("Checking for website configuration...", "really-simple-ssl"), 'action'=> 'check_domain', 'attempts' => 1, ), ), ), 2 => array( "id" => "domain", "title" => __( "General settings", 'really-simple-ssl' ), 'intro' => '<p>'. sprintf(__('We have tried to make our Wizard as simple and fast as possible. Although these questions are all necessary, if there’s any way you think we can improve the plugin, please let us %sknow%s!', 'really-simple-ssl'),'<a target="_blank" href="https://really-simple-ssl.com/contact">', '</a>'). sprintf(__(' Please note that you can always save and finish the wizard later, use our %sdocumentation%s for additional information or log a %ssupport ticket%s if you need our assistance.', 'really-simple-ssl'),'<a target="_blank" href="https://really-simple-ssl.com/knowledge-base/generate-your-free-ssl-certificate/">', '</a>','<a target="_blank" href="https://wordpress.org/support/plugin/really-simple-ssl/">', '</a>').'</p>', 'sections' => array ( 1 => array( 'title' => __( 'Domain', 'really-simple-ssl' ), 'intro' => __( 'Letʼs Encrypt is a free, automated and open certificate authority brought to you by the nonprofit Internet Security Research Group (ISRG).', 'really-simple-ssl' ). rsssl_read_more( 'https://really-simple-ssl.com/about-lets-encrypt/' ), ), 2 => array( 'title' => __( 'Hosting', 'really-simple-ssl' ), 'intro' => __( 'Below you will find the instructions for different hosting environments and configurations. If you start the process with the necessary instructions and credentials the next view steps will be done in no time.', 'really-simple-ssl'), ), ), 'actions' => array(), ), 3 => array( "id" => "directories", "title" => __( "Directories", 'really-simple-ssl' ), 'actions' => array( array( 'description' => __("Checking challenge directory...", "really-simple-ssl"), 'action'=> 'check_challenge_directory', 'attempts' => 1, 'speed' => 'normal', ), array( 'description' => __("Checking key directory...", "really-simple-ssl"), 'action'=> 'check_key_directory', 'attempts' => 2, 'speed' => 'normal', ), array( 'description' => __("Checking certs directory...", "really-simple-ssl"), 'action'=> 'check_certs_directory', 'attempts' => 1, 'speed' => 'normal', ), array( 'description' => __("Checking permissions...", "really-simple-ssl"), 'action'=> 'check_writing_permissions', 'attempts' => 1, 'speed' => 'normal', ), array( 'description' => __("Checking challenge directory reachable over http...", "really-simple-ssl"), 'action'=> 'challenge_directory_reachable', 'attempts' => 1, 'speed' => 'normal', ), ), ), 4 => array( "id" => "dns-verification", "title" => __( "DNS Verification", 'really-simple-ssl' ), 'actions' => array( array( 'description' => __("Creating account...", "really-simple-ssl"), 'action'=> 'get_account', 'attempts' => 5, 'speed' => 'normal', ), array( 'description' => __("Retrieving DNS verification token...", "really-simple-ssl"), 'action'=> 'get_dns_token', 'attempts' => 5, 'speed' => 'normal', ), ), ), 5 => array( "id" => "generation", "title" => __( "Generation", 'really-simple-ssl' ), "intro" => __( "We will now generate your SSL Certificate", "really-simple-ssl" ), 'actions' => array( array( 'description' => __("Checking if Terms & Conditions are accepted...", "really-simple-ssl"), 'action'=> 'terms_accepted', 'attempts' => 1, 'speed' => 'normal', ), array( 'description' => __("Creating account...", "really-simple-ssl"), 'action'=> 'get_account', 'attempts' => 5, 'speed' => 'normal', ), array( 'description' => __("Generating SSL certificate...", "really-simple-ssl"), 'action'=> 'create_bundle_or_renew', 'attempts' => 5, 'speed' => 'normal', ), ), ), 6 => array( "id" => "installation", "title" => __( "Installation", 'really-simple-ssl' ), 'actions' => array( array( 'description' => __("Searching for link to SSL installation page on your server...", "really-simple-ssl"), 'action'=> 'search_ssl_installation_url', 'attempts' => 1, 'speed' => 'normal', ), ), ), 7 => array( "id" => "activation", "title" => __( "Activate SSL", 'really-simple-ssl' ), 'actions' => array(), ), ), ); wizard/config/class-config.php 0000644 00000065324 15154444756 0012423 0 ustar 00 <?php defined( 'ABSPATH' ) or die( ); if ( ! class_exists( "rsssl_config" ) ) { class rsssl_config { private static $_this; public $fields = array(); public $sections; public $pages; public $steps; public $hosts; public $warning_types; public $yes_no; public $supported_hosts; public $not_local_certificate_hosts; public $no_installation_renewal_needed; public $dashboard_activation_required; public $activated_by_default; public $paid_only; function __construct() { define('RSSSL_LE_CONFIG_LOADED', true); if ( isset( self::$_this ) ) { wp_die( sprintf( '%s is a singleton class and you cannot create a second instance.', get_class( $this ) ) ); } self::$_this = $this; /** * Plesk requires local SSL generation, and installation renewal. * Cpanel default requires local SSL generation, and installation renewal. * Cpanel autossl: no local ssl generation, no renewal */ $this->hosts = array( 'cloudways' => array( 'name' => 'CloudWays', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => false, 'hosting_dashboard' => 'cloudways', 'api' => true, 'ssl_installation_link' => false, ), 'tierpoint' => array( 'name' => 'TierPoint', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => true, 'ssl_installation_link' => false, ), 'godaddy' => array( 'name' => 'GoDaddy', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'godaddy_managed' => array( 'name' => 'GoDaddy Managed WordPress', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => 'godaddymanaged', 'api' => false, 'ssl_installation_link' => false, ), 'kasserver' => array( 'name' => 'Kasserver', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'kasserver', 'api' => false, 'ssl_installation_link' => 'https://kas.all-inkl.com/', ), 'argeweb' => array( 'name' => 'Argeweb', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'plesk', 'api' => false, 'ssl_installation_link' => 'https://www.argeweb.nl/argecs/', ), 'hostgator' => array( 'name' => 'HostGator', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => true, 'hosting_dashboard' => 'cpanel:autossl', 'api' => true, 'ssl_installation_link' => 'https://{host}:2083/frontend/paper_lantern/security/tls_status/', ), 'ionos' => array( 'name' => 'IONOS', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'ionos', 'api' => false, 'ssl_installation_link' => '', ), 'simply' => array( 'name' => 'Simply', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => false, 'api' => false, 'ssl_installation_link' => 'https://www.simply.com/en/controlpanel/sslcerts/', ), 'siteground' => array( 'name' => 'SiteGround', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => false, 'api' => false, 'ssl_installation_link' => 'https://tools.siteground.com/ssl', ), 'dreamhost' => array( 'name' => 'Dreamhost', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => false, 'api' => false, 'ssl_installation_link' => 'https://help.dreamhost.com/hc/en-us/articles/216539548-Adding-a-free-Let-s-Encrypt-certificate', ), 'wpengine' => array( 'name' => 'WPEngine', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => false, 'api' => false, 'ssl_installation_link' => 'https://wpengine.com/support/add-ssl-site/#letsencrypt', ), 'ipage' => array( 'name' => 'iPage', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => false, 'api' => false, 'ssl_installation_link' => 'https://www.ipage.com/help/article/enable-your-free-ssl-certificate', ), 'onecom' => array( 'name' => 'one.com', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => false, 'api' => false, 'ssl_installation_link' => 'https://help.one.com/hc/en-us/articles/360000297458-Why-is-SSL-HTTPS-not-working-on-my-site-', ), 'wpmudev' => array( 'name' => 'WPMUDEV', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => false, 'api' => false, 'ssl_installation_link' => 'https://wpmudev.com', ), 'ovh' => array( 'name' => 'OVH', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => 'https://ovh.com', ), 'freeola' => array( 'name' => 'Freeola', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'freeola', 'api' => false, 'ssl_installation_link' => '', ), 'hostinger' => array( 'name' => 'Hostinger', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'hpanel', 'api' => false, 'ssl_installation_link' => 'https://hpanel.hostinger.com/hosting/{domain}advanced/ssl', ), 'pcextreme' => array( 'name' => 'PCExtreme', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => 'directadmin', 'api' => false, 'ssl_installation_link' => 'https://help.pcextreme.nl/domains-ssl/hoe-vraag-ik-een-ssl-certificaat-aan-voor-mijn-domein/', ), 'internic' => array( 'name' => 'Internic', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => 'internic', 'api' => false, 'ssl_installation_link' => 'https://internic.com', ), 'aruba' => array( 'name' => 'Aruba', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'aruba', 'api' => false, 'ssl_installation_link' => 'https://admin.aruba.it/PannelloAdmin/UI/Pages/ContentSection.aspx?Action=153', ), 'namecheap' => array( 'name' => 'Namecheap', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => 'https://www.namecheap.com/blog/install-free-ssls/', ), 'hostpapa' => array( 'name' => 'Hostpapa', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'webcom' => array( 'name' => 'web.com', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'web.com', 'api' => false, 'ssl_installation_link' => false, ), 'crazydomains' => array( 'name' => 'Crazydomains', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'crazydomains', 'api' => false, 'ssl_installation_link' => false, ), 'strato' => array( 'name' => 'Strato', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'plesk', 'api' => false, 'ssl_installation_link' => false, ), 'inmotion' => array( 'name' => 'Inmotion', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => 'https://www.inmotionhosting.com/support/website/ssl/auto-ssl-guide/', ), 'flywheel' => array( 'name' => 'Flywheel', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'flywheel', 'api' => false, 'ssl_installation_link' => 'https://getflywheel.com/why-flywheel/simple-ssl/', ), 'kinsta' => array( 'name' => 'Kinsta', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'mykinsta', 'api' => false, 'ssl_installation_link' => false, ), 'pressable' => array( 'name' => 'Pressable', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'pressable', 'api' => false, 'ssl_installation_link' => false, ), 'wpx' => array( 'name' => 'WPX', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'wpx', 'api' => false, 'ssl_installation_link' => false, ), 'greengeeks' => array( 'name' => 'Greengeeks', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'greengeeks', 'api' => false, 'ssl_installation_link' => 'https://www.greengeeks.com/support/article/getting-started-adding-lets-encrypt-ssl-greengeeks-account/', ), 'liquidweb' => array( 'name' => 'Liquidweb', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'profreehost' => array( 'name' => 'Profreehost', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => 'https://profreehost.com/support/ssl-https/how-to-install-an-ssl-certificate/', ), 'hostdash' => array( 'name' => 'Hostdash', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'byethost' => array( 'name' => 'Byethost', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => 'byethost', 'api' => false, 'ssl_installation_link' => false, ), 'site5' => array( 'name' => 'Site5', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => '', ), 'epizy' => array( 'name' => 'Epizy', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => '', ), 'infinityfree' => array( 'name' => 'Infinityfree', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => '', ), 'gandi' => array( 'name' => 'Gandi', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'gandi', 'api' => false, 'ssl_installation_link' => false, ), 'contabo' => array( 'name' => 'Contabo', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => true, 'hosting_dashboard' => 'cpanel:autossl', 'api' => true, 'ssl_installation_link' => 'https://{host}:2083/frontend/paper_lantern/security/tls_status/', ), 'earthlink' => array( 'name' => 'Earthlink', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => true, 'ssl_installation_link' => false, ), 'hostway' => array( 'name' => 'Hostway', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'beget' => array( 'name' => 'Beget', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'beget', 'api' => false, 'ssl_installation_link' => false, ), 'fatcow' => array( 'name' => 'Fatcow', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'fatcow', 'api' => false, 'ssl_installation_link' => false, ), 'ventraip' => array( 'name' => 'Ventraip', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activated_by_default', 'hosting_dashboard' => 'cpanel:autossl', 'api' => false, 'ssl_installation_link' => 'https://{host}:2083/frontend/paper_lantern/security/tls_status/', ), 'namescouk' => array( 'name' => 'Names.co.uk', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'mediatemple' => array( 'name' => 'Mediatemple', 'installation_renewal_required' => true, 'local_ssl_generation_needed' => true, 'free_ssl_available' => false, 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'digitalocean' => array( 'name' => 'Digitalocean', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'digitalocean', 'api' => false, 'ssl_installation_link' => 'https://docs.digitalocean.com/products/accounts/security/certificates/', ), 'fisthost' => array( 'name' => 'Fisthost', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'fisthost', 'api' => false, 'ssl_installation_link' => 'https://my.fisthost.com/knowledgebase/6/How-do-I-activate-my-free-SSL.html', ), 'register' => array( 'name' => 'register.lk', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'paid_only', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => '', ), 'fasthosts' => array( 'name' => 'Fasthosts', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'cpanel', 'api' => false, 'ssl_installation_link' => false, ), 'upress' => array( 'name' => 'Upress', 'installation_renewal_required' => false, 'local_ssl_generation_needed' => false, 'free_ssl_available' => 'activation_required', 'hosting_dashboard' => 'false', 'api' => false, 'ssl_installation_link' => 'https://support.upress.io', ), ); $this->not_local_certificate_hosts = $this->filter_hosts( 'local_ssl_generation_needed', false); $this->dashboard_activation_required = $this->filter_hosts( 'free_ssl_available', 'activation_required'); $this->activated_by_default = $this->filter_hosts( 'free_ssl_available', 'activated_by_default'); $this->paid_only = $this->filter_hosts( 'free_ssl_available', 'paid_only'); $this->no_installation_renewal_needed = $this->filter_hosts( 'installation_renewal_required', false); $this->no_installation_renewal_needed[] = 'cpanel:autossl'; $this->yes_no = array( 'yes' => __( 'Yes', 'really-simple-ssl' ), 'no' => __( 'No', 'really-simple-ssl' ), ); ksort($this->hosts); $this->supported_hosts = array( 'none' => __('I don\'t know, or not listed, proceed with installation', 'really-simple-ssl'), ); $this->supported_hosts = $this->supported_hosts + wp_list_pluck($this->hosts, 'name'); /* config files Load only on lets encrypt generation pages, or during cron. */ if ( rsssl_letsencrypt_generation_allowed(true) ) { require_once( rsssl_le_path . 'wizard/config/steps.php' ); require_once( rsssl_le_path . 'wizard/config/questions.php' ); /** * Preload fields with a filter, to allow for overriding types */ add_action( 'plugins_loaded', array( $this, 'preload_init' ), 10 ); /** * The integrations are loaded with priority 10 * Because we want to initialize after that, we use 15 here */ add_action( 'plugins_loaded', array( $this, 'init' ), 15 ); } } static function this() { return self::$_this; } /** * @param array $array * @param mixed $filter_value * @param mixed $filter_key * * @return array */ public function filter_hosts( $filter_key, $filter_value){ return array_keys(array_filter($this->hosts, function ($var) use ($filter_value, $filter_key) { return ($var[$filter_key] == $filter_value); }) ); } /** * @param string | bool $type * * @return bool */ public function host_api_supported( $type ) { $hosting_company = rsssl_get_other_host(); //if not listed, we assume it can. if ( !$hosting_company || $hosting_company === 'none' ) { return true; } $hosts_has_dashboard = RSSSL_LE()->config->filter_hosts( 'api', $type); if ( in_array($hosting_company, $hosts_has_dashboard) ) { return true; } else { return false; } } public function fields( $page = false, $step = false, $section = false, $get_by_fieldname = false ) { $output = array(); $fields = $this->fields; if ( $page ) { $fields = rsssl_array_filter_multidimensional( $this->fields, 'source', $page ); } foreach ( $fields as $fieldname => $field ) { if ( $get_by_fieldname && $fieldname !== $get_by_fieldname ) { continue; } if ( $step ) { if ( $section && isset( $field['section'] ) ) { if ( ( $field['step'] == $step || ( is_array( $field['step'] ) && in_array( $step, $field['step'] ) ) ) && ( $field['section'] == $section ) ) { $output[ $fieldname ] = $field; } } else { if ( ( $field['step'] == $step ) || ( is_array( $field['step'] ) && in_array( $step, $field['step'] ) ) ) { $output[ $fieldname ] = $field; } } } if ( ! $step ) { $output[ $fieldname ] = $field; } } return $output; } public function has_sections( $page, $step ) { if ( isset( $this->steps[ $page ][ $step ]["sections"] ) ) { return true; } return false; } public function preload_init(){ $this->fields = apply_filters( 'rsssl_fields_load_types', $this->fields ); $this->steps = apply_filters( 'rsssl_steps', $this->steps ); } public function init() { $this->fields = apply_filters( 'rsssl_fields', $this->fields ); } } } //class closure wizard/config/questions.php 0000644 00000030302 15154444756 0012071 0 ustar 00 <?php defined( 'ABSPATH' ) or die( ); /* * condition: if a question should be dynamically shown or hidden, depending on another answer. Use NOT answer to hide if not answer. * callback_condition: if should be shown or hidden based on an answer in another screen. * callback roept action rsssl_$page_$callback aan * required: verplicht veld. * help: helptext die achter het veld getoond wordt. "fieldname" => '', "type" => 'text', "required" => false, 'default' => '', 'label' => '', 'table' => false, 'callback_condition' => false, 'condition' => false, 'callback' => false, 'placeholder' => '', 'optional' => false, * */ $this->fields = $this->fields + array( 'system_status' => array( 'step' => 1, 'section' => 1, 'source' => 'lets-encrypt', 'callback' => 'system-status.php', ), 'email_address' => array( 'step' => 2, 'section' => 1, 'source' => 'lets-encrypt', 'type' => 'email', 'default' => get_option('admin_email'), 'tooltip' => __( "This email address will used to create a Let's Encrypt account. This is also where you will receive renewal notifications.", 'really-simple-ssl' ), 'tooltip-position' => 'title', 'label' => __( "Email address", 'really-simple-ssl' ), 'sublabel' => __("This field is prefilled based on your configuration", 'really-simple-ssl'), 'required' => true, ), 'accept_le_terms' => array( 'step' => 2, 'section' => 1, 'source' => 'lets-encrypt', 'type' => 'checkbox', 'default' => '', 'title' => __('Terms & Conditions',"really-simple-ssl"), 'option_text' => sprintf(__("I agree to the Let's Encrypt %sTerms & Conditions%s", 'really-simple-ssl'),'<a target="_blank" href="https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf">','</a>'), ), 'disable_ocsp' => array( 'step' => 2, 'section' => 1, 'source' => 'lets-encrypt', 'type' => 'checkbox', 'default' => '', 'help' => __( "OCSP stapling should be enabled by default. You can disable if this is not supported by your hosting provider.","really-simple-ssl").rsssl_read_more('https://really-simple-ssl.com/ocsp-stapling'), 'title' => __('OCSP Stapling',"really-simple-ssl"), 'option_text' => __("Disable OCSP Stapling", 'really-simple-ssl'), ), 'domain' => array( 'step' => 2, 'section' => 1, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => rsssl_get_domain(), 'label' => __( "Domain", 'really-simple-ssl' ), 'sublabel' => __("This field is prefilled based on your configuration", 'really-simple-ssl'), 'required' => false, 'disabled' => true, ), 'include_alias' => array( 'step' => 2, 'section' => 1, 'source' => 'lets-encrypt', 'type' => 'checkbox', 'default' => '', 'tooltip' => __( "This will include both the www. and non-www. version of your domain.", "really-simple-ssl").' '.__("You should have the www domain pointed to the same website as the non-www domain.", 'really-simple-ssl' ), 'tooltip-position' => 'after', 'option_text' => __("Include alias domain too?", 'really-simple-ssl'), 'callback_condition' => array( 'NOT rsssl_is_subdomain', 'NOT rsssl_wildcard_certificate_required', ) ), 'other_host_type' => array( 'step' => 2, 'section' => 1, 'source' => 'lets-encrypt', 'type' => 'select', 'tooltip' => __( "By selecting your hosting provider we can tell you if your hosting provider already supports free SSL, and how you can activate it.", "really-simple-ssl"), 'options' => $this->supported_hosts, 'help' => __( "By selecting your hosting provider we can tell you if your hosting provider already supports free SSL, and/or where you can activate it.","really-simple-ssl")." ". sprintf(__("If your hosting provider is not listed, and there's an SSL activation/installation link, please let us %sknow%s.","really-simple-ssl"),'<a target="_blank" href="https://really-simple-ssl.com/install-ssl-certificate/#hostingdetails">','</a>'), 'default' => false, 'label' => __( "Hosting provider", 'really-simple-ssl' ), 'required' => true, 'disabled' => false, ), 'cpanel_host' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => '', 'label' => __( "CPanel host", 'really-simple-ssl' ), 'help' => __( "The URL you use to access your cPanel dashboard. Ends on :2083.", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_is_cpanel', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'cpanel_username' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => '', 'label' => __( "CPanel username", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_cpanel_api_supported', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'cpanel_password' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'password', 'default' => '', 'label' => __( "CPanel password", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_cpanel_api_supported', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'directadmin_host' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => '', 'label' => __( "DirectAdmin host", 'really-simple-ssl' ), 'help' => __( "The URL you use to access your DirectAdmin dashboard. Ends on :2222.", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_is_directadmin', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'directadmin_username' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => '', 'label' => __( "DirectAdmin username", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_is_directadmin', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'directadmin_password' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'password', 'default' => '', 'label' => __( "DirectAdmin password", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_is_directadmin', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'cloudways_user_email' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => '', 'placeholder' => 'email@email.com', 'label' => __( "CloudWays user email", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'other_host_type' => 'cloudways' ), ), 'cloudways_api_key' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'password', 'default' => '', 'label' => __( "CloudWays api key", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'comment' => sprintf(__("You can find your api key %shere%s (make sure you're logged in with your main account).","really-simple-ssl"),'<a target="_blank" href="https://platform.cloudways.com/api">','</a>'), 'callback_condition' => array( 'other_host_type' => 'cloudways' ) ), 'plesk_host' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => '', 'label' => __( "Plesk host", 'really-simple-ssl' ), 'help' => __( "The URL you use to access your Plesk dashboard. Ends on :8443.", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_is_plesk', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'plesk_username' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'text', 'default' => '', 'label' => __( "Plesk username", 'really-simple-ssl' ), 'help' => sprintf(__( "You can find your Plesk username and password in %s", 'really-simple-ssl' ),'https://{your-plesk-host-name}:8443/smb/my-profile'), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_is_plesk', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'plesk_password' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'password', 'default' => '', 'label' => __( "Plesk password", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_is_plesk', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ) ), 'store_credentials' => array( 'step' => 2, 'section' => 2, 'source' => 'lets-encrypt', 'type' => 'checkbox', 'default' => '', 'title' => __( "Credentials storage", 'really-simple-ssl' ), 'option_text' => __( "Store for renewal purposes. If not stored, renewal may need to be done manually.", 'really-simple-ssl' ), 'required' => false, 'disabled' => false, 'callback_condition' => array( 'rsssl_uses_known_dashboard', 'NOT rsssl_activated_by_default', 'NOT rsssl_activation_required', 'NOT rsssl_paid_only', ), ), 'directories' => array( 'step' => 3, 'section' => 1, 'source' => 'lets-encrypt', 'callback' => 'directories.php', 'callback_condition' => 'rsssl_do_local_lets_encrypt_generation' ), 'dns-verification' => array( 'step' => 4, 'section' => 1, 'source' => 'lets-encrypt', 'callback' => 'dns-verification.php', 'callback_condition' => 'rsssl_dns_verification_required' ), 'generation' => array( 'step' => 5, 'section' => 1, 'source' => 'lets-encrypt', 'callback' => 'generation.php', 'callback_condition' => 'rsssl_do_local_lets_encrypt_generation' ), 'installation' => array( 'step' => 6, 'section' => 1, 'source' => 'lets-encrypt', 'callback' => 'installation.php', ), 'activate_ssl' => array( 'step' => 7, 'source' => 'lets-encrypt', 'callback' => 'activate.php', ), ); wizard/notices.php 0000644 00000016073 15154444756 0010247 0 ustar 00 <?php add_action( 'rsssl_notice_include_alias', 'rsssl_notice_include_alias', 10, 1 ); function rsssl_notice_include_alias( $args ) { if (!rsssl_is_subdomain() && !RSSSL_LE()->letsencrypt_handler->alias_domain_available() ) { if (strpos(site_url(), 'www.') !== false ) { rsssl_sidebar_notice( __( "The non-www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well.", 'complianz-gdpr' ), 'warning' ); } else { rsssl_sidebar_notice( __( "The www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well.", 'complianz-gdpr' ), 'warning' ); } } } /** * Show notice if certificate needs to be renewed. * * @param array $notices * * @return array */ function rsssl_le_get_notices_list($notices) { //expiration date requests are cached. $valid = RSSSL()->rsssl_certificate->is_valid(); $certinfo = get_transient( 'rsssl_certinfo' ); $end_date = isset( $certinfo['validTo_time_t'] ) ? $certinfo['validTo_time_t'] : false; //if the certificate expires within the grace period, allow renewal //e.g. expiry date 30 may, now = 10 may => grace period 9 june. $expiry_date = ! empty( $end_date ) ? date( get_option( 'date_format' ), $end_date ) : false; $renew_link = rsssl_letsencrypt_wizard_url(); $link_open = '<a href="' . $renew_link . '">'; $ssl_generate_url = add_query_arg( array( "page" => "rlrsssl_really_simple_ssl", "tab" => "letsencrypt" ), admin_url( "options-general.php" ) ); $ssl_download_url = add_query_arg( array( "step" => 6), $ssl_generate_url ); if ( rsssl_generated_by_rsssl() ) { if ( $expiry_date ) { $notices['ssl_detected'] = array( 'condition' => array( 'rsssl_ssl_enabled' ), 'callback' => 'RSSSL()->rsssl_certificate->about_to_expire', 'score' => 10, 'output' => array( 'false' => array( 'msg' => sprintf( __( "Your certificate is valid to: %s", "really-simple-ssl" ), $expiry_date ), 'icon' => 'success' ), 'true' => array( 'msg' => sprintf( __( "Your certificate will expire on %s. You can renew it %shere%s.", "really-simple-ssl" ), $expiry_date, $link_open, '</a>' ), 'icon' => 'open', 'plusone' => true, 'dismissible' => false, ), ), ); } $notices['certificate_installation'] = array( 'condition' => array( 'rsssl_ssl_enabled', 'RSSSL()->rsssl_certificate->about_to_expire' ), 'callback' => 'RSSSL_LE()->letsencrypt_handler->certificate_renewal_status_notice', 'score' => 10, 'output' => array( 'automatic-installation-failed' => array( 'msg' => sprintf( __( "The automatic installation of your certificate has failed. Please check your credentials, and retry the %sinstallation%s.", "really-simple-ssl" ), '<a href="' . rsssl_letsencrypt_wizard_url() . '">', '</a>' ), 'icon' => 'open', 'plusone' => true, 'dismissible' => false, ), 'manual-installation' => array( 'msg' => sprintf( __( "The SSL certificate has been renewed, and requires manual %sinstallation%s in your hosting dashboard.", "really-simple-ssl" ), '<a href="' . $ssl_download_url . '">', '</a>' ), 'icon' => 'open', 'plusone' => true, 'dismissible' => false, ), 'manual-generation' => array( 'msg' => sprintf( __( "Automatic renewal of your certificate was not possible. The SSL certificate should be %srenewed%s manually.", "really-simple-ssl" ), '<a href="' . $ssl_generate_url . '">', '</a>' ), 'icon' => 'open', 'plusone' => true, 'dismissible' => false, ), 'automatic' => array( 'msg' => __( "Your certificate will be renewed and installed automatically.", "really-simple-ssl" ), 'icon' => 'open', 'plusone' => true, 'dismissible' => false, ), ), ); } $notices['can_use_shell'] = array( 'condition' => array('rsssl_can_install_shell_addon' , 'RSSSL()->rsssl_certificate->about_to_expire'), 'callback' => '_true_', 'score' => 10, 'output' => array( 'true' => array( 'msg' => __( "Your server provides shell functionality, which offers additional methods to install SSL. If installing SSL using the default methods is not possible, you can install the shell add on.", "really-simple-ssl" ) . ' ' . '<a href="https://really-simple-ssl.com/installing-ssl-using-shell-functions">' . __("Read more about this add on.","really-simple-ssl") . '</a>', 'icon' => 'open', 'plusone' => true, 'dismissible' => true, ), ), ); if ( get_option( 'rsssl_create_folders_in_root' ) ) { if ( ! get_option( 'rsssl_htaccess_file_set_key' ) || ! get_option( 'rsssl_htaccess_file_set_certs' ) || ! get_option( 'rsssl_htaccess_file_set_ssl' ) ) { $notices['root_files_not_protected'] = array( 'condition' => array( 'rsssl_ssl_enabled' ), 'callback' => '_true_', 'score' => 10, 'output' => array( 'true' => array( 'msg' => __( "Your Key and Certificate directories are not properly protected.", "really-simple-ssl" ) . rsssl_read_more( "https://really-simple-ssl.com/protect-ssl-generation-directories" ), 'icon' => 'warning', 'plusone' => true, 'dismissible' => true, ), ), ); } } return $notices; } add_filter( 'rsssl_notices', 'rsssl_le_get_notices_list', 30, 1 ); /** * DNS is only necessary for multisite with subdomains, or with domain mapping. * On other setups, directory verification is the easiest. * On cPanel, there are several subdirectories like mail. etc. which can only get an SSL with a wildcard cert. * For this reason, this option only appears when on cPanel * * @param $fields * * @return array */ function rsssl_le_custom_field_notices($fields){ if ( rsssl_is_cpanel() ) { if( get_option('rsssl_verification_type') === 'DNS' ) { $fields['email_address']['help'] = __("You have switched to DNS verification.","really-simple-ssl").' '. __("You can switch back to directory verification here.","really-simple-ssl"). '<br><br><button class="button button-default" name="rsssl-switch-to-directory">'.__("Switch to directory verification", "really-simple-ssl").'</button>'; } else { $fields['email_address']['help'] = sprintf(__("If you also want to secure subdomains like mail.domain.com, cpanel.domain.com, you have to use the %sDNS%s challenge.","really-simple-ssl"),'<a target="_blank" href="https://really-simple-ssl.com/lets-encrypt-authorization-with-dns">', '</a>').' '. __("Please note that auto-renewal with a DNS challenge might not be possible.","really-simple-ssl"). '<br><br><button class="button button-default" name="rsssl-switch-to-dns">'.__("Switch to DNS verification", "really-simple-ssl").'</button>'; } } return $fields; } add_filter( 'rsssl_fields', 'rsssl_le_custom_field_notices', 30, 1 ); wizard/templates/activate.php 0000644 00000007347 15154444756 0012405 0 ustar 00 <?php defined( 'ABSPATH' ) or die(); do_action('rsssl_le_activation'); //non cached SSL check. $response = RSSSL_LE()->letsencrypt_handler->certificate_status(); $certificate_is_valid = $response->status === 'error'; $already_enabled = RSSSL()->really_simple_ssl->ssl_enabled; $already_done = $certificate_is_valid && $already_enabled; if ($already_done) {?> <div class="rsssl-section"> <h2> <?php _e("Your site is secured with a valid SSL certificate!", "really-simple-ssl") . RSSSL()->rsssl_help->get_help_tip(__("In some cases it takes a few minutes for the certificate to get detected. In that case, check back in a few minutes.", "really-simple-ssl") ); ?> </h2> <?php _e("If you just activated SSL, please check for: ", 'really-simple-ssl'); ?> <p> <ul> <li class="rsssl-warning"><?php _e('Http references in your .css and .js files: change any http:// into https://', 'really-simple-ssl'); ?></li> <li class="rsssl-warning"><?php _e('Images, stylesheets or scripts from a domain without an SSL certificate: remove them or move to your own server.', 'really-simple-ssl'); ?></li> <li class="rsssl-success"><?php _e("SSL was already activated on your website!", "really-simple-ssl") ?></li> </ul> </p> <p><?php if (!defined('rsssl_pro_version')) { _e('You can also let the automatic scan of the pro version handle this for you, and get premium support, increased security with HSTS and more!', 'really-simple-ssl'); ?> <a target="_blank" href="<?php echo RSSSL()->really_simple_ssl->pro_url; ?>"><?php _e("Check out Really Simple SSL Pro", "really-simple-ssl"); } ?> </a> </p> </div> <?php } else { ?> <div class="rsssl-section"> <h2> <?php _e("Almost ready to activate SSL!", "really-simple-ssl") . RSSSL()->rsssl_help->get_help_tip(__("In some cases it takes a few minutes for the certificate to get detected. In that case, check back in a few minutes.", "really-simple-ssl") ); ?> </h2> <?php _e("Before you migrate, please check for: ", 'really-simple-ssl'); ?> <p> <ul> <li class="rsssl-warning"><?php _e('Http references in your .css and .js files: change any http:// into https://', 'really-simple-ssl'); ?></li> <li class="rsssl-warning"><?php _e('Images, stylesheets or scripts from a domain without an SSL certificate: remove them or move to your own server.', 'really-simple-ssl'); ?></li><?php $backup_link = "https://really-simple-ssl.com/knowledge-base/backing-up-your-site/"; $link_open = '<a target="_blank" href="'.$backup_link.'">'; $link_close = '</a>'; ?> <li class="rsssl-warning"><?php printf(__("We strongly recommend to create a %sbackup%s of your site before activating SSL", 'really-simple-ssl'), $link_open, $link_close); ?> </li> <li class="rsssl-warning"><?php _e("You may need to login in again.", "really-simple-ssl") ?></li> <?php if ($certificate_is_valid) { ?> <li class="rsssl-success"><?php _e("An SSL certificate has been detected", "really-simple-ssl") ?></li> <?php } else { ?> <li class="rsssl-error"><?php _e("No SSL certificate has been detected yet. In some cases this takes a few minutes.", "really-simple-ssl") ?></li> <?php }?> </ul> </p> <p><?php if (!defined('rsssl_pro_version')) { _e('You can also let the automatic scan of the pro version handle this for you, and get premium support, increased security with HSTS and more!', 'really-simple-ssl'); ?> <a target="_blank" href="<?php echo RSSSL()->really_simple_ssl->pro_url; ?>"><?php _e("Check out Really Simple SSL Pro", "really-simple-ssl"); } ?> </a> </p> </div> <?php } ?>