diff options
Diffstat (limited to '')
73 files changed, 2371 insertions, 250 deletions
diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..b27483c --- /dev/null +++ b/.hgignore @@ -0,0 +1,68 @@ +etherpad/etc/etherpad.spline.properties +.svn +.class +COMMIT_MSG +LAST_COMMIT +etherpad/data/ +etherpad/appjet-eth-dev.jar +infrastructure/build/appjet.jar +infrastructure/build/net/appjet/ajstdlib/streaming-client.js +infrastructure/build/net/appjet/ajstdlib/streaming-iframe.html +infrastructure/build/t +infrastructure/buildcache/JAR-etherpad/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor +infrastructure/buildcache/JAR-etherpad/org/jfree/base/jcommon.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/base/log/module.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_de.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_es.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_fr.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_it.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_nl.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_pl.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_pt_BR.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_pt_PT.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_ru.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_zh_CN.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/LocalizationBundle_zh_TW.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_de.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_es.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_fr.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_nl.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_pl.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_pt_BR.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_pt_PT.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_ru.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/editor/LocalizationBundle_zh_CN.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/gorilla.jpg +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_de.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_es.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_fr.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_nl.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_pl.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_pt_PT.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_ru.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/chart/plot/LocalizationBundle_zh_CN.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/ui/LocalizationBundle.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/ui/LocalizationBundle_de.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/ui/LocalizationBundle_es.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/ui/LocalizationBundle_fr.properties +infrastructure/buildcache/JAR-etherpad/org/jfree/ui/LocalizationBundle_pt_PT.properties +infrastructure/buildcache/JAR-etherpad/org/mindrot/BCrypt.java +infrastructure/buildcache/JAR-etherpad/org/xbill/DNS/windows/DNSServer.properties +infrastructure/buildcache/JAR-etherpad/org/xbill/DNS/windows/DNSServer_de.properties +infrastructure/buildcache/JAR-etherpad/org/xbill/DNS/windows/DNSServer_fr.properties +infrastructure/buildcache/JAR-etherpad/org/xbill/DNS/windows/DNSServer_pl.properties +infrastructure/buildcache/JAR-etherpad/t +infrastructure/buildcache/JAR/appjet.jar +infrastructure/buildcache/JAR/t +infrastructure/buildcache/ajstdlib/t +infrastructure/buildcache/appserver/t +infrastructure/buildcache/bodylock/t +infrastructure/buildcache/cli/t +infrastructure/buildcache/common/t +infrastructure/buildcache/etherpad/t +infrastructure/buildcache/ooservice/t +infrastructure/buildcache/sars/t +infrastructure/lib/jdbc-mysql.jar diff --git a/etherpad/src/etherpad/billing/team_billing.js b/etherpad/src/etherpad/billing/team_billing.js index 54fd62a..ae8ae8a 100644 --- a/etherpad/src/etherpad/billing/team_billing.js +++ b/etherpad/src/etherpad/billing/team_billing.js @@ -401,7 +401,7 @@ function sendReceiptEmail(subscription, invoice) { globals: globals }); var address = paymentInfo.email; - checkout.salesEmail(address, "sales@etherpad.com", "EtherPad: Receipt for "+paymentInfo.fullname, + checkout.salesEmail(address, "sales@pad.spline.inf.fu-berlin.de", "EtherPad: Receipt for "+paymentInfo.fullname, {}, emailText); } @@ -414,9 +414,9 @@ function sendFailureEmail(subscription, invoice, failureMessage) { billingError: failureMessage, balance: "US $"+checkout.dollars(billing.centsToDollars(invoice.amt)), suspensionDate: checkout.formatDate(new Date(subscription.paidThrough.getTime()+GRACE_PERIOD_DAYS*86400*1000)), - billingAdminLink: "https://"+subDomain+".etherpad.com/ep/admin/billing/" + billingAdminLink: "https://"+subDomain+".pad.spline.inf.fu-berlin.de/ep/admin/billing/" }); var address = paymentInfo.email; - checkout.salesEmail(address, "sales@etherpad.com", "EtherPad: Payment Failure for "+paymentInfo.fullname, + checkout.salesEmail(address, "sales@pad.spline.inf.fu-berlin.de", "EtherPad: Payment Failure for "+paymentInfo.fullname, {}, emailText); }
\ No newline at end of file diff --git a/etherpad/src/etherpad/control/aboutcontrol.js b/etherpad/src/etherpad/control/aboutcontrol.js index 12265cf..9d77142 100644 --- a/etherpad/src/etherpad/control/aboutcontrol.js +++ b/etherpad/src/etherpad/control/aboutcontrol.js @@ -198,11 +198,11 @@ function render_eepnet_pricing_contact_post() { "This record has automatically been added to SalesForce. See the salesforce lead page for more details.", "", "Session Referer: "+ref, "" ].join("\n"); - var toAddr = 'sales@etherpad.com'; + var toAddr = 'sales@pad.spline.inf.fu-berlin.de'; if (isTestEmail(data.email)) { toAddr = 'blackhole@appjet.com'; } - sendEmail(toAddr, 'sales@etherpad.com', subject, {}, body); + sendEmail(toAddr, 'sales@pad.spline.inf.fu-berlin.de', subject, {}, body); // all done! response.write("OK"); diff --git a/etherpad/src/etherpad/control/global_pro_account_control.js b/etherpad/src/etherpad/control/global_pro_account_control.js index abc2994..65d2124 100644 --- a/etherpad/src/etherpad/control/global_pro_account_control.js +++ b/etherpad/src/etherpad/control/global_pro_account_control.js @@ -125,7 +125,7 @@ function render_recover_post() { response.redirect(_recoverLink(accountList[0], domainList[0])); } if (accountList.length > 1) { - var fromAddr = '"EtherPad Support" <support@etherpad.com>'; + var fromAddr = '"EtherPad" <noreply@pad.spline.inf.fu-berlin.de>'; var subj = "EtherPad: account information"; var body = renderTemplateAsString( 'pro/account/global-multi-domain-recover-email.ejs', { diff --git a/etherpad/src/etherpad/control/historycontrol.js b/etherpad/src/etherpad/control/historycontrol.js index 56fcb8e..a78cfad 100644 --- a/etherpad/src/etherpad/control/historycontrol.js +++ b/etherpad/src/etherpad/control/historycontrol.js @@ -86,7 +86,7 @@ function _do_stat(padId) { function _censorText(text) { // may not change length of text - return text.replace(/(http:\/\/etherpad.com\/)(\w+)/g, function(url, u1, u2) { + return text.replace(/(http:\/\/pad.spline.inf.fu-berlin.de\/)(\w+)/g, function(url, u1, u2) { return u1 + u2.replace(/\w/g, '-'); }); } diff --git a/etherpad/src/etherpad/control/pad/pad_control.js b/etherpad/src/etherpad/control/pad/pad_control.js index 2a6a1be..32ff8a3 100644 --- a/etherpad/src/etherpad/control/pad/pad_control.js +++ b/etherpad/src/etherpad/control/pad/pad_control.js @@ -611,8 +611,8 @@ function render_feedback_post() { feedback: request.params.feedback}); sendEmail( - 'feedback@etherpad.com', - 'feedback@etherpad.com', + 'feedback@pad.spline.inf.fu-berlin.de', + 'feedback@pad.spline.inf.fu-berlin.de', subject, {}, feedback @@ -635,7 +635,7 @@ function render_emailinvite_post() { {toEmails: toEmails, padId: padId, username: username, subject: subject, message: message}); - var fromAddr = '"EtherPad" <noreply@etherpad.com>'; + var fromAddr = '"EtherPad" <noreply@pad.spline.inf.fu-berlin.de>'; // client enforces non-empty subject and message var subj = '[EtherPad] '+subject; var body = renderTemplateAsString('email/padinvite.ejs', diff --git a/etherpad/src/etherpad/control/pro/admin/pro_admin_control.js b/etherpad/src/etherpad/control/pro/admin/pro_admin_control.js index 1364176..51d6ba3 100644 --- a/etherpad/src/etherpad/control/pro/admin/pro_admin_control.js +++ b/etherpad/src/etherpad/control/pro/admin/pro_admin_control.js @@ -264,7 +264,7 @@ function render_recover_padtext_get() { if (showPadHelp) { d.push(P({style: "font-size: 1em; color: #555;"}, 'The pad ID is the same as the URL to the pad, without the leading "/".', - ' For example, if the pad lives at http://etherpad.com/foobar,', + ' For example, if the pad lives at http://pad.spline.inf.fu-berlin.de/foobar,', ' then the pad ID is "foobar" (without the quotes).')) } diff --git a/etherpad/src/etherpad/control/pro/admin/team_billing_control.js b/etherpad/src/etherpad/control/pro/admin/team_billing_control.js index 9c5b4d0..5be6a0e 100644 --- a/etherpad/src/etherpad/control/pro/admin/team_billing_control.js +++ b/etherpad/src/etherpad/control/pro/admin/team_billing_control.js @@ -250,7 +250,7 @@ function _attemptAuthorization(success_f) { _validationError('', "A temporary error has prevented processing of your payment. Please try again later."); } else { billing.log({'type': 'FATAL', value: "Unknown error: "+result.status+" - debug: "+result.debug}); - sendEmail('support@etherpad.com', 'urgent@etherpad.com', 'UNKNOWN ERROR WARNING!', {}, + sendEmail('support@pad.spline.inf.fu-berlin.de', 'urgent@pad.spline.inf.fu-berlin.de', 'UNKNOWN ERROR WARNING!', {}, "Hey,\n\nThis is a billing system error. Some unknown error occurred. "+ "This shouldn't ever happen. Probably good to let J.D. know. <grin>\n\n"+ fastJSON.stringify(cart)); @@ -284,7 +284,7 @@ function _processNewSubscription() { }); if (globals.isProduction()) { - sendEmail('sales@etherpad.com', 'sales@etherpad.com', "EtherPad: New paid pro account for "+fullName, {}, + sendEmail('sales@pad.spline.inf.fu-berlin.de', 'sales@pad.spline.inf.fu-berlin.de', "EtherPad: New paid pro account for "+fullName, {}, "This is an automatic notification.\n\n"+fullName+" ("+email+") successfully set up "+ "a billing profile for domain: "+domainName+"."); } @@ -363,10 +363,10 @@ function _processInvoicePurchase() { "\nEmail: ", pro_accounts.getSessionProAccount().email ].join("\n"); - var recipient = (globals.isProduction() ? 'sales@etherpad.com' : 'jd@appjet.com'); + var recipient = (globals.isProduction() ? 'sales@pad.spline.inf.fu-berlin.de' : 'jd@appjet.com'); sendEmail( recipient, - 'sales@etherpad.com', + 'sales@pad.spline.inf.fu-berlin.de', 'Invoice payment request - '+pro_utils.getProRequestSubdomain(), {}, "Hi there,\n\nA pro user tried to pay by invoice. Their information follows."+ diff --git a/etherpad/src/etherpad/control/pro/pro_main_control.js b/etherpad/src/etherpad/control/pro/pro_main_control.js index f151091..b4e3bc4 100644 --- a/etherpad/src/etherpad/control/pro/pro_main_control.js +++ b/etherpad/src/etherpad/control/pro/pro_main_control.js @@ -70,7 +70,6 @@ function render_main() { renderFramed('pro/pro_home.ejs', { isEvaluation: licensing.isEvaluation(), - // evalExpDate: licensing.getLicense().expiresDate, account: getSessionProAccount(), isPNE: pne_utils.isPNE(), pneVersion: pne_utils.getVersionString(), diff --git a/etherpad/src/etherpad/control/pro_beta_control.js b/etherpad/src/etherpad/control/pro_beta_control.js index 518e710..ec99b43 100644 --- a/etherpad/src/etherpad/control/pro_beta_control.js +++ b/etherpad/src/etherpad/control/pro_beta_control.js @@ -121,7 +121,7 @@ function sendInvite(recordId) { signupCode: code, activationUrl: "http://"+httpHost(request.host)+"/ep/pro-signup/?sc="+code }); - sendEmail(record.email, "EtherPad <support@etherpad.com>", + sendEmail(record.email, "EtherPad <support@pad.spline.inf.fu-berlin.de>", "Your EtherPad Professional Beta Account", {}, body); }); diff --git a/etherpad/src/etherpad/control/pro_help_control.js b/etherpad/src/etherpad/control/pro_help_control.js deleted file mode 100644 index 675e976..0000000 --- a/etherpad/src/etherpad/control/pro_help_control.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright 2009 Google Inc. - * - * 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. - */ - -import("etherpad.utils.*"); -import("etherpad.globals.*"); -import("etherpad.billing.team_billing"); - -var _helpTopics = [ -/* ['essentials', "EtherPad Essentials"], */ - ['billing', "Account Quotas and Billing"], -/* ['guests', "Collaborating with Teammates and Guests"] */ -]; - -function onRequest() { - var pageId = request.path.split('/')[3]; - if (!pageId) { - _renderPage('main'); - return true; - } - for (var i = 0; i < _helpTopics.length; i++) { - var t = _helpTopics[i]; - if (t[0] == pageId) { - _renderPage(pageId); - return true; - } - } - - response.redirect('/ep/pro-help/'); -} - -function _renderPage(pageId) { - function renderContent() { - return renderTemplateAsString('pro-help/'+pageId+'.ejs', { - helpTopics: _helpTopics, - numFreeAccounts: PRO_FREE_ACCOUNTS, - pricePerAccount: team_billing.COST_PER_USER - }); - } - - renderFramed('pro-help/pro-help-template.ejs', { - renderContent: renderContent - }); -} - - - - diff --git a/etherpad/src/etherpad/control/pro_signup_control.js b/etherpad/src/etherpad/control/pro_signup_control.js index 9729d75..6bf7cc3 100644 --- a/etherpad/src/etherpad/control/pro_signup_control.js +++ b/etherpad/src/etherpad/control/pro_signup_control.js @@ -134,6 +134,8 @@ function render_main_post() { _err(pro_accounts.validateFullName(fullName)); _err(pro_accounts.validateEmail(email)); + + if (!(email.match(/[Ff][Uu]-[Bb][Ee][Rr][Ll][Ii][Nn].[Dd][Ee]$/))) { _err("Please use your *.fu-berlin.de email address."); } // _err(pro_accounts.validatePassword(password)); //---- database validation ---- diff --git a/etherpad/src/etherpad/control/statscontrol.js b/etherpad/src/etherpad/control/statscontrol.js index 435b7ac..3659107 100644 --- a/etherpad/src/etherpad/control/statscontrol.js +++ b/etherpad/src/etherpad/control/statscontrol.js @@ -101,7 +101,7 @@ var statDisplays = { // free pad usage { name: "free pad usage, 1 day", - description: "Free etherpad.com users, total over a %t period", + description: "Free pad.spline.inf.fu-berlin.de users, total over a %t period", type: "compare", stats: [ {stat: "active_user_ids", description: "All users", @@ -113,7 +113,7 @@ var statDisplays = { description: "Users returning after 30 days", color: "FF0000"} ] }, { name: "free pad usage, 7 day", - description: "Free etherpad.com users over the last 7 days", + description: "Free pad.spline.inf.fu-berlin.de users over the last 7 days", type: "compare", options: { hideLive: true, latestUseHistorical: true}, stats: [ {stat: "active_user_ids_7days", @@ -126,7 +126,7 @@ var statDisplays = { description: "Users returning after 30 days", color: "FF0000"} ] }, { name: "free pad usage, 30 day", - description: "Free etherpad.com users over the last 30 days", + description: "Free pad.spline.inf.fu-berlin.de users over the last 30 days", type: "compare", options: { hideLive: true, latestUseHistorical: true}, stats: [ {stat: "active_user_ids_30days", diff --git a/etherpad/src/etherpad/control/store/eepnet_checkout_control.js b/etherpad/src/etherpad/control/store/eepnet_checkout_control.js index eb18381..ddd4973 100644 --- a/etherpad/src/etherpad/control/store/eepnet_checkout_control.js +++ b/etherpad/src/etherpad/control/store/eepnet_checkout_control.js @@ -671,7 +671,7 @@ function _performCreditCardPurchase() { billing.log({'type': 'FATAL', value: "Direct purchase failed on paypal.", cart: cart, paypal: paypalResult}); if (result.errorField.permanentErrors[0] == 'invoiceId') { // repeat invoice id. damnit, this is bad. - sendEmail('support@etherpad.com', 'urgent@etherpad.com', 'DUPLICATE INVOICE WARNING!', {}, + sendEmail('support@pad.spline.inf.fu-berlin.de', 'urgent@pad.spline.inf.fu-berlin.de', 'DUPLICATE INVOICE WARNING!', {}, "Hey,\n\nThis is a billing system error. The EEPNET checkout tried to make a "+ "purchase with PayPal and got a duplicate invoice error on invoice ID "+cart.invoiceId+ ".\n\nUnless you're expecting this (or recently ran a selenium test, or have reason to "+ @@ -679,8 +679,8 @@ function _performCreditCardPurchase() { "and get back to the user ASAP!\n\n"+fastJSON.stringify(cart)); _validationError('', "Your payment was processed, but we cannot proceed. "+ "You will hear from us shortly via email. (If you don't hear from us "+ - "within 24 hours, please email <a href='mailto:sales@etherpad.com'>"+ - "sales@etherpad.com</a>.)"); + "within 24 hours, please email <a href='mailto:sales@pad.spline.inf.fu-berlin.de'>"+ + "sales@pad.spline.inf.fu-berlin.de</a>.)"); } checkout.validateErrorFields(function(x, y) { _validationError(x, y, 'billing-info') }, "There seems to be an error in your billing information."+ " Please verify and correct your ", @@ -690,7 +690,7 @@ function _performCreditCardPurchase() { _validationError('', "A temporary error has prevented processing of your payment. Please try again later."); } else { billing.log({'type': 'FATAL', value: "Unknown error: "+result.status+" - debug: "+result.debug}); - sendEmail('support@etherpad.com', 'urgent@etherpad.com', 'UNKNOWN ERROR WARNING!', {}, + sendEmail('support@pad.spline.inf.fu-berlin.de', 'urgent@pad.spline.inf.fu-berlin.de', 'UNKNOWN ERROR WARNING!', {}, "Hey,\n\nThis is a billing system error. Some unknown error occurred. "+ "This shouldn't ever happen. Probably good to let J.D. know. <grin>\n\n"+ fastJSON.stringify(cart)); diff --git a/etherpad/src/etherpad/helpers.js b/etherpad/src/etherpad/helpers.js index 54bee2d..3996a3b 100644 --- a/etherpad/src/etherpad/helpers.js +++ b/etherpad/src/etherpad/helpers.js @@ -198,8 +198,8 @@ function cssIncludes() { } function oemail(username) { - return '<<a class="obfuscemail" href="mailto:'+username+'@e***rp*d.com">'+ - username+'@e***rp*d.com</a>>'; + return '<<a class="obfuscemail" href="mailto:'+username+'@p*d.sp***e.inf.fu-berlin.de">'+ + username+'@p*d.sp***e.inf.fu-berlin.de</a>>'; } function googleAnalytics() { diff --git a/etherpad/src/etherpad/licensing.js b/etherpad/src/etherpad/licensing.js index d57fa4c..2337456 100644 --- a/etherpad/src/etherpad/licensing.js +++ b/etherpad/src/etherpad/licensing.js @@ -17,7 +17,7 @@ /* * This file used to control access restrictions for various sites like - * etherpad.com or on-prem installations of etherpad, or evaluation + * pad.spline.inf.fu-berlin.de or on-prem installations of etherpad, or evaluation * editions. For the open-source effort, I have gutted out the * restrictions. --aiba */ diff --git a/etherpad/src/etherpad/metrics/metrics.js b/etherpad/src/etherpad/metrics/metrics.js index 1bc8666..435a5be 100644 --- a/etherpad/src/etherpad/metrics/metrics.js +++ b/etherpad/src/etherpad/metrics/metrics.js @@ -329,8 +329,8 @@ function getOrigins(startDate, endDate, useReferer, shouldAggregatePads) { }); if (useReferer) { - flowFirsts = flowFirsts.filter(function(x) { return ! startsWith(x, "http://etherpad.com"); }); - sessionKeyFirsts = sessionKeyFirsts.filter(function(x) { return ! startsWith(x, "http://etherpad.com"); }); + flowFirsts = flowFirsts.filter(function(x) { return ! startsWith(x, "http://pad.spline.inf.fu-berlin.de"); }); + sessionKeyFirsts = sessionKeyFirsts.filter(function(x) { return ! startsWith(x, "http://pad.spline.inf.fu-berlin.de"); }); } return { diff --git a/etherpad/src/etherpad/pad/exporthtml.js b/etherpad/src/etherpad/pad/exporthtml.js index 48ea1a4..2512603 100644 --- a/etherpad/src/etherpad/pad/exporthtml.js +++ b/etherpad/src/etherpad/pad/exporthtml.js @@ -47,8 +47,8 @@ function getPadHTML(pad, revNum) { var apool = pad.pool(); - var tags = ['b','i','u','s']; - var props = ['bold','italic','underline','strikethrough']; + var tags = ['b','i','u','s','h1','h2','h3','h4','h5','h6']; + var props = ['bold','italic','underline','strikethrough','h1','h2','h3','h4','h5','h6']; var anumMap = {}; props.forEach(function(propName, i) { var propTrueNum = apool.putAttrib([propName,true], true); @@ -288,6 +288,7 @@ function getPadHTMLDocument(pad, revNum, noDocType) { '<meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n'+ '<meta http-equiv="Content-Language" content="en-us" />\n'+ '<title>'+'/'+pad.getId()+'</title>\n'+ + '<style type="text/css">h1,h2,h3,h4,h5,h6 { display: inline; }</style>\n' + '</head>\n')+ '<body>'; diff --git a/etherpad/src/etherpad/pad/pad_migrations.js b/etherpad/src/etherpad/pad/pad_migrations.js index f502bdf..e81cf63 100644 --- a/etherpad/src/etherpad/pad/pad_migrations.js +++ b/etherpad/src/etherpad/pad/pad_migrations.js @@ -31,7 +31,7 @@ function onStartup() { appjet.cache.pad_migrations = {}; } - // this part can be removed when all pads are migrated on etherpad.com + // this part can be removed when all pads are migrated on pad.spline.inf.fu-berlin.de //if (! pne_utils.isPNE()) { // System.out.println("Building cache for live migrations..."); // initLiveMigration(); diff --git a/etherpad/src/etherpad/pad/padutils.js b/etherpad/src/etherpad/pad/padutils.js index dc4c9ab..b53de11 100644 --- a/etherpad/src/etherpad/pad/padutils.js +++ b/etherpad/src/etherpad/pad/padutils.js @@ -98,7 +98,7 @@ function getGlobalPadId(localPadId) { if (pro_utils.isProDomainRequest()) { return makeGlobalId(domains.getRequestDomainId(), localPadId); } else { - // etherpad.com pads + // pad.spline.inf.fu-berlin.de pads return localPadId; } } diff --git a/etherpad/src/etherpad/pro/pro_accounts.js b/etherpad/src/etherpad/pro/pro_accounts.js index 54ac50c..98df6bb 100644 --- a/etherpad/src/etherpad/pro/pro_accounts.js +++ b/etherpad/src/etherpad/pro/pro_accounts.js @@ -564,7 +564,7 @@ function getEtherpadAdminAccount() { id: 0, isAdmin: true, fullName: "ETHERPAD ADMIN", - email: "support@etherpad.com", + email: "support@pad.spline.inf.fu-berlin.de", domainId: domains.getRequestDomainId(), isDeleted: false }; diff --git a/etherpad/src/etherpad/pro/pro_utils.js b/etherpad/src/etherpad/pro/pro_utils.js index 1198b95..d3098d7 100644 --- a/etherpad/src/etherpad/pro/pro_utils.js +++ b/etherpad/src/etherpad/pro/pro_utils.js @@ -45,8 +45,8 @@ function getProRequestSubdomain() { return d.split('.')[0]; } -function getRequestSuperdomain() { - var parts = request.domain.split('.'); +function getRequestSuperdomain() { + var parts = request.domain.split('.'); while (parts.length > 0) { var domain = parts.join('.'); if (domainEnabled(domain)) { @@ -55,7 +55,7 @@ function getRequestSuperdomain() { parts.shift(); } return false; -} +} function isProDomainRequest() { if(!isProAccountEnabled()) @@ -151,7 +151,7 @@ function getFullSuperdomainHost() { } function getEmailFromAddr() { - var fromDomain = 'etherpad.com'; + var fromDomain = 'pad.spline.inf.fu-berlin.de'; if (pne_utils.isPNE()) { fromDomain = getFullProDomain(); } diff --git a/etherpad/src/etherpad/quotas.js b/etherpad/src/etherpad/quotas.js index 99ce205..7e939ec 100644 --- a/etherpad/src/etherpad/quotas.js +++ b/etherpad/src/etherpad/quotas.js @@ -29,7 +29,7 @@ function getMaxSimultaneousPadEditors(globalPadId) { return 1e6; } } else { - // etherpad.com public pads + // pad.spline.inf.fu-berlin.de public pads if (globalPadId && stringutils.startsWith(globalPadId, "conf-")) { return 64; } else { @@ -43,7 +43,7 @@ function getMaxSavedRevisionsPerPad() { if (isProDomainRequest()) { return 1e3; } else { - // free public etherpad.com + // free public pad.spline.inf.fu-berlin.de return 100; } } diff --git a/etherpad/src/etherpad/sessions.js b/etherpad/src/etherpad/sessions.js index 3c10963..f430ddd 100644 --- a/etherpad/src/etherpad/sessions.js +++ b/etherpad/src/etherpad/sessions.js @@ -63,7 +63,6 @@ function _getScopedDomain(subDomain) { } return "." + d; } - //-------------------------------------------------------------------------------- // pass in subDomain to get the session data for a particular subdomain -- diff --git a/etherpad/src/etherpad/store/checkout.js b/etherpad/src/etherpad/store/checkout.js index 7b8e224..2a4d7e7 100644 --- a/etherpad/src/etherpad/store/checkout.js +++ b/etherpad/src/etherpad/store/checkout.js @@ -295,6 +295,6 @@ function formatDate(date) { function salesEmail(to, from, subject, headers, body) { sendEmail(to, from, subject, headers, body); if (globals.isProduction()) { - sendEmail("sales@etherpad.com", from, subject, headers, body); + sendEmail("sales@pad.spline.inf.fu-berlin.de", from, subject, headers, body); } }
\ No newline at end of file diff --git a/etherpad/src/etherpad/store/eepnet_checkout.js b/etherpad/src/etherpad/store/eepnet_checkout.js index cdf32a1..62137d3 100644 --- a/etherpad/src/etherpad/store/eepnet_checkout.js +++ b/etherpad/src/etherpad/store/eepnet_checkout.js @@ -87,7 +87,7 @@ function licenseEmailText(userName, licenseKey) { function sendReceiptEmail(cart) { var receipt = cart.receiptEmail || receiptEmailText(cart); - salesEmail(cart.email, "sales@etherpad.com", + salesEmail(cart.email, "sales@pad.spline.inf.fu-berlin.de", "EtherPad: Receipt for "+cart.ownerName+" ("+cart.orgName+")", {}, receipt); } @@ -95,7 +95,7 @@ function sendReceiptEmail(cart) { function sendLicenseEmail(cart) { var licenseEmail = licenseEmailText(cart.ownerName, cart.licenseKey); - salesEmail(cart.email, "sales@etherpad.com", + salesEmail(cart.email, "sales@pad.spline.inf.fu-berlin.de", "EtherPad: License Key for "+cart.ownerName+" ("+cart.orgName+")", {}, licenseEmail); }
\ No newline at end of file diff --git a/etherpad/src/etherpad/store/eepnet_trial.js b/etherpad/src/etherpad/store/eepnet_trial.js index 20fccdc..570d351 100644 --- a/etherpad/src/etherpad/store/eepnet_trial.js +++ b/etherpad/src/etherpad/store/eepnet_trial.js @@ -52,7 +52,7 @@ function mailLicense(data, licenseKey, expiresDate) { sendEmail( toAddr, - 'sales@etherpad.com', + 'sales@pad.spline.inf.fu-berlin.de', subject, {}, emailBody @@ -188,13 +188,13 @@ function _sendSalesNotification(data, ip, ref) { "" ].join("\n"); - var toAddr = 'sales@etherpad.com'; + var toAddr = 'sales@pad.spline.inf.fu-berlin.de'; if (isTestEmail(data.email)) { toAddr = 'blackhole@appjet.com'; } sendEmail( toAddr, - 'sales@etherpad.com', + 'sales@pad.spline.inf.fu-berlin.de', subject, {'Reply-To': data.email}, body diff --git a/etherpad/src/main.js b/etherpad/src/main.js index 738df51..53671cf 100644 --- a/etherpad/src/main.js +++ b/etherpad/src/main.js @@ -48,7 +48,6 @@ import("etherpad.control.pro.admin.license_manager_control"); import("etherpad.control.pro_beta_control"); import("etherpad.control.pro.pro_main_control"); import("etherpad.control.pro_signup_control"); -import("etherpad.control.pro_help_control"); import("etherpad.control.scriptcontrol"); import("etherpad.control.static_control"); import("etherpad.control.store.storecontrol"); @@ -276,7 +275,7 @@ function checkHost() { } // redirect to main site - var newurl = "http://etherpad.com"+request.path; + var newurl = "http://pad.spline.inf.fu-berlin.de/"+request.path; if (request.query) { newurl += "?"+request.query; } response.redirect(newurl); } @@ -290,7 +289,7 @@ function checkHTTPS() { /* Open-source note: this function used to check the protocol and make * sure that pages that needed to be secure went over HTTPS, and pages * that didn't go over HTTP. However, when we open-sourced the code, - * we disabled HTTPS because we didn't want to ship the etherpad.com + * we disabled HTTPS because we didn't want to ship the pad.spline.inf.fu-berlin.de * private crypto keys. --aiba */ return; @@ -316,8 +315,6 @@ function checkHTTPS() { var _requiredHttpsPrefixes = [ '/ep/admin', // pro and main site '/ep/account', // pro only - '/ep/store', // main site only - '/ep/pro-account' // main site only ]; var httpsRequired = false; @@ -380,7 +377,6 @@ function handlePath() { [/^\/([^\/]+)$/, pad_control.render_pad], [DirMatcher('/ep/unit-tests/'), forward(testcontrol)], [DirMatcher('/ep/pne-manual/'), forward(pne_manual_control)], - [DirMatcher('/ep/pro-help/'), forward(pro_help_control)] ]); // these paths are main site only diff --git a/etherpad/src/static/crossdomain.xml b/etherpad/src/static/crossdomain.xml index 1074b2a..9e76390 100644 --- a/etherpad/src/static/crossdomain.xml +++ b/etherpad/src/static/crossdomain.xml @@ -3,8 +3,10 @@ xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> <site-control permitted-cross-domain-policies="all"/> <allow-http-request-headers-from domain="*" headers="*"/> -<allow-access-from domain="*.tokbox.com" to-ports="*"/> -<allow-access-from domain="tokbox.com" to-ports="*"/> -<allow-access-from domain="*.etherpad.com" to-ports="*"/> -<allow-access-from domain="etherpad.com" to-ports="*"/> +<allow-access-from domain="*.pad.spline.de" to-ports="*"/> +<allow-access-from domain="pad.spline.de" to-ports="*"/> +<allow-access-from domain="*.pad.spline.inf.fu-berlin.de" to-ports="*"/> +<allow-access-from domain="pad.spline.inf.fu-berlin.de" to-ports="*"/> +<allow-access-from domain="*.pad.spline.nomad" to-ports="*"/> +<allow-access-from domain="pad.spline.nomad" to-ports="*"/> </cross-domain-policy> diff --git a/etherpad/src/static/css/broadcast.css b/etherpad/src/static/css/broadcast.css index 9114f8e..afb65b8 100644 --- a/etherpad/src/static/css/broadcast.css +++ b/etherpad/src/static/css/broadcast.css @@ -1,6 +1,5 @@ -*,html.body,p { margin: 0; padding: 0; } -h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: normal; font-style: normal; - text-decoration: none; margin: 0; padding: 0; } +*,html.body { margin: 0; padding: 0; } +h1, h2, h3, h4, h5, h6 { display: inline; line-height: 2em; } .clear { clear: both; } @@ -15,14 +14,14 @@ body, textarea { font-family: Arial, sans-serif; } #padpage { margin-left: auto; margin-right: auto; width: 914px; vertical-align: top;} #topbarleft { float: left; height: 100%; overflow: hidden; - background: url(/static/img/jun09/pad/padtop4.gif) no-repeat left top; width: 5px; } + background: url(/static/img/jun09/pad/padtop4.png) no-repeat left top; width: 5px; } #topbarright { float: right; height: 100%; overflow: hidden; - background: url(/static/img/jun09/pad/padtop4.gif) no-repeat right top; width: 5px; } + background: url(/static/img/jun09/pad/padtop4.png) no-repeat right top; width: 5px; } -.propad #topbar { background: #2c2c2c url(/static/img/jun09/pad/protop.gif) repeat-x 0 -25px; } -.propad #topbarleft { background: url(/static/img/jun09/pad/protop.gif) no-repeat left top; } -.propad #topbarright { background: url(/static/img/jun09/pad/protop.gif) no-repeat right top; } +.propad #topbar { background: #2c2c2c url(/static/img/jun09/pad/protop.png) repeat-x 0 -25px; } +.propad #topbarleft { background: url(/static/img/jun09/pad/protop.png) no-repeat left top; } +.propad #topbarright { background: url(/static/img/jun09/pad/protop.png) no-repeat right top; } a#backtoprosite, #accountnav { display: block; position: absolute; height: 15px; line-height: 15px; @@ -33,11 +32,11 @@ a#backtoprosite, #accountnav a { color: #cde7ff; text-decoration: underline; } #topbarcenter { margin-left: 150px; margin-right: 150px; } -a#topbaretherpad { margin-left: auto; margin-right: auto; display: block; width: 103px; - position: relative; top: 3px; height: 0; padding-top: 20px; - background: url(/static/img/jun09/pad/padtop4.gif) no-repeat -397px -3px; overflow: hidden; } +a#topbaretherpad { margin-left: auto; margin-right: auto; display: block; width: 127px; + position: relative; top: 0px; height: 0; padding-top: 25px; + background: url(/static/img/jun09/pad/padtop4.png) no-repeat -397px 0px; overflow: hidden; } -.propad a#topbaretherpad { background: url(/static/img/jun09/pad/protop.gif) no-repeat -397px -3px; } +.propad a#topbaretherpad { background: url(/static/img/jun09/pad/protop.png) no-repeat -397px 0px; } #padmain { margin: 7px; @@ -384,4 +383,4 @@ div #timeslider div#steppers div#rightstep { #error a { color: rgb(50, 132, 213); text-decoration: none; -}
\ No newline at end of file +} diff --git a/etherpad/src/static/css/pad2_ejs.css b/etherpad/src/static/css/pad2_ejs.css index 0519a9d..71176ee 100644 --- a/etherpad/src/static/css/pad2_ejs.css +++ b/etherpad/src/static/css/pad2_ejs.css @@ -1,7 +1,7 @@ -*,html.body,p { margin: 0; padding: 0; } -h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: normal; font-style: normal; - text-decoration: none; margin: 0; padding: 0; } +*,html.body { margin: 0; padding: 0; } + +h1, h2, h3, h4, h5, h6 { display: inline; line-height: 2em; } .clear { clear: both; } @@ -12,21 +12,21 @@ body, textarea { font-family: Arial, sans-serif; } #padpage { margin-left: auto; margin-right: auto; width: 900px; } -body.fullwidth #padpage { width: auto; margin-left: 6px; margin-right: 6px; } -body.squish1width #padpage { width: 800px; } -body.squish2width #padpage { width: 700px; } +body.fullwidth #padpage { width: auto; margin-left: 6px; margin-right: 6px; min-width: 800px; } +body.squish1width #padpage { width: 900px; } +body.squish2width #padpage { width: 800px; } #topbar { height: 25px; background: #326cbd url(/static/img/jun09/pad/padtopback2.gif) repeat-x left top; position: relative; } #topbarleft { float: left; height: 100%; overflow: hidden; - background: url(/static/img/jun09/pad/padtop5.gif) no-repeat left top; width: 5px; } + background: url(/static/img/jun09/pad/padtop5.png) no-repeat left top; width: 5px; } #topbarright { float: right; height: 100%; overflow: hidden; - background: url(/static/img/jun09/pad/padtop5.gif) no-repeat right top; width: 5px; } + background: url(/static/img/jun09/pad/padtop5.png) no-repeat right top; width: 5px; } -.propad #topbar { background: #2c2c2c url(/static/img/jun09/pad/protop.gif) repeat-x 0 -25px; } -.propad #topbarleft { background: url(/static/img/jun09/pad/protop.gif) no-repeat left top; } -.propad #topbarright { background: url(/static/img/jun09/pad/protop.gif) no-repeat right top; } +.propad #topbar { background: #2c2c2c url(/static/img/jun09/pad/protop.png) repeat-x 0 -25px; } +.propad #topbarleft { background: url(/static/img/jun09/pad/protop.png) no-repeat left top; } +.propad #topbarright { background: url(/static/img/jun09/pad/protop.png) no-repeat right top; } a#backtoprosite, #accountnav { display: block; position: absolute; height: 15px; line-height: 15px; @@ -35,15 +35,15 @@ a#backtoprosite, #accountnav { a#backtoprosite, #accountnav a { color: #cde7ff; text-decoration: underline; } a#backtoprosite { padding-left: 20px; left: 6px; - background: url(/static/img/jun09/pad/protop.gif) no-repeat -5px -6px; } + background: url(/static/img/jun09/pad/protop.png) no-repeat -5px -6px; } #accountnav { right: 10px; color: #fff; } #topbarcenter { margin-left: 150px; margin-right: 150px; } -a#topbaretherpad { margin-left: auto; margin-right: auto; display: block; width: 103px; - position: relative; top: 3px; height: 0; padding-top: 20px; - background: url(/static/img/jun09/pad/padtop5.gif) no-repeat -397px -3px; overflow: hidden; } +a#topbaretherpad { margin-left: auto; margin-right: auto; display: block; width: 127px; + position: relative; top: 0px; height: 0; padding-top: 25px; + background: url(/static/img/jun09/pad/padtop5.png) no-repeat -397px 0px; overflow: hidden; } -.propad a#topbaretherpad { background: url(/static/img/jun09/pad/protop.gif) no-repeat -397px -3px; } +.propad a#topbaretherpad { background: url(/static/img/jun09/pad/protop.png) no-repeat -397px 0px; } #specialkeyarea { top: 5px; left: 250px; color: yellow; font-weight: bold; font-size: 1.5em; position: absolute; } @@ -489,7 +489,7 @@ table#otheruserstable { display: none; } down on the page in IE. Strange but it works! */ #docbar { z-index: 52; } -#impexp-wrapper { width: 650px; right: 10px; } +#impexp-wrapper { width: 500px; right: 10px; } #impexp-panel { height: 160px; } .docbarimpexp-closing #impexp-wrapper { z-index: 50; } diff --git a/etherpad/src/static/css/pro-help.css b/etherpad/src/static/css/pro-help.css deleted file mode 100644 index 9237b62..0000000 --- a/etherpad/src/static/css/pro-help.css +++ /dev/null @@ -1,19 +0,0 @@ - -h1 { - font-size: 1.33em; - color: #555; - border-bottom: 1px solid #888; -} - -h2 { - font-size: 1.1em; - color: #333; - border-bottom: 1px solid #888; -} - -div.pro-help { - font-size: 88%; - width: 66%; -} - - diff --git a/etherpad/src/static/favicon.ico b/etherpad/src/static/favicon.ico Binary files differindex a19a1cb..a833c3a 100644 --- a/etherpad/src/static/favicon.ico +++ b/etherpad/src/static/favicon.ico diff --git a/etherpad/src/static/img/jun09/pad/padtop5.png b/etherpad/src/static/img/jun09/pad/padtop5.png Binary files differnew file mode 100644 index 0000000..22a0db7 --- /dev/null +++ b/etherpad/src/static/img/jun09/pad/padtop5.png diff --git a/etherpad/src/static/img/jun09/pad/padtop5.xcf b/etherpad/src/static/img/jun09/pad/padtop5.xcf Binary files differnew file mode 100644 index 0000000..c0bf7e4 --- /dev/null +++ b/etherpad/src/static/img/jun09/pad/padtop5.xcf diff --git a/etherpad/src/static/img/jun09/pad/protop.gif b/etherpad/src/static/img/jun09/pad/protop.gif Binary files differdeleted file mode 100644 index 9171646..0000000 --- a/etherpad/src/static/img/jun09/pad/protop.gif +++ /dev/null diff --git a/etherpad/src/static/img/pro/header/pro-header-logo.png b/etherpad/src/static/img/pro/header/pro-header-logo.png Binary files differindex c1a003c..b36daa8 100644 --- a/etherpad/src/static/img/pro/header/pro-header-logo.png +++ b/etherpad/src/static/img/pro/header/pro-header-logo.png diff --git a/etherpad/src/static/js/broadcast_slider.js b/etherpad/src/static/js/broadcast_slider.js index 8977e3d..371663e 100644 --- a/etherpad/src/static/js/broadcast_slider.js +++ b/etherpad/src/static/js/broadcast_slider.js @@ -398,4 +398,4 @@ var global = this; BroadcastSlider.onSlider(function(loc) { $("#viewlatest").html(loc==BroadcastSlider.getSliderLength()?"Viewing latest content":"View latest content"); -})
\ No newline at end of file +}) diff --git a/etherpad/src/static/js/etherpad.js b/etherpad/src/static/js/etherpad.js index feca517..4e51dbf 100644 --- a/etherpad/src/static/js/etherpad.js +++ b/etherpad/src/static/js/etherpad.js @@ -47,8 +47,8 @@ etherpad.validEmail = function(x) { etherpad.deobfuscateEmails = function() { $("a.obfuscemail").each(function() { - $(this).html($(this).html().replace('e***rp*d','etherpad')); - this.href = this.href.replace('e***rp*d','etherpad'); + $(this).html($(this).html().replace('p*d.sp***e','pad.spline')); + this.href = this.href.replace('p*d.sp***e','pad.spline'); }); }; diff --git a/etherpad/src/static/js/pad_modals.js b/etherpad/src/static/js/pad_modals.js index 35a1155..c9f48b5 100644 --- a/etherpad/src/static/js/pad_modals.js +++ b/etherpad/src/static/js/pad_modals.js @@ -131,7 +131,7 @@ var padmodals = (function() { }); $("#feedbackemails a").each(function() { var node = $(this); - node.attr('href', "mailto:"+node.attr('href')+"@etherpad.com"); + node.attr('href', "mailto:"+node.attr('href')+"@pad.spline.inf.fu-berlin.de"); }); }, initShareBox: function() { @@ -280,7 +280,7 @@ var padmodals = (function() { } function error(e) { setSendingFeedback(false); - $("#feedbackbox-response").html("Could not send feedback. Please email us at feedback"+"@"+"etherpad.com instead.").get(0).className = 'badresponse'; + $("#feedbackbox-response").html("Could not send feedback. Please email us at feedback"+"@"+"pad.spline.inf.fu-berlin.de instead.").get(0).className = 'badresponse'; $("#feedbackbox-response").show(); } },*/ diff --git a/etherpad/src/static/js/pro/guest-knock-client.js b/etherpad/src/static/js/pro/guest-knock-client.js index 16424d9..bace225 100644 --- a/etherpad/src/static/js/pro/guest-knock-client.js +++ b/etherpad/src/static/js/pro/guest-knock-client.js @@ -44,7 +44,7 @@ function knockReply(responseText) { } function knockError() { - alert("There was an error requesting access to the pad. Kindly report this by sending email to bugs@etherpad.com."); + alert("There was an error requesting access to the pad. Kindly report this by sending email to bugs@pad.spline.inf.fu-berlin.de."); } $(document).ready(function() { diff --git a/etherpad/src/themes/default/templates/500_body.ejs b/etherpad/src/themes/default/templates/500_body.ejs index 291e0fd..34549ed 100644 --- a/etherpad/src/themes/default/templates/500_body.ejs +++ b/etherpad/src/themes/default/templates/500_body.ejs @@ -19,7 +19,7 @@ limitations under the License. */ %><% helpers.setHtmlTitle("EtherPad Internal S <div id="errorpage" class="fpcontent"> <div class="error500"> <p>Oops! A server error occured. It's been logged.</p> - <p>Please email <support@etherpad.com> if this persists.</p> + <p>Please email <support@pad.spline.inf.fu-berlin.de> if this persists.</p> </div> </div> <% } %> diff --git a/etherpad/src/themes/default/templates/email/padinvite.ejs b/etherpad/src/themes/default/templates/email/padinvite.ejs index c6467b8..0f729e3 100644 --- a/etherpad/src/themes/default/templates/email/padinvite.ejs +++ b/etherpad/src/themes/default/templates/email/padinvite.ejs @@ -15,4 +15,4 @@ limitations under the License. */ %><%= body %> -- Sent by <%= request.host %> at the request of an EtherPad user. Do not reply to this email. -Report abuse to: support@etherpad.com +Report abuse to: support@pad.spline.inf.fu-berlin.de diff --git a/etherpad/src/themes/default/templates/framed/framedheader-pro.ejs b/etherpad/src/themes/default/templates/framed/framedheader-pro.ejs index 73b0e99..afb8a67 100644 --- a/etherpad/src/themes/default/templates/framed/framedheader-pro.ejs +++ b/etherpad/src/themes/default/templates/framed/framedheader-pro.ejs @@ -47,7 +47,6 @@ limitations under the License. */ %><% helpers.addBodyClass("pro-withtopbar"); % ['/', 'Home', 'home'], ['/ep/padlist/', 'Pads', 'padlist'], ['/ep/account/', 'My Account', 'account'], - ['/ep/pro-help/', 'Help', 'help'] ]; if (account && account.isAdmin) { links.push(['/ep/admin/', 'Admin', 'admin']); @@ -66,8 +65,8 @@ limitations under the License. */ %><% helpers.addBodyClass("pro-withtopbar"); % <div id="pro-topnav"> <div id="pro-topnav-inner"> - <%= renderProTopNav() %> - <%= helpers.clearFloats() %> + <%= renderProTopNav() %> + <%= helpers.clearFloats() %> </div> </div> diff --git a/etherpad/src/themes/default/templates/main/home.ejs b/etherpad/src/themes/default/templates/main/home.ejs index aa5d934..7041bee 100644 --- a/etherpad/src/themes/default/templates/main/home.ejs +++ b/etherpad/src/themes/default/templates/main/home.ejs @@ -12,16 +12,16 @@ 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. */ %><% helpers.setHtmlTitle("EtherPad: Open-Sourced!"); %> +limitations under the License. */ %><% helpers.setHtmlTitle("SplinePad [beta]: Open-Sourced!"); %> <% helpers.includeCss("home-opensource.css"); %> <div id="home"> <div id="title"> - EtherPad: Open-Sourced! + SplinePad </div> - <div> + <div id="buttons"> <a id="home-newpad" href="/ep/pad/newpad"> Create new pad </a> @@ -31,6 +31,32 @@ limitations under the License. */ %><% helpers.setHtmlTitle("EtherPad: Open-Sour </a> <% } %> </div> + + <div id="tos"> + <h1> + <b>Terms of service and Privacy notice</b> + </h1> + + <p> + <b>Privacy:</b> We guarantee that we will not intentionally hand + over your data to any third party. + </p> + + <p> + <b>Terms:</b> By using splinepad, you certify to agree to the + following terms of service: We are not responsible, and cannot + be held liable for any loss or damages that may be caused by the + result of our service. + </p> + + <p> + <b>In short:</b> We love the "Datenschutzgesetz" and if + something is wrong, we didn't do it. + </p> + + Have fun with splinepad. + </div> + </div> diff --git a/etherpad/src/themes/default/templates/main/pro_signup_body.ejs b/etherpad/src/themes/default/templates/main/pro_signup_body.ejs index e984878..ff35dfc 100644 --- a/etherpad/src/themes/default/templates/main/pro_signup_body.ejs +++ b/etherpad/src/themes/default/templates/main/pro_signup_body.ejs @@ -51,8 +51,9 @@ limitations under the License. */ %><% helpers.includeCss('pro-signup.css') %> <%= inf("email", "Email") %> </div> <div class="inputhelp"> - Instructions for choosing a password and signing in will - be emailed here. + <p>Instructions for choosing a password and signing in will + be emailed here.</p> + <p>Please use your <strong>*.fu-berlin.de</strong> address.</p> </div> <%= helpers.clearFloats() %> </div> diff --git a/etherpad/src/themes/default/templates/pad/create_body.ejs b/etherpad/src/themes/default/templates/pad/create_body.ejs index 5fec49a..742821f 100644 --- a/etherpad/src/themes/default/templates/pad/create_body.ejs +++ b/etherpad/src/themes/default/templates/pad/create_body.ejs @@ -10,7 +10,7 @@ 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. */ %><% helpers.setHtmlTitle("EtherPad: Create a new pad?"); %> +limitations under the License. */ %><% helpers.setHtmlTitle("SplinePad [beta]: Create a new pad?"); %> <div id="createpadpage" class="fpcontent"> <form action="<%= request.path %>" method="post"> @@ -18,7 +18,7 @@ limitations under the License. */ %><% helpers.setHtmlTitle("EtherPad: Create a <p><tt id="padurl">http://<%= request.host %>/<%= toHTML(padId) %></tt></p> <br/> - <p>There is no EtherPad document here. Would you like to create one?</p> + <p>There is no SplinePad document here. Would you like to create one?</p> <input type="hidden" name="padId" value="<%= toHTML(padId) %>" /> <input type="submit" id="createPad" value="Create Pad" /> diff --git a/etherpad/src/themes/default/templates/pad/padview_body.ejs b/etherpad/src/themes/default/templates/pad/padview_body.ejs index 75c38fe..e18ff12 100644 --- a/etherpad/src/themes/default/templates/pad/padview_body.ejs +++ b/etherpad/src/themes/default/templates/pad/padview_body.ejs @@ -113,8 +113,6 @@ limitations under the License. */ %><% <h2>Download as</h2> <img src="/static/img/may09/html.gif"><a class="tlink" href="/ep/pad/export/<%= padId %>/<%= revisionId %>?format=html" thref="/ep/pad/export/<%= padId %>/rev.%revision%?format=html">HTML</a><br> <img src="/static/img/may09/txt.gif" ><a class="tlink" href="/ep/pad/export/<%= padId %>/<%= revisionId %>?format=html" thref="/ep/pad/export/<%= padId %>/rev.%revision%?format=txt" >Plain text</a><br> -<img src="/static/img/may09/doc.gif" ><a class="tlink" href="/ep/pad/export/<%= padId %>/<%= revisionId %>?format=html" thref="/ep/pad/export/<%= padId %>/rev.%revision%?format=doc" >Microsoft Word</a><br> -<img src="/static/img/may09/pdf.gif" ><a class="tlink" href="/ep/pad/export/<%= padId %>/<%= revisionId %>?format=html" thref="/ep/pad/export/<%= padId %>/rev.%revision%?format=pdf" >PDF</a> </div> diff --git a/etherpad/src/themes/default/templates/pro-help/main.ejs b/etherpad/src/themes/default/templates/pro-help/main.ejs deleted file mode 100644 index 428d7f7..0000000 --- a/etherpad/src/themes/default/templates/pro-help/main.ejs +++ /dev/null @@ -1,35 +0,0 @@ -<% /* Copyright 2009 Google Inc. - -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. */ %> -<h1>EtherPad Professional Edition Help</h1> - -<p>These pages are evolving. If you have any questions, or find -parts of EtherPad confusing, please write in to our Helpdesk by -emailing <%= helpers.oemail("support") %>.</p> - -<p>Please report bugs to <%= helpers.oemail("bugs") %>.</p> - -<p>Also note that you can also get help from other users in the <a -href="http://etherpad.com/ep/about/forums">UserVoice Community -Forums</a>.</p> - -<h2>Help Topics:</h2> - -<ul> -<% helpTopics.forEach(function(t) { %> - <li><%= A({href: "/ep/pro-help/"+t[0]}, t[1]) %></li> -<% }); %> -</ul> - - - diff --git a/etherpad/src/themes/default/templates/pro/account/account-welcome-email.ejs b/etherpad/src/themes/default/templates/pro/account/account-welcome-email.ejs index 25af6f8..33e1ac5 100644 --- a/etherpad/src/themes/default/templates/pro/account/account-welcome-email.ejs +++ b/etherpad/src/themes/default/templates/pro/account/account-welcome-email.ejs @@ -22,7 +22,7 @@ Thank you for signing up for EtherPad Professional Edition. You can sign in by <%= signinLink %> -For help signing in, or general support issues, please email support@etherpad.com. +For help signing in, or general support issues, please email support@pad.spline.inf.fu-berlin.de. -- This email was sent to <%= toEmail %> from an EtherPad user. diff --git a/etherpad/src/themes/default/templates/pro/admin/admin-template.ejs b/etherpad/src/themes/default/templates/pro/admin/admin-template.ejs index e1a7736..a54964f 100644 --- a/etherpad/src/themes/default/templates/pro/admin/admin-template.ejs +++ b/etherpad/src/themes/default/templates/pro/admin/admin-template.ejs @@ -16,11 +16,9 @@ limitations under the License. */ %><% helpers.setHtmlTitle("Etherpad Administra <div class="fpcontent"> <table id="admin-layout-table"> <tr> - <% if (validLicense) { %> - <td width="1%" id="admin-leftnav"> - <%= renderAdminLeftNav() %> - </td> - <% } %> + <td width="1%" id="admin-leftnav"> + <%= renderAdminLeftNav() %> + </td> <td width="99%" id="admin-right"> <%= getAdminContent() %> </td> diff --git a/etherpad/src/themes/default/templates/pro/pro_home.ejs b/etherpad/src/themes/default/templates/pro/pro_home.ejs index 8d92139..bcf7443 100644 --- a/etherpad/src/themes/default/templates/pro/pro_home.ejs +++ b/etherpad/src/themes/default/templates/pro/pro_home.ejs @@ -67,20 +67,13 @@ limitations under the License. */ %><% helpers.setHtmlTitle(orgName + " - EtherP <div class="news-item"> <p>Welcome to your EtherPad Beta Account! Please report bugs by - sending email to <%= helpers.oemail("bugs") %>. You can also give us - feedback and feature suggestions via <a target="_blank" - href="http://uservoice.etherpad.com/">UserVoice</a>.</p> - - <p>If you have any questions, just email <%= - helpers.oemail("support") %> and - we will respond to your inquiries.</p> + sending email to <%= helpers.oemail("bugs") %>. <p>We hope you enjoy EtherPad!</p> <p>Sincerely,</p> - <p>Aaron Iba<br/> - CEO, AppJet Inc. + <p>Spline</p> </p> </div> diff --git a/infrastructure/ace/www/ace2_inner.js b/infrastructure/ace/www/ace2_inner.js index e817c95..33c13e8 100644 --- a/infrastructure/ace/www/ace2_inner.js +++ b/infrastructure/ace/www/ace2_inner.js @@ -752,6 +752,12 @@ function OUTER(gscope) { italic: function() { toggleAttributeOnSelection('italic'); }, underline: function() { toggleAttributeOnSelection('underline'); }, strikethrough: function() { toggleAttributeOnSelection('strikethrough'); }, + h1: function() { toggleAttributeOnSelection('h1'); }, + h2: function() { toggleAttributeOnSelection('h2'); }, + h3: function() { toggleAttributeOnSelection('h3'); }, + h4: function() { toggleAttributeOnSelection('h4'); }, + h5: function() { toggleAttributeOnSelection('h5'); }, + h6: function() { toggleAttributeOnSelection('h6'); }, undo: function() { doUndoRedo('undo'); }, redo: function() { doUndoRedo('redo'); }, clearauthorship: function(prompt) { @@ -1523,7 +1529,9 @@ function OUTER(gscope) { } var STYLE_ATTRIBS = {bold: true, italic: true, underline: true, - strikethrough: true, list: true}; + strikethrough: true, h1: true, h2: true, + h3: true, h4: true, h5: true, h6: true, + list: true}; var OTHER_INCORPED_ATTRIBS = {insertorder: true, author: true}; function isStyleAttribute(aname) { @@ -2070,8 +2078,34 @@ function OUTER(gscope) { [[attributeName,'']]); } else { - performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd, - [[attributeName,'true']]); + var settings = [[attributeName, 'true']]; + + if (attributeName == 'h1' || attributeName == 'h2' || attributeName == 'h3' || + attributeName == 'h4' || attributeName == 'h5' || attributeName == 'h6') { + + settings = [['h1',''], ['h2',''], ['h3',''], + ['h4',''], ['h5',''], ['h6','']]; + if (attributeName == 'h1') { + settings[0] = [attributeName, 'true']; + } + else if (attributeName == 'h2') { + settings[1] = [attributeName, 'true']; + } + else if (attributeName == 'h3') { + settings[2] = [attributeName, 'true']; + } + else if (attributeName == 'h4') { + settings[3] = [attributeName, 'true']; + } + else if (attributeName == 'h5') { + settings[4] = [attributeName, 'true']; + } + else if (attributeName == 'h6') { + settings[5] = [attributeName, 'true']; + } + } + + performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd, settings); } } @@ -4762,6 +4796,11 @@ function OUTER(gscope) { a = a.nextSibling; b = b.nextSibling; } + + // fix if first line has margin (f.e. h1 in first line) + sideDivInner.firstChild.style.marginTop = + (doc.body.firstChild.offsetTop - sideDivInner.firstChild.offsetTop + + parseInt(sideDivInner.firstChild.style.marginTop + "0")) + "px"; } } diff --git a/infrastructure/ace/www/contentcollector.js b/infrastructure/ace/www/contentcollector.js index c5d8ddb..573672e 100644 --- a/infrastructure/ace/www/contentcollector.js +++ b/infrastructure/ace/www/contentcollector.js @@ -340,6 +340,24 @@ function makeContentCollector(collectStyles, browser, apool, domInterface, tname == "del") { doAttrib("strikethrough"); } + if (tname == "h1") { + doAttrib("h1"); + } + if (tname == "h2") { + doAttrib("h2"); + } + if (tname == "h3") { + doAttrib("h3"); + } + if (tname == "h4") { + doAttrib("h4"); + } + if (tname == "h5") { + doAttrib("h5"); + } + if (tname == "h6") { + doAttrib("h6"); + } if (tname == "ul") { var type; var rr = cls && /(?:^| )list-(bullet[12345678])\b/.exec(cls); diff --git a/infrastructure/ace/www/editor.css b/infrastructure/ace/www/editor.css index 0a43478..9df127d 100644 --- a/infrastructure/ace/www/editor.css +++ b/infrastructure/ace/www/editor.css @@ -6,7 +6,12 @@ body { margin: 0; white-space: nowrap; -} +} + +h1,h2,h3,h4,h5,h6 { + display: inline; + line-height: 2em; +} #outerdocbody { background-color: #fff; @@ -106,4 +111,4 @@ p { font-family: monospace; /* overridden by lineMetricsDiv.style */ } -#overlaysdiv { position: absolute; left: -1000px; top: -1000px; }
\ No newline at end of file +#overlaysdiv { position: absolute; left: -1000px; top: -1000px; } diff --git a/infrastructure/ace/www/linestylefilter.js b/infrastructure/ace/www/linestylefilter.js index 196cb63..f772ce3 100644 --- a/infrastructure/ace/www/linestylefilter.js +++ b/infrastructure/ace/www/linestylefilter.js @@ -29,7 +29,13 @@ linestylefilter.ATTRIB_CLASSES = { 'bold':'tag:b', 'italic':'tag:i', 'underline':'tag:u', - 'strikethrough':'tag:s' + 'strikethrough':'tag:s', + 'h1':'tag:h1', + 'h2':'tag:h2', + 'h3':'tag:h3', + 'h4':'tag:h4', + 'h5':'tag:h5', + 'h6':'tag:h6' }; linestylefilter.getAuthorClassName = function(author) { diff --git a/trunk/etherpad/src/etherpad/collab/ace/contentcollector.js b/trunk/etherpad/src/etherpad/collab/ace/contentcollector.js new file mode 100644 index 0000000..5dd4f9c --- /dev/null +++ b/trunk/etherpad/src/etherpad/collab/ace/contentcollector.js @@ -0,0 +1,527 @@ +// DO NOT EDIT THIS FILE, edit infrastructure/ace/www/contentcollector.js +import("etherpad.collab.ace.easysync2.Changeset") + +/** + * Copyright 2009 Google Inc. + * + * 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. + */ + +var _MAX_LIST_LEVEL = 8; + +function sanitizeUnicode(s) { + return s.replace(/[\uffff\ufffe\ufeff\ufdd0-\ufdef\ud800-\udfff]/g, '?'); +} + +function makeContentCollector(collectStyles, browser, apool, domInterface, + className2Author) { + browser = browser || {}; + + var dom = domInterface || { + isNodeText: function(n) { + return (n.nodeType == 3); + }, + nodeTagName: function(n) { + return n.tagName; + }, + nodeValue: function(n) { + return n.nodeValue; + }, + nodeNumChildren: function(n) { + return n.childNodes.length; + }, + nodeChild: function(n, i) { + return n.childNodes.item(i); + }, + nodeProp: function(n, p) { + return n[p]; + }, + nodeAttr: function(n, a) { + return n.getAttribute(a); + }, + optNodeInnerHTML: function(n) { + return n.innerHTML; + } + }; + + var _blockElems = { "div":1, "p":1, "pre":1, "li":1 }; + function isBlockElement(n) { + return !!_blockElems[(dom.nodeTagName(n) || "").toLowerCase()]; + } + function textify(str) { + return sanitizeUnicode( + str.replace(/[\n\r ]/g, ' ').replace(/\xa0/g, ' ').replace(/\t/g, ' ')); + } + function getAssoc(node, name) { + return dom.nodeProp(node, "_magicdom_"+name); + } + + var lines = (function() { + var textArray = []; + var attribsArray = []; + var attribsBuilder = null; + var op = Changeset.newOp('+'); + var self = { + length: function() { return textArray.length; }, + atColumnZero: function() { + return textArray[textArray.length-1] === ""; + }, + startNew: function() { + textArray.push(""); + self.flush(true); + attribsBuilder = Changeset.smartOpAssembler(); + }, + textOfLine: function(i) { return textArray[i]; }, + appendText: function(txt, attrString) { + textArray[textArray.length-1] += txt; + //dmesg(txt+" / "+attrString); + op.attribs = attrString; + op.chars = txt.length; + attribsBuilder.append(op); + }, + textLines: function() { return textArray.slice(); }, + attribLines: function() { return attribsArray; }, + // call flush only when you're done + flush: function(withNewline) { + if (attribsBuilder) { + attribsArray.push(attribsBuilder.toString()); + attribsBuilder = null; + } + } + }; + self.startNew(); + return self; + }()); + var cc = {}; + function _ensureColumnZero(state) { + if (! lines.atColumnZero()) { + _startNewLine(state); + } + } + var selection, startPoint, endPoint; + var selStart = [-1,-1], selEnd = [-1,-1]; + var blockElems = { "div":1, "p":1, "pre":1 }; + function _isEmpty(node, state) { + // consider clean blank lines pasted in IE to be empty + if (dom.nodeNumChildren(node) == 0) return true; + if (dom.nodeNumChildren(node) == 1 && + getAssoc(node, "shouldBeEmpty") && dom.optNodeInnerHTML(node) == " " + && ! getAssoc(node, "unpasted")) { + if (state) { + var child = dom.nodeChild(node, 0); + _reachPoint(child, 0, state); + _reachPoint(child, 1, state); + } + return true; + } + return false; + } + function _pointHere(charsAfter, state) { + var ln = lines.length()-1; + var chr = lines.textOfLine(ln).length; + if (chr == 0 && state.listType && state.listType != 'none') { + chr += 1; // listMarker + } + chr += charsAfter; + return [ln, chr]; + } + function _reachBlockPoint(nd, idx, state) { + if (! dom.isNodeText(nd)) _reachPoint(nd, idx, state); + } + function _reachPoint(nd, idx, state) { + if (startPoint && nd == startPoint.node && startPoint.index == idx) { + selStart = _pointHere(0, state); + } + if (endPoint && nd == endPoint.node && endPoint.index == idx) { + selEnd = _pointHere(0, state); + } + } + function _incrementFlag(state, flagName) { + state.flags[flagName] = (state.flags[flagName] || 0)+1; + } + function _decrementFlag(state, flagName) { + state.flags[flagName]--; + } + function _incrementAttrib(state, attribName) { + if (! state.attribs[attribName]) { + state.attribs[attribName] = 1; + } + else { + state.attribs[attribName]++; + } + _recalcAttribString(state); + } + function _decrementAttrib(state, attribName) { + state.attribs[attribName]--; + _recalcAttribString(state); + } + function _enterList(state, listType) { + var oldListType = state.listType; + state.listLevel = (state.listLevel || 0)+1; + if (listType != 'none') { + state.listNesting = (state.listNesting || 0)+1; + } + state.listType = listType; + _recalcAttribString(state); + return oldListType; + } + function _exitList(state, oldListType) { + state.listLevel--; + if (state.listType != 'none') { + state.listNesting--; + } + state.listType = oldListType; + _recalcAttribString(state); + } + function _enterAuthor(state, author) { + var oldAuthor = state.author; + state.authorLevel = (state.authorLevel || 0)+1; + state.author = author; + _recalcAttribString(state); + return oldAuthor; + } + function _exitAuthor(state, oldAuthor) { + state.authorLevel--; + state.author = oldAuthor; + _recalcAttribString(state); + } + function _recalcAttribString(state) { + var lst = []; + for(var a in state.attribs) { + if (state.attribs[a]) { + lst.push([a,'true']); + } + } + if (state.authorLevel > 0) { + var authorAttrib = ['author', state.author]; + if (apool.putAttrib(authorAttrib, true) >= 0) { + // require that author already be in pool + // (don't add authors from other documents, etc.) + lst.push(authorAttrib); + } + } + state.attribString = Changeset.makeAttribsString('+', lst, apool); + } + function _produceListMarker(state) { + lines.appendText('*', Changeset.makeAttribsString( + '+', [['list', state.listType], + ['insertorder', 'first']], + apool)); + } + function _startNewLine(state) { + if (state) { + var atBeginningOfLine = lines.textOfLine(lines.length()-1).length == 0; + if (atBeginningOfLine && state.listType && state.listType != 'none') { + _produceListMarker(state); + } + } + lines.startNew(); + } + cc.notifySelection = function (sel) { + if (sel) { + selection = sel; + startPoint = selection.startPoint; + endPoint = selection.endPoint; + } + }; + cc.collectContent = function (node, state) { + if (! state) { + state = {flags: {/*name -> nesting counter*/}, + attribs: {/*name -> nesting counter*/}, + attribString: ''}; + } + var isBlock = isBlockElement(node); + var isEmpty = _isEmpty(node, state); + if (isBlock) _ensureColumnZero(state); + var startLine = lines.length()-1; + _reachBlockPoint(node, 0, state); + if (dom.isNodeText(node)) { + var txt = dom.nodeValue(node); + var rest = ''; + var x = 0; // offset into original text + if (txt.length == 0) { + if (startPoint && node == startPoint.node) { + selStart = _pointHere(0, state); + } + if (endPoint && node == endPoint.node) { + selEnd = _pointHere(0, state); + } + } + while (txt.length > 0) { + var consumed = 0; + if (state.flags.preMode) { + var firstLine = txt.split('\n',1)[0]; + consumed = firstLine.length+1; + rest = txt.substring(consumed); + txt = firstLine; + } + else { /* will only run this loop body once */ } + if (startPoint && node == startPoint.node && + startPoint.index-x <= txt.length) { + selStart = _pointHere(startPoint.index-x, state); + } + if (endPoint && node == endPoint.node && + endPoint.index-x <= txt.length) { + selEnd = _pointHere(endPoint.index-x, state); + } + var txt2 = txt; + if ((! state.flags.preMode) && /^[\r\n]*$/.exec(txt)) { + // prevents textnodes containing just "\n" from being significant + // in safari when pasting text, now that we convert them to + // spaces instead of removing them, because in other cases + // removing "\n" from pasted HTML will collapse words together. + txt2 = ""; + } + var atBeginningOfLine = lines.textOfLine(lines.length()-1).length == 0; + if (atBeginningOfLine) { + // newlines in the source mustn't become spaces at beginning of line box + txt2 = txt2.replace(/^\n*/, ''); + } + if (atBeginningOfLine && state.listType && state.listType != 'none') { + _produceListMarker(state); + } + lines.appendText(textify(txt2), state.attribString); + x += consumed; + txt = rest; + if (txt.length > 0) { + _startNewLine(state); + } + } + } + else { + var tname = (dom.nodeTagName(node) || "").toLowerCase(); + if (tname == "br") { + _startNewLine(state); + } + else if (tname == "script" || tname == "style") { + // ignore + } + else if (! isEmpty) { + var styl = dom.nodeAttr(node, "style"); + var cls = dom.nodeProp(node, "className"); + + var isPre = (tname == "pre"); + if ((! isPre) && browser.safari) { + isPre = (styl && /\bwhite-space:\s*pre\b/i.exec(styl)); + } + if (isPre) _incrementFlag(state, 'preMode'); + var attribs = null; + var oldListTypeOrNull = null; + var oldAuthorOrNull = null; + if (collectStyles) { + function doAttrib(na) { + attribs = (attribs || []); + attribs.push(na); + _incrementAttrib(state, na); + } + if (tname == "b" || (styl && /\bfont-weight:\s*bold\b/i.exec(styl)) || + tname == "strong") { + doAttrib("bold"); + } + if (tname == "i" || (styl && /\bfont-style:\s*italic\b/i.exec(styl)) || + tname == "em") { + doAttrib("italic"); + } + if (tname == "u" || (styl && /\btext-decoration:\s*underline\b/i.exec(styl)) || + tname == "ins") { + doAttrib("underline"); + } + if (tname == "s" || (styl && /\btext-decoration:\s*line-through\b/i.exec(styl)) || + tname == "del") { + doAttrib("strikethrough"); + } + if (tname == "h1") { + doAttrib("h1"); + } + if (tname == "h2") { + doAttrib("h2"); + } + if (tname == "h3") { + doAttrib("h3"); + } + if (tname == "h4") { + doAttrib("h4"); + } + if (tname == "h5") { + doAttrib("h5"); + } + if (tname == "h6") { + doAttrib("h6"); + } + if (tname == "ul") { + var type; + var rr = cls && /(?:^| )list-(bullet[12345678])\b/.exec(cls); + type = rr && rr[1] || "bullet"+ + String(Math.min(_MAX_LIST_LEVEL, (state.listNesting||0)+1)); + oldListTypeOrNull = (_enterList(state, type) || 'none'); + } + else if ((tname == "div" || tname == "p") && cls && + cls.match(/(?:^| )ace-line\b/)) { + oldListTypeOrNull = (_enterList(state, type) || 'none'); + } + if (className2Author && cls) { + var classes = cls.match(/\S+/g); + if (classes && classes.length > 0) { + for(var i=0;i<classes.length;i++) { + var c = classes[i]; + var a = className2Author(c); + if (a) { + oldAuthorOrNull = (_enterAuthor(state, a) || 'none'); + break; + } + } + } + } + } + + var nc = dom.nodeNumChildren(node); + for(var i=0;i<nc;i++) { + var c = dom.nodeChild(node, i); + cc.collectContent(c, state); + } + + if (isPre) _decrementFlag(state, 'preMode'); + if (attribs) { + for(var i=0;i<attribs.length;i++) { + _decrementAttrib(state, attribs[i]); + } + } + if (oldListTypeOrNull) { + _exitList(state, oldListTypeOrNull); + } + if (oldAuthorOrNull) { + _exitAuthor(state, oldAuthorOrNull); + } + } + } + if (! browser.msie) { + _reachBlockPoint(node, 1, state); + } + if (isBlock) { + if (lines.length()-1 == startLine) { + _startNewLine(state); + } + else { + _ensureColumnZero(state); + } + } + + if (browser.msie) { + // in IE, a point immediately after a DIV appears on the next line + _reachBlockPoint(node, 1, state); + } + }; + // can pass a falsy value for end of doc + cc.notifyNextNode = function (node) { + // an "empty block" won't end a line; this addresses an issue in IE with + // typing into a blank line at the end of the document. typed text + // goes into the body, and the empty line div still looks clean. + // it is incorporated as dirty by the rule that a dirty region has + // to end a line. + if ((!node) || (isBlockElement(node) && !_isEmpty(node))) { + _ensureColumnZero(null); + } + }; + // each returns [line, char] or [-1,-1] + var getSelectionStart = function() { return selStart; }; + var getSelectionEnd = function() { return selEnd; }; + + // returns array of strings for lines found, last entry will be "" if + // last line is complete (i.e. if a following span should be on a new line). + // can be called at any point + cc.getLines = function() { return lines.textLines(); }; + + //cc.applyHints = function(hints) { + //if (hints.pastedLines) { + // + //} + //} + + cc.finish = function() { + lines.flush(); + var lineAttribs = lines.attribLines(); + var lineStrings = cc.getLines(); + + lineStrings.length--; + lineAttribs.length--; + + var ss = getSelectionStart(); + var se = getSelectionEnd(); + + function fixLongLines() { + // design mode does not deal with with really long lines! + var lineLimit = 2000; // chars + var buffer = 10; // chars allowed over before wrapping + var linesWrapped = 0; + var numLinesAfter = 0; + for(var i=lineStrings.length-1; i>=0; i--) { + var oldString = lineStrings[i]; + var oldAttribString = lineAttribs[i]; + if (oldString.length > lineLimit+buffer) { + var newStrings = []; + var newAttribStrings = []; + while (oldString.length > lineLimit) { + //var semiloc = oldString.lastIndexOf(';', lineLimit-1); + //var lengthToTake = (semiloc >= 0 ? (semiloc+1) : lineLimit); + lengthToTake = lineLimit; + newStrings.push(oldString.substring(0, lengthToTake)); + oldString = oldString.substring(lengthToTake); + newAttribStrings.push(Changeset.subattribution(oldAttribString, + 0, lengthToTake)); + oldAttribString = Changeset.subattribution(oldAttribString, + lengthToTake); + } + if (oldString.length > 0) { + newStrings.push(oldString); + newAttribStrings.push(oldAttribString); + } + function fixLineNumber(lineChar) { + if (lineChar[0] < 0) return; + var n = lineChar[0]; + var c = lineChar[1]; + if (n > i) { + n += (newStrings.length-1); + } + else if (n == i) { + var a = 0; + while (c > newStrings[a].length) { + c -= newStrings[a].length; + a++; + } + n += a; + } + lineChar[0] = n; + lineChar[1] = c; + } + fixLineNumber(ss); + fixLineNumber(se); + linesWrapped++; + numLinesAfter += newStrings.length; + + newStrings.unshift(i, 1); + lineStrings.splice.apply(lineStrings, newStrings); + newAttribStrings.unshift(i, 1); + lineAttribs.splice.apply(lineAttribs, newAttribStrings); + } + } + return {linesWrapped:linesWrapped, numLinesAfter:numLinesAfter}; + } + var wrapData = fixLongLines(); + + return { selStart: ss, selEnd: se, linesWrapped: wrapData.linesWrapped, + numLinesAfter: wrapData.numLinesAfter, + lines: lineStrings, lineAttribs: lineAttribs }; + } + + return cc; +} diff --git a/trunk/etherpad/src/etherpad/collab/ace/linestylefilter.js b/trunk/etherpad/src/etherpad/collab/ace/linestylefilter.js new file mode 100644 index 0000000..c7f79a5 --- /dev/null +++ b/trunk/etherpad/src/etherpad/collab/ace/linestylefilter.js @@ -0,0 +1,253 @@ +// DO NOT EDIT THIS FILE, edit infrastructure/ace/www/linestylefilter.js +import("etherpad.collab.ace.easysync2.Changeset"); + +/** + * Copyright 2009 Google Inc. + * + * 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. + */ + +// requires: easysync2.Changeset + +var linestylefilter = {}; + +linestylefilter.ATTRIB_CLASSES = { + 'bold':'tag:b', + 'italic':'tag:i', + 'underline':'tag:u', + 'strikethrough':'tag:s', + 'h1':'tag:h1', + 'h2':'tag:h2', + 'h3':'tag:h3', + 'h4':'tag:h4', + 'h5':'tag:h5', + 'h6':'tag:h6' +}; + +linestylefilter.getAuthorClassName = function(author) { + return "author-"+author.replace(/[^a-y0-9]/g, function(c) { + if (c == ".") return "-"; + return 'z'+c.charCodeAt(0)+'z'; + }); +}; + +// lineLength is without newline; aline includes newline, +// but may be falsy if lineLength == 0 +linestylefilter.getLineStyleFilter = function(lineLength, aline, + textAndClassFunc, apool) { + + if (lineLength == 0) return textAndClassFunc; + + var nextAfterAuthorColors = textAndClassFunc; + + var authorColorFunc = (function() { + var lineEnd = lineLength; + var curIndex = 0; + var extraClasses; + var leftInAuthor; + + function attribsToClasses(attribs) { + var classes = ''; + Changeset.eachAttribNumber(attribs, function(n) { + var key = apool.getAttribKey(n); + if (key) { + var value = apool.getAttribValue(n); + if (value) { + if (key == 'author') { + classes += ' '+linestylefilter.getAuthorClassName(value); + } + else if (key == 'list') { + classes += ' list:'+value; + } + else if (linestylefilter.ATTRIB_CLASSES[key]) { + classes += ' '+linestylefilter.ATTRIB_CLASSES[key]; + } + } + } + }); + return classes.substring(1); + } + + var attributionIter = Changeset.opIterator(aline); + var nextOp, nextOpClasses; + function goNextOp() { + nextOp = attributionIter.next(); + nextOpClasses = (nextOp.opcode && attribsToClasses(nextOp.attribs)); + } + goNextOp(); + function nextClasses() { + if (curIndex < lineEnd) { + extraClasses = nextOpClasses; + leftInAuthor = nextOp.chars; + goNextOp(); + while (nextOp.opcode && nextOpClasses == extraClasses) { + leftInAuthor += nextOp.chars; + goNextOp(); + } + } + } + nextClasses(); + + return function(txt, cls) { + while (txt.length > 0) { + if (leftInAuthor <= 0) { + // prevent infinite loop if something funny's going on + return nextAfterAuthorColors(txt, cls); + } + var spanSize = txt.length; + if (spanSize > leftInAuthor) { + spanSize = leftInAuthor; + } + var curTxt = txt.substring(0, spanSize); + txt = txt.substring(spanSize); + nextAfterAuthorColors(curTxt, (cls&&cls+" ")+extraClasses); + curIndex += spanSize; + leftInAuthor -= spanSize; + if (leftInAuthor == 0) { + nextClasses(); + } + } + }; + })(); + return authorColorFunc; +}; + +linestylefilter.getAtSignSplitterFilter = function(lineText, + textAndClassFunc) { + var at = /@/g; + at.lastIndex = 0; + var splitPoints = null; + var execResult; + while ((execResult = at.exec(lineText))) { + if (! splitPoints) { + splitPoints = []; + } + splitPoints.push(execResult.index); + } + + if (! splitPoints) return textAndClassFunc; + + return linestylefilter.textAndClassFuncSplitter(textAndClassFunc, + splitPoints); +}; + +linestylefilter.REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; +linestylefilter.REGEX_URLCHAR = new RegExp('('+/[-:@a-zA-Z0-9_.,~%+\/\\?=&#;()$]/.source+'|'+linestylefilter.REGEX_WORDCHAR.source+')'); +linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\/\/|mailto:)/.source+linestylefilter.REGEX_URLCHAR.source+'*(?![:.,;])'+linestylefilter.REGEX_URLCHAR.source, 'g'); + +linestylefilter.getURLFilter = function(lineText, textAndClassFunc) { + linestylefilter.REGEX_URL.lastIndex = 0; + var urls = null; + var splitPoints = null; + var execResult; + while ((execResult = linestylefilter.REGEX_URL.exec(lineText))) { + if (! urls) { + urls = []; + splitPoints = []; + } + var startIndex = execResult.index; + var url = execResult[0]; + urls.push([startIndex, url]); + splitPoints.push(startIndex, startIndex + url.length); + } + + if (! urls) return textAndClassFunc; + + function urlForIndex(idx) { + for(var k=0; k<urls.length; k++) { + var u = urls[k]; + if (idx >= u[0] && idx < u[0]+u[1].length) { + return u[1]; + } + } + return false; + } + + var handleUrlsAfterSplit = (function() { + var curIndex = 0; + return function(txt, cls) { + var txtlen = txt.length; + var newCls = cls; + var url = urlForIndex(curIndex); + if (url) { + newCls += " url:"+url; + } + textAndClassFunc(txt, newCls); + curIndex += txtlen; + }; + })(); + + return linestylefilter.textAndClassFuncSplitter(handleUrlsAfterSplit, + splitPoints); +}; + +linestylefilter.textAndClassFuncSplitter = function(func, splitPointsOpt) { + var nextPointIndex = 0; + var idx = 0; + + // don't split at 0 + while (splitPointsOpt && + nextPointIndex < splitPointsOpt.length && + splitPointsOpt[nextPointIndex] == 0) { + nextPointIndex++; + } + + function spanHandler(txt, cls) { + if ((! splitPointsOpt) || nextPointIndex >= splitPointsOpt.length) { + func(txt, cls); + idx += txt.length; + } + else { + var splitPoints = splitPointsOpt; + var pointLocInSpan = splitPoints[nextPointIndex] - idx; + var txtlen = txt.length; + if (pointLocInSpan >= txtlen) { + func(txt, cls); + idx += txt.length; + if (pointLocInSpan == txtlen) { + nextPointIndex++; + } + } + else { + if (pointLocInSpan > 0) { + func(txt.substring(0, pointLocInSpan), cls); + idx += pointLocInSpan; + } + nextPointIndex++; + // recurse + spanHandler(txt.substring(pointLocInSpan), cls); + } + } + } + return spanHandler; +}; + +// domLineObj is like that returned by domline.createDomLine +linestylefilter.populateDomLine = function(textLine, aline, apool, + domLineObj) { + // remove final newline from text if any + var text = textLine; + if (text.slice(-1) == '\n') { + text = text.substring(0, text.length-1); + } + + function textAndClassFunc(tokenText, tokenClass) { + domLineObj.appendSpan(tokenText, tokenClass); + } + + var func = textAndClassFunc; + func = linestylefilter.getURLFilter(text, func); + func = linestylefilter.getLineStyleFilter(text.length, aline, + func, apool); + func(text, ''); +}; diff --git a/trunk/etherpad/src/static/css/home-opensource.css b/trunk/etherpad/src/static/css/home-opensource.css new file mode 100644 index 0000000..0d6da6d --- /dev/null +++ b/trunk/etherpad/src/static/css/home-opensource.css @@ -0,0 +1,44 @@ +#home { + width: 600px; + margin: 0 auto; + padding: 4em; + text-align: center; +} + +#home #title { + font-size: 3.6em; +} + +#home #buttons { + padding-top: 5em; +} + +#home a#home-newpad, #home a#home-newsite { + padding: 1em; + margin: 12px 40px; + font-size: 1.6em; + border: 1px solid black; + background: #049; + color: #fff; + width: 30%; +} + +#home a#home-newpad:hover, #home a#home-newsite:hover { + background: #26b; + text-decoration: none; +} + +#tos { + margin-top: 8em; + color: #222; +} + +#tos h1, #tos p { + margin: 1.5em 0; +} + +#tos h1 { + font-weight: bold; + font-size: 1.1em; +} + diff --git a/trunk/etherpad/src/static/img/jun09/pad/editbar3.png b/trunk/etherpad/src/static/img/jun09/pad/editbar3.png Binary files differnew file mode 100644 index 0000000..ff65146 --- /dev/null +++ b/trunk/etherpad/src/static/img/jun09/pad/editbar3.png diff --git a/trunk/etherpad/src/static/img/jun09/pad/editbar3.xcf b/trunk/etherpad/src/static/img/jun09/pad/editbar3.xcf Binary files differnew file mode 100644 index 0000000..91cae20 --- /dev/null +++ b/trunk/etherpad/src/static/img/jun09/pad/editbar3.xcf diff --git a/trunk/etherpad/src/static/img/jun09/pad/padtop4.png b/trunk/etherpad/src/static/img/jun09/pad/padtop4.png Binary files differnew file mode 100644 index 0000000..11c4595 --- /dev/null +++ b/trunk/etherpad/src/static/img/jun09/pad/padtop4.png diff --git a/trunk/etherpad/src/static/img/jun09/pad/padtop4.xcf b/trunk/etherpad/src/static/img/jun09/pad/padtop4.xcf Binary files differnew file mode 100644 index 0000000..1e735aa --- /dev/null +++ b/trunk/etherpad/src/static/img/jun09/pad/padtop4.xcf diff --git a/trunk/etherpad/src/static/img/jun09/pad/protop.png b/trunk/etherpad/src/static/img/jun09/pad/protop.png Binary files differnew file mode 100644 index 0000000..740d903 --- /dev/null +++ b/trunk/etherpad/src/static/img/jun09/pad/protop.png diff --git a/trunk/etherpad/src/static/img/jun09/pad/protop.xcf b/trunk/etherpad/src/static/img/jun09/pad/protop.xcf Binary files differnew file mode 100644 index 0000000..4f3abfd --- /dev/null +++ b/trunk/etherpad/src/static/img/jun09/pad/protop.xcf diff --git a/trunk/etherpad/src/static/img/pro/header/pro-header-logo.xcf b/trunk/etherpad/src/static/img/pro/header/pro-header-logo.xcf Binary files differnew file mode 100644 index 0000000..524c00f --- /dev/null +++ b/trunk/etherpad/src/static/img/pro/header/pro-header-logo.xcf diff --git a/trunk/etherpad/src/static/js/ace.js b/trunk/etherpad/src/static/js/ace.js new file mode 100644 index 0000000..6766cee --- /dev/null +++ b/trunk/etherpad/src/static/js/ace.js @@ -0,0 +1,29 @@ +Ace2Editor.registry={nextId:1};function Ace2Editor(){var K="Ace2Editor";var F=Ace2Editor;var B={};var A={editor:B,id:(F.registry.nextId++)}; +var D=false;var E=[];function C(R,Q){return function(){var T=this;var S=arguments;function U(){R.apply(T,S); +}if(Q){Q.apply(T,S);}if(D){U();}else{E.push(U);}};}function I(){for(var Q=0;Q<E.length;Q++){E[Q]();}E=[]; +}F.registry[A.id]=A;B.importText=C(function(R,Q){A.ace_importText(R,Q);});B.importAText=C(function(R,S,Q){A.ace_importAText(R,S,Q); +});B.exportText=function(){if(!D){return"(awaiting init)\n";}return A.ace_exportText();};B.getFrame=function(){return A.frame||null; +};B.focus=C(function(){A.ace_focus();});B.adjustSize=C(function(){var R=A.frame.parentNode;var Q=R.clientHeight; +A.frame.style.height=(Q?Q+"px":R.style.height);A.ace_editorChangedSize();});B.setEditable=C(function(Q){A.ace_setEditable(Q); +});B.getFormattedCode=function(){return A.ace_getFormattedCode();};B.setOnKeyPress=C(function(Q){A.ace_setOnKeyPress(Q); +});B.setOnKeyDown=C(function(Q){A.ace_setOnKeyDown(Q);});B.setNotifyDirty=C(function(Q){A.ace_setNotifyDirty(Q); +});B.setProperty=C(function(Q,R){A.ace_setProperty(Q,R);});B.getDebugProperty=function(Q){return A.ace_getDebugProperty(Q); +};B.setBaseText=C(function(Q){A.ace_setBaseText(Q);});B.setBaseAttributedText=C(function(R,Q){A.ace_setBaseAttributedText(R,Q); +});B.applyChangesToBase=C(function(R,Q,S){A.ace_applyChangesToBase(R,Q,S);});B.prepareUserChangeset=function(){if(!D){return null; +}return A.ace_prepareUserChangeset();};B.applyPreparedChangesetToBase=C(function(){A.ace_applyPreparedChangesetToBase(); +});B.setUserChangeNotificationCallback=C(function(Q){A.ace_setUserChangeNotificationCallback(Q);});B.setAuthorInfo=C(function(R,Q){A.ace_setAuthorInfo(R,Q); +});B.setAuthorSelectionRange=C(function(R,S,Q){A.ace_setAuthorSelectionRange(R,S,Q);});B.getUnhandledErrors=function(){if(!D){return[]; +}return A.ace_getUnhandledErrors();};B.execCommand=C(function(R,Q){A.ace_execCommand(R,Q);});var H=function(Q){return'<link rel="stylesheet" type="text/css" href="'+Q+'"/>'; +};var J=function(Q){return'\x3cscript type="text/javascript" src="'+Q+'">\x3c/script>';};var M=J;var N=H; +var L=function(Q){return'\'<link rel="stylesheet" type="text/css" href="'+Q+"\"/>'";};var G=function(Q){return'\'\\x3cscript type="text/javascript" src="'+Q+"\">\\x3c/script>'"; +};var P=G;var O=L;B.destroy=C(function(){A.ace_dispose();A.frame.parentNode.removeChild(A.frame);delete F.registry[A.id]; +A=null;});B.init=function(Q,S,R){B.importText(S);A.onEditorReady=function(){D=true;I();R();};(function(){var W='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; +var T=["'"+W+"<html><head>'"];T.push(("('<style type=\"text/css\">'+'body{margin:0;white-space:nowrap;}h1,h2,h3,h4,h5,h6{display:inline;line-height:2em;}#outerdocbody{background-color:#fff;}body.grayedout{background-color:#eee!important;}#innerdocbody{font-size:12px;font-family:monospace;line-height:16px;}body.doesWrap{white-space:normal;}#innerdocbody{padding-top:1px;padding-right:10px;padding-bottom:8px;padding-left:1px;overflow:hidden;background-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);}#sidediv{font-size:11px;font-family:monospace;line-height:16px;padding-top:8px;padding-right:3px;position:absolute;width:20px;top:0;left:0;cursor:default;color:white;}#sidedivinner{text-align:right;}.sidedivdelayed{background-color:#eee;color:#888!important;border-right:1px solid #999;}.sidedivhidden{display:none;}#outerdocbody iframe{display:block;position:relative;left:32px;top:7px;border:0;width:1px;height:1px;}#outerdocbody .hotrect{border:1px solid #999;position:absolute;}body.mozilla,body.safari{display:table-cell;}body.doesWrap{display:block!important;}.safari div{padding-right:1px;}p{margin:0;}#linemetricsdiv{position:absolute;left:-1000px;top:-1000px;color:white;z-index:-1;font-size:12px;font-family:monospace;}#overlaysdiv{position:absolute;left:-1000px;top:-1000px;}.syntax .c{color:#bd3f00;font-style:italic;}.syntax .o{font-weight:bold;}.syntax .p{font-weight:bold;}.syntax .k{color:blue;}.syntax .kc{color:purple;}.syntax .mf{color:purple;}.syntax .mh{color:purple;}.syntax .mi{color:purple;}.syntax .sr{color:purple;}.syntax .s2{color:purple;}.syntax .s1{color:purple;}.syntax .sd{color:purple;}.syntax .cs{color:#0a3;font-weight:bold;font-style:italic;}.syntax .err{color:#c00;font-weight:bold;text-decoration:underline;}.syntax .nt{font-weight:bold;}.syntax .nc{color:#336;}.syntax .nf{color:#336;}.syntax .nd{color:#999;}.syntax .m{color:purple;}.syntax .nb{color:purple;}.syntax .cp{color:#bd3f00;}.syntax .flash{background-color:#adf!important;}.syntax .flashbad{background-color:#f55!important;}html{cursor:text;}span{cursor:auto;}a{cursor:pointer!important;}ul,ol,li{padding:0;margin:0;}ul{margin-left:1.5em;}ul ul{margin-left:0!important;}ul.list-bullet1{margin-left:1.5em;}ul.list-bullet2{margin-left:3em;}ul.list-bullet3{margin-left:4.5em;}ul.list-bullet4{margin-left:6em;}ul.list-bullet5{margin-left:7.5em;}ul.list-bullet6{margin-left:9em;}ul.list-bullet7{margin-left:10.5em;}ul.list-bullet8{margin-left:12em;}ul{list-style-type:disc;}ul.list-bullet1{list-style-type:disc;}ul.list-bullet2{list-style-type:circle;}ul.list-bullet3{list-style-type:square;}ul.list-bullet4{list-style-type:disc;}ul.list-bullet5{list-style-type:circle;}ul.list-bullet6{list-style-type:square;}ul.list-bullet7{list-style-type:disc;}ul.list-bullet8{list-style-type:circle;}'+'\\x3c/style>')")); +T.push(('(\'\\x3cscript type="text/javascript">//<!--\\n\'+\'function isNodeText(A){return(A.nodeType==3);}function object(B){var A=function(){};A.prototype=B;return new A();\\n}function extend(C,A){for(var B in A){C[B]=A[B];}return C;}function forEach(B,D){for(var A=0;A\\x3cB.length;\\nA++){var C=D(B[A],A);if(C){break;}}}function map(C,D){var B=[];for(var A=0;A\\x3cC.length;A++){if(D){B.push(D(C[A],A));\\n}else{B.push(C[A]);}}return B;}function filter(B,D){var C=[];for(var A=0;A\\x3cB.length;A++){if(D(B[A],A)){C.push(B[A]);\\n}}return C;}function isArray(A){return A&&typeof A==="object"&&!(A.propertyIsEnumerable("length"))&&typeof A.length==="number";\\n}var userAgent=navigator.userAgent.toLowerCase();var browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\\\\\\x2f: ]([\\\\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent),windows:/windows/.test(userAgent)};\\nfunction getAssoc(B,A){return B["_magicdom_"+A];}function setAssoc(C,A,B){C["_magicdom_"+A]=B;}function binarySearch(A,E){if(A\\x3c1){return 0;\\n}if(E(0)){return 0;}if(!E(A-1)){return A;}var D=0;var B=A-1;while((B-D)>1){var C=Math.floor((D+B)/2);\\nif(E(C)){B=C;}else{D=C;}}return B;}function binarySearchInfinite(C,B){var A=0;while(!B(A)){A+=C;}return binarySearch(A,B);\\n}function htmlPrettyEscape(A){return A.replace(/&/g,"&").replace(/\\x3c/g,"<").replace(/>/g,">").replace(/\\\\r?\\\\n/g,"\\\\\\\\n");\\n}function newSkipList(){var H=window.PROFILER;if(!H){H=function(){return{start:G,mark:G,literal:G,end:G,cancel:G};\\n};}function G(){}var B={key:null,levels:1,upPtrs:[null],downPtrs:[null],downSkips:[1],downSkipWidths:[0]};\\nvar E={key:null,levels:1,upPtrs:[null],downPtrs:[null],downSkips:[null],downSkipWidths:[null]};var A=0;\\nvar D=0;var I={};B.downPtrs[0]=E;E.upPtrs[0]=B;function J(Z){var W=B.levels;var T=W-1;var X=-1,b=0;var V=new Array(W);\\nvar Y=new Array(W);var a=new Array(W);V[T]=B;Y[T]=-1;a[T]=0;while(T>=0){var U=V[T];while(U.downPtrs[T]&&(X+U.downSkips[T]\\x3cZ)){X+=U.downSkips[T];\\nb+=U.downSkipWidths[T];U=U.downPtrs[T];}V[T]=U;Y[T]=X;a[T]=b;T--;if(T>=0){V[T]=U;}}return{nodes:V,idxs:Y,loc:Z,widthSkips:a,toString:function(){return"getPoint("+Z+")";\\n}};}function P(W){var V=0;var T=B;var U=B.levels-1;while(U>=0&&T.downPtrs[U]){while(T.downPtrs[U]&&(V+T.downSkipWidths[U]\\x3c=W)){V+=T.downSkipWidths[U];\\nT=T.downPtrs[U];}U--;}if(T===B){return(B.downPtrs[0]||null);}else{if(T===E){return(W==D?(E.upPtrs[0]||null):null);\\n}}return T;}function K(T){return(T&&T.width)||0;}function N(V,f,h){var X=H("insertKey",false);var W={key:f,levels:0,upPtrs:[],downPtrs:[],downSkips:[],downSkipWidths:[]};\\nX.mark("donealloc");var Y=V.nodes;var e=V.idxs;var k=V.loc;var j=V.widthSkips[0]+V.nodes[0].downSkipWidths[0];\\nvar a=K(h);X.mark("loop1");while(W.levels==0||Math.random()\\x3c0.01){var T=W.levels;W.levels++;if(T==Y.length){Y[T]=B;\\ne[T]=-1;B.levels++;E.levels++;B.downPtrs[T]=E;E.upPtrs[T]=B;B.downSkips[T]=A+1;B.downSkipWidths[T]=D;\\nV.widthSkips[T]=0;}var Z=W;var U=Y[T];var d=U.downPtrs[T];var b=k-e[T];var g=U.downSkips[T]+1-b;U.downSkips[T]=b;\\nU.downPtrs[T]=Z;Z.downSkips[T]=g;Z.upPtrs[T]=U;Z.downPtrs[T]=d;d.upPtrs[T]=Z;var c=j-V.widthSkips[T];\\nvar i=U.downSkipWidths[T]+a-c;U.downSkipWidths[T]=c;Z.downSkipWidths[T]=i;}X.mark("loop2");X.literal(Y.length,"PNL");\\nfor(var T=W.levels;T\\x3cY.length;T++){var U=Y[T];U.downSkips[T]++;U.downSkipWidths[T]+=a;}X.mark("map");\\nI["$KEY$"+f]=W;A++;D+=a;X.end();}function O(T){return T.nodes[0].downPtrs[0];}function S(U){U.loc++;for(var T=0;\\nT\\x3cU.nodes.length;T++){if(U.idxs[T]+U.nodes[T].downSkips[T]\\x3cU.loc){U.idxs[T]+=U.nodes[T].downSkips[T];\\nU.widthSkips[T]+=U.nodes[T].downSkipWidths[T];U.nodes[T]=U.nodes[T].downPtrs[T];}}}function M(W){var V=W.nodes[0].downPtrs[0];\\nvar X=K(V.entry);for(var T=0;T\\x3cW.nodes.length;T++){if(T\\x3cV.levels){var U=V.upPtrs[T];var Y=V.downPtrs[T];\\nvar a=U.downSkips[T]+V.downSkips[T]-1;U.downPtrs[T]=Y;Y.upPtrs[T]=U;U.downSkips[T]=a;var Z=U.downSkipWidths[T]+V.downSkipWidths[T]-X;\\nU.downSkipWidths[T]=Z;}else{var U=W.nodes[T];var Y=U.downPtrs[T];U.downSkips[T]--;U.downSkipWidths[T]-=X;\\n}}delete I["$KEY$"+V.key];A--;D-=X;}function R(V){var X=V.downSkipWidths[0];var Y=K(V.entry);var W=Y-X;\\nvar U=V;var T=0;while(T\\x3cU.levels){U.downSkipWidths[T]+=W;T++;while(T>=U.levels&&U.upPtrs[T-1]){U=U.upPtrs[T-1];\\n}}D+=W;}function L(X,W){var V=(W?0:-1);var T=X;while(T!==B){var U=T.levels-1;T=T.upPtrs[U];if(W){V+=T.downSkipWidths[U];\\n}else{V+=T.downSkips[U];}}return V;}function F(T){return I["$KEY$"+T];}function Q(Y){var U=B;var T=B.levels-1;\\nvar W=-1;function X(Z){if(Z===B){return false;}else{if(Z===E){return true;}else{return Y(Z.entry);}}}while(T>=0){var V=U.downPtrs[T];\\nwhile(!X(V)){W+=U.downSkips[T];U=V;V=U.downPtrs[T];}T--;}return W+1;}var C={length:function(){return A;\\n},atIndex:function(T){if(T\\x3c0){console.warn("atIndex("+T+")");}if(T>=A){console.warn("atIndex("+T+">="+A+")");\\n}return O(J(T)).entry;},splice:function(T,W,V){if(T\\x3c0){console.warn("splice("+T+", ...)");}if(T+W>A){console.warn("splice("+T+", "+W+", ...), N="+A);\\nconsole.warn("%s %s %s",typeof T,typeof W,typeof A);console.trace();}if(!V){V=[];}var Y=J(T);for(var U=0;\\nU\\x3cW;U++){M(Y);}for(var U=(V.length-1);U>=0;U--){var X=V[U];N(Y,X.key,X);var Z=F(X.key);Z.entry=X;}},next:function(T){return F(T.key).downPtrs[0].entry||null;\\n},prev:function(T){return F(T.key).upPtrs[0].entry||null;},push:function(T){C.splice(A,0,[T]);},slice:function(T,U){if(T===undefined){T=0;\\n}else{if(T\\x3c0){T+=A;}}if(U===undefined){U=A;}else{if(U\\x3c0){U+=A;}}if(T\\x3c0){T=0;}if(T>A){T=A;}if(U\\x3c0){U=0;\\n}if(U>A){U=A;}dmesg(String([T,U,A]));if(U\\x3c=T){return[];}var V=C.atIndex(T);var X=[V];for(var W=1;W\\x3c(U-T);\\nW++){V=C.next(V);X.push(V);}return X;},atKey:function(T){return F(T).entry;},indexOfKey:function(T){return L(F(T));\\n},indexOfEntry:function(T){return C.indexOfKey(T.key);},containsKey:function(T){return !!(F(T));},atOffset:function(T){return P(T).entry;\\n},keyAtOffset:function(T){return C.atOffset(T).key;},offsetOfKey:function(T){return L(F(T),true);},offsetOfEntry:function(T){return C.offsetOfKey(T.key);\\n},setEntryWidth:function(T,U){T.width=U;R(F(T.key));},totalWidth:function(){return D;},offsetOfIndex:function(T){if(T\\x3c0){return 0;\\n}if(T>=A){return D;}return C.offsetOfEntry(C.atIndex(T));},indexOfOffset:function(T){if(T\\x3c=0){return 0;\\n}if(T>=D){return A;}return C.indexOfEntry(C.atOffset(T));},search:function(T){return Q(T);},debugGetPoint:J,debugDepth:function(){return B.levels;\\n}};return C;}function makeVirtualLineView(B){var E=20;var D=null;function G(){return B.textContent.length;\\n}function F(){if(!D){var J=C();J.forwardByWhile(E);D=J;}return D.getVirtualLine()+1;}function H(L){var J=C();\\nJ.forwardByWhile(E,null,L);var K=J.getVirtualLine();J.backwardByWhile(8,function(){return J.getVirtualLine()==K;\\n});J.forwardByWhile(1,function(){return J.getVirtualLine()!=K;});var M=J.getOffset();return{vline:K,offset:(L-M)};\\n}function I(Q,P){var J=C();J.binarySearch(function(){return J.getVirtualLine()>=Q;});var M=J.getOffset();\\nvar L=J.getVirtualLine();J.forwardByWhile(E,null,M+P);J.backwardByWhile(1,function(){return J.getVirtualLine()!=L;\\n},M);var K=J.getOffset();var N=K-M;if(N\\x3cP&&L==(F()-1)){var O=G();N+=O-K;K=O;}return{vline:L,offset:N,lineChar:K};\\n}return{getNumVirtualLines:F,getVLineAndOffsetForChar:H,getCharForVLineAndOffset:I,makeCharSeeker:function(){return C();\\n}};function A(J){J=J.firstChild;while(J&&J.firstChild){J=J.firstChild;}if(J.data){return J;}return null;\\n}function C(){function T(a,b){var Z=a.parentNode;var f=(a.nodeValue.charAt(b)===" ");if(f){if(b==0){if(Z.previousSibling&&A(Z.previousSibling)){a=A(Z.previousSibling);\\nb=a.length-1;Z=a.parentNode;}else{return{top:Z.offsetTop,left:Z.offsetLeft};}}else{b--;}}var c=document.createElement("SPAN");\\nvar e=a.nodeValue;var d=document.createDocumentFragment();d.appendChild(document.createTextNode(e.substring(0,b)));\\nc.appendChild(document.createTextNode(e.substr(b,1)));d.appendChild(c);d.appendChild(document.createTextNode(e.substring(b+1)));\\nZ.replaceChild(d,a);var g={top:c.offsetTop,left:c.offsetLeft+(f?c.offsetWidth:0),height:c.offsetHeight};\\nwhile(Z.firstChild){Z.removeChild(Z.firstChild);}Z.appendChild(a);return g;}var Y=B.textContent;var O=Y.length;\\nvar M=null;var J=0;var L=0;var P;var N;var V;var X=0;function Q(){var Z=M;if(!Z){Z=B.firstChild;}else{Z=Z.nextSibling;\\n}while(Z&&!A(Z)){Z=Z.nextSibling;}return Z;}function S(){var Z=M;if(!Z){Z=B.lastChild;}else{Z=Z.previousSibling;\\n}while(Z&&!A(Z)){Z=Z.previousSibling;}return Z;}var K;if(O>0){M=Q();var R=T(A(M),0);V=R.height;P=R.top;\\nN=R.left;function W(b,a){var Z=T(b,a);X+=Math.round((Z.top-P)/V);P=Z.top;N=Z.left;}K={forward:function(e){var c=J;\\nvar Z=J+e;if(Z>(O-1)){Z=O-1;}while(J\\x3cZ){var d=A(M).length;var a=d-L;if(J+a>Z||!Q()){var b=Z-J;if(b>=a){b=a-1;\\n}J+=b;L+=b;break;}else{J+=a;L=0;M=Q();}}W(A(M),L);return J-c;},backward:function(c){var b=J;var Z=J-c;\\nif(Z\\x3c0){Z=0;}while(J>Z){if(J-L\\x3c=Z||!S()){var a=J-Z;if(a>L){a=L;}J-=a;L-=a;break;}else{J-=L+1;M=S();L=A(M).length-1;\\n}}W(A(M),L);return b-J;},getVirtualLine:function(){return X;},getLeftCoord:function(){return N;}};}else{N=B.offsetLeft;\\nK={forward:function(Z){return 0;},backward:function(Z){return 0;},getVirtualLine:function(){return 0;\\n},getLeftCoord:function(){return N;}};}K.getOffset=function(){return J;};K.getLineLength=function(){return O;\\n};K.toString=function(){return"seeker[curChar: "+J+"("+Y.charAt(J)+"), left: "+K.getLeftCoord()+", vline: "+K.getVirtualLine()+"]";\\n};function U(c,j,e,a){var b=null;var i=((typeof e)=="function");var h=e;var g=((typeof a)=="number");\\nvar d=a;while(b!==0&&((!i)||h())){var Z=j;if(g){var f=(c?J-d:d-J);if(f\\x3cZ){Z=f;}}if(Z\\x3c0){break;}b=(c?K.backward(Z):K.forward(Z));\\n}}K.forwardByWhile=function(Z,b,a){U(false,Z,b,a);};K.backwardByWhile=function(Z,b,a){U(true,Z,b,a);};\\nK.binarySearch=function(Z){var b=Z;var a=function(){return !Z();};K.forwardByWhile(20,a);K.backwardByWhile(20,b);\\nK.forwardByWhile(10,a);K.backwardByWhile(5,b);K.forwardByWhile(1,a);return K.getOffset()+(Z()?0:1);};\\nreturn K;}}var _opt=null;function AttribPool(){var A={};A.numToAttrib={};A.attribToNum={};A.nextNum=0;\\nA.putAttrib=function(C,E){var D=String(C);if(D in A.attribToNum){return A.attribToNum[D];}if(E){return -1;\\n}var B=A.nextNum++;A.attribToNum[D]=B;A.numToAttrib[B]=[String(C[0]||""),String(C[1]||"")];return B;};\\nA.getAttrib=function(C){var B=A.numToAttrib[C];if(!B){return B;}return[B[0],B[1]];};A.getAttribKey=function(C){var B=A.numToAttrib[C];\\nif(!B){return"";}return B[0];};A.getAttribValue=function(C){var B=A.numToAttrib[C];if(!B){return"";}return B[1];\\n};A.eachAttrib=function(C){for(var D in A.numToAttrib){var B=A.numToAttrib[D];C(B[0],B[1]);}};A.toJsonable=function(){return{numToAttrib:A.numToAttrib,nextNum:A.nextNum};\\n};A.fromJsonable=function(B){A.numToAttrib=B.numToAttrib;A.nextNum=B.nextNum;A.attribToNum={};for(var C in A.numToAttrib){A.attribToNum[String(A.numToAttrib[C])]=Number(C);\\n}return A;};return A;}var Changeset={};Changeset.error=function error(B){var A=new Error(B);A.easysync=true;\\nthrow A;};Changeset.assert=function assert(A,C){if(!A){var B=Array.prototype.slice.call(arguments,1).join("");\\nChangeset.error("Changeset: "+B);}};Changeset.parseNum=function(A){return parseInt(A,36);};Changeset.numToString=function(A){return A.toString(36).toLowerCase();\\n};Changeset.toBaseTen=function(A){var B=A.indexOf("$");var D=A.substring(0,B);var C=A.substring(B);return D.replace(/[0-9a-z]+/g,function(E){return String(Changeset.parseNum(E));\\n})+C;};Changeset.oldLen=function(A){return Changeset.unpack(A).oldLen;};Changeset.newLen=function(A){return Changeset.unpack(A).newLen;\\n};Changeset.opIterator=function(E,K){var D=/((?:\\\\*[0-9a-z]+)*)(?:\\\\|([0-9a-z]+))?([-+=])([0-9a-z]+)|\\\\?|/g;\\nvar L=(K||0);var B=L;var F=B;function C(){F=B;var M;if(_opt){M=_opt.nextOpInString(E,B);if(M){if(M.opcode()=="?"){Changeset.error("Hit error opcode in op stream");\\n}B=M.lastIndex();}}else{D.lastIndex=B;M=D.exec(E);B=D.lastIndex;if(M[0]=="?"){Changeset.error("Hit error opcode in op stream");\\n}}return M;}var A=C();var H=Changeset.newOp();function I(N){var M=(N||H);if(_opt&&A){M.attribs=A.attribs();\\nM.lines=A.lines();M.chars=A.chars();M.opcode=A.opcode();A=C();}else{if((!_opt)&&A[0]){M.attribs=A[1];\\nM.lines=Changeset.parseNum(A[2]||0);M.opcode=A[3];M.chars=Changeset.parseNum(A[4]);A=C();}else{Changeset.clearOp(M);\\n}}return M;}function G(){return !!(_opt?A:A[0]);}function J(){return F;}return{next:I,hasNext:G,lastIndex:J};\\n};Changeset.clearOp=function(A){A.opcode="";A.chars=0;A.lines=0;A.attribs="";};Changeset.newOp=function(A){return{opcode:(A||""),chars:0,lines:0,attribs:""};\\n};Changeset.cloneOp=function(A){return{opcode:A.opcode,chars:A.chars,lines:A.lines,attribs:A.attribs};\\n};Changeset.copyOp=function(B,A){A.opcode=B.opcode;A.chars=B.chars;A.lines=B.lines;A.attribs=B.attribs;\\n};Changeset.opString=function(B){if(!B.opcode){return"null";}var A=Changeset.opAssembler();A.append(B);\\nreturn A.toString();};Changeset.stringOp=function(A){return Changeset.opIterator(A).next();};Changeset.checkRep=function(C){var G=Changeset.unpack(C);\\nvar F=G.oldLen;var J=G.newLen;var M=G.ops;var E=G.charBank;var I=Changeset.smartOpAssembler();var D=0;\\nvar B=0;var H=0;var K=Changeset.opIterator(M);while(K.hasNext()){var A=K.next();switch(A.opcode){case"=":D+=A.chars;\\nB+=A.chars;break;case"-":D+=A.chars;Changeset.assert(D\\x3cF,D," >= ",F," in ",C);break;case"+":B+=A.chars;\\nH+=A.chars;Changeset.assert(B\\x3cJ,B," >= ",J," in ",C);break;}I.append(A);}B+=F-D;E=E.substring(0,H);while(E.length\\x3cH){E+="?";\\n}I.endDocument();var L=Changeset.pack(F,B,I.toString(),E);Changeset.assert(L==C,L," != ",C);return C;\\n};Changeset.smartOpAssembler=function(){var G=Changeset.mergingOpAssembler();var E=Changeset.mergingOpAssembler();\\nvar B=Changeset.mergingOpAssembler();var A=Changeset.stringAssembler();var C="";var F=0;function H(){A.append(B.toString());\\nB.clear();}function I(){A.append(G.toString());G.clear();A.append(E.toString());E.clear();}function D(O){if(!O.opcode){return;\\n}if(!O.chars){return;}if(O.opcode=="-"){if(C=="="){H();}G.append(O);F-=O.chars;}else{if(O.opcode=="+"){if(C=="="){H();\\n}E.append(O);F+=O.chars;}else{if(O.opcode=="="){if(C!="="){I();}B.append(O);}}}C=O.opcode;}function M(R,P,T,S){var O=Changeset.newOp(R);\\nO.attribs=Changeset.makeAttribsString(R,T,S);var Q=P.lastIndexOf("\\\\n");if(Q\\x3c0){O.chars=P.length;O.lines=0;\\nD(O);}else{O.chars=Q+1;O.lines=P.match(/\\\\n/g).length;D(O);O.chars=P.length-(Q+1);O.lines=0;D(O);}}function K(){I();\\nH();return A.toString();}function N(){G.clear();E.clear();B.clear();A.clear();F=0;}function L(){B.endDocument();\\n}function J(){return F;}return{append:D,toString:K,clear:N,endDocument:L,appendOpWithText:M,getLengthChange:J};\\n};if(_opt){Changeset.mergingOpAssembler=function(){var A=_opt.mergingOpAssembler();function C(F){A.append(F.opcode,F.chars,F.lines,F.attribs);\\n}function E(){return A.toString();}function B(){A.clear();}function D(){A.endDocument();}return{append:C,toString:E,clear:B,endDocument:D};\\n};}else{Changeset.mergingOpAssembler=function(){var C=Changeset.opAssembler();var A=Changeset.newOp();\\nvar B=0;function D(I){if(A.opcode){if(I&&A.opcode=="="&&!A.attribs){}else{C.append(A);if(B){A.chars=B;\\nA.lines=0;C.append(A);B=0;}}A.opcode="";}}function F(I){if(I.chars>0){if(A.opcode==I.opcode&&A.attribs==I.attribs){if(I.lines>0){A.chars+=B+I.chars;\\nA.lines+=I.lines;B=0;}else{if(A.lines==0){A.chars+=I.chars;}else{B+=I.chars;}}}else{D();Changeset.copyOp(I,A);\\n}}}function G(){D(true);}function H(){D();return C.toString();}function E(){C.clear();Changeset.clearOp(A);\\n}return{append:F,toString:H,clear:E,endDocument:G};};}if(_opt){Changeset.opAssembler=function(){var A=_opt.opAssembler();\\nfunction C(E){A.append(E.opcode,E.chars,E.lines,E.attribs);}function D(){return A.toString();}function B(){A.clear();\\n}return{append:C,toString:D,clear:B};};}else{Changeset.opAssembler=function(){var A=[];function C(E){A.push(E.attribs);\\nif(E.lines){A.push("|",Changeset.numToString(E.lines));}A.push(E.opcode);A.push(Changeset.numToString(E.chars));\\n}function D(){return A.join("");}function B(){A.length=0;}return{append:C,toString:D,clear:B};};}Changeset.stringIterator=function(D){var A=0;\\nfunction B(H){Changeset.assert(H\\x3c=C(),"!(",H," \\x3c= ",C(),")");}function F(H){B(H);var I=D.substr(A,H);\\nA+=H;return I;}function E(H){B(H);var I=D.substr(A,H);return I;}function G(H){B(H);A+=H;}function C(){return D.length-A;\\n}return{take:F,skip:G,remaining:C,peek:E};};Changeset.stringAssembler=function(){var A=[];function B(D){A.push(String(D));\\n}function C(){return A.join("");}return{append:B,toString:C};};Changeset.textLinesMutator=function(C){var A=[0,0];\\nvar D=false;var E=0,B=0;function O(X){C.splice.apply(C,X);}function S(){return C.toSource();}function J(X){if(C.get){return C.get(X);\\n}else{return C[X];}}function U(Y,X){if(C.slice){return C.slice(Y,X);}else{return[];}}function T(){if((typeof C.length)=="number"){return C.length;\\n}else{return C.length();}}function G(){A[0]=E;A[1]=0;if(B>0){F();}D=true;}function K(){O(A);A.length=2;\\nA[0]=A[1]=0;D=false;}function H(){return(E-A[0]\\x3c(A.length-2));}function W(X){print(X+": "+A.toSource()+" / "+E+","+B+" / "+S());\\n}function F(){if(!H()){A.push(J(A[0]+A[1]));A[1]++;}return 2+E-A[0];}function L(X,Z){if(X){if(Z){if(!D){G();\\n}for(var Y=0;Y\\x3cX;Y++){B=0;F();E++;}}else{if(D){if(X>1){K();}else{F();}}E+=X;B=0;}}}function R(Z,Y,X){if(Z){if(Y){L(Y,X);\\n}else{if(X&&!D){G();}if(D){F();}B+=Z;}}}function I(X){var Y="";if(X){if(!D){G();}function a(c){var b=A[0]+A[1];\\nreturn U(b,b+c).join("");}if(H()){if(B==0){Y=A[A.length-1];A.length--;Y+=a(X-1);A[1]+=X-1;}else{Y=a(X-1);\\nA[1]+=X-1;var Z=A.length-1;Y=A[Z].substring(B)+Y;A[Z]=A[Z].substring(0,B)+J(A[0]+A[1]);A[1]+=1;}}else{Y=a(X);\\nA[1]+=X;}}return Y;}function V(Y,Z){var a="";if(Y){if(Z){return I(Z);}else{if(!D){G();}var X=F();a=A[X].substring(B,B+Y);\\nA[X]=A[X].substring(0,B)+A[X].substring(B+Y);}}return a;}function M(Z,c){if(Z){if(!D){G();}if(c){var X=Changeset.splitTextLines(Z);\\nif(H()){var Y=A.length-1;var a=A[Y];var b=B;A[Y]=a.substring(0,b)+X[0];E++;X.splice(0,1);Array.prototype.push.apply(A,X);\\nE+=X.length;A.push(a.substring(b));B=0;}else{Array.prototype.push.apply(A,X);E+=X.length;}}else{var Y=F();\\nA[Y]=A[Y].substring(0,B)+Z+A[Y].substring(B);B+=Z.length;}}}function N(){var X=T();if(D){X+=A.length-2-A[1];\\n}return E\\x3cX;}function P(){if(D){K();}}var Q={skip:R,remove:V,insert:M,close:P,hasMore:N,removeLines:I,skipLines:L};\\nreturn Q;};Changeset.applyZip=function(I,K,H,J,G){var F=Changeset.opIterator(I,K);var E=Changeset.opIterator(H,J);\\nvar D=Changeset.smartOpAssembler();var A=Changeset.newOp();var C=Changeset.newOp();var B=Changeset.newOp();\\nwhile(A.opcode||F.hasNext()||C.opcode||E.hasNext()){if((!A.opcode)&&F.hasNext()){F.next(A);}if((!C.opcode)&&E.hasNext()){E.next(C);\\n}G(A,C,B);if(B.opcode){D.append(B);B.opcode="";}}D.endDocument();return D.toString();};Changeset.unpack=function(B){var G=/Z:([0-9a-z]+)([>\\x3c])([0-9a-z]+)|/;\\nvar A=G.exec(B);if((!A)||(!A[0])){Changeset.error("Not a changeset: "+B);}var D=Changeset.parseNum(A[1]);\\nvar E=(A[2]==">")?1:-1;var H=Changeset.parseNum(A[3]);var F=D+E*H;var I=A[0].length;var C=B.indexOf("$");\\nif(C\\x3c0){C=B.length;}return{oldLen:D,newLen:F,ops:B.substring(I,C),charBank:B.substring(C+1)};};Changeset.pack=function(C,G,F,D){var A=G-C;\\nvar E=(A>=0?">"+Changeset.numToString(A):"\\x3c"+Changeset.numToString(-A));var B=[];B.push("Z:",Changeset.numToString(C),E,F,"$",D);\\nreturn B.join("");};Changeset.applyToText=function(H,E){var C=Changeset.unpack(H);Changeset.assert(E.length==C.oldLen,"mismatched apply: ",E.length," / ",C.oldLen);\\nvar F=Changeset.opIterator(C.ops);var G=Changeset.stringIterator(C.charBank);var B=Changeset.stringIterator(E);\\nvar A=Changeset.stringAssembler();while(F.hasNext()){var D=F.next();switch(D.opcode){case"+":A.append(G.take(D.chars));\\nbreak;case"-":B.skip(D.chars);break;case"=":A.append(B.take(D.chars));break;}}A.append(B.take(B.remaining()));\\nreturn A.toString();};Changeset.mutateTextLines=function(G,F){var C=Changeset.unpack(G);var D=Changeset.opIterator(C.ops);\\nvar E=Changeset.stringIterator(C.charBank);var B=Changeset.textLinesMutator(F);while(D.hasNext()){var A=D.next();\\nswitch(A.opcode){case"+":B.insert(E.take(A.chars),A.lines);break;case"-":B.remove(A.chars,A.lines);break;\\ncase"=":B.skip(A.chars,A.lines,(!!A.attribs));break;}}B.close();};Changeset.composeAttributes=function(G,F,E,D){if((!G)&&E){return F;\\n}if(!F){return G;}var A=[];G.replace(/\\\\*([0-9a-z]+)/g,function(I,H){A.push(D.getAttrib(Changeset.parseNum(H)));\\nreturn"";});F.replace(/\\\\*([0-9a-z]+)/g,function(M,L){var H=D.getAttrib(Changeset.parseNum(L));var K=false;\\nfor(var I=0;I\\x3cA.length;I++){var J=A[I];if(J[0]==H[0]){if(H[1]||E){J[1]=H[1];}else{A.splice(I,1);}K=true;\\nbreak;}}if((!K)&&(H[1]||E)){A.push(H);}return"";});A.sort();var B=Changeset.stringAssembler();for(var C=0;\\nC\\x3cA.length;C++){B.append("*");B.append(Changeset.numToString(D.putAttrib(A[C])));}return B.toString();\\n};Changeset._slicerZipperFunc=function(A,B,C,D){if(A.opcode=="-"){Changeset.copyOp(A,C);A.opcode="";}else{if(!A.opcode){Changeset.copyOp(B,C);\\nB.opcode="";}else{switch(B.opcode){case"-":if(B.chars\\x3c=A.chars){if(A.opcode=="="){C.opcode="-";C.chars=B.chars;\\nC.lines=B.lines;C.attribs="";}A.chars-=B.chars;A.lines-=B.lines;B.opcode="";if(!A.chars){A.opcode="";\\n}}else{if(A.opcode=="="){C.opcode="-";C.chars=A.chars;C.lines=A.lines;C.attribs="";}B.chars-=A.chars;\\nB.lines-=A.lines;A.opcode="";}break;case"+":Changeset.copyOp(B,C);B.opcode="";break;case"=":if(B.chars\\x3c=A.chars){C.opcode=A.opcode;\\nC.chars=B.chars;C.lines=B.lines;C.attribs=Changeset.composeAttributes(A.attribs,B.attribs,A.opcode=="=",D);\\nB.opcode="";A.chars-=B.chars;A.lines-=B.lines;if(!A.chars){A.opcode="";}}else{C.opcode=A.opcode;C.chars=A.chars;\\nC.lines=A.lines;C.attribs=Changeset.composeAttributes(A.attribs,B.attribs,A.opcode=="=",D);A.opcode="";\\nB.chars-=A.chars;B.lines-=A.lines;}break;case"":Changeset.copyOp(A,C);A.opcode="";break;}}}};Changeset.applyToAttribution=function(D,C,B){var A=Changeset.unpack(D);\\nreturn Changeset.applyZip(C,0,A.ops,0,function(F,E,G){return Changeset._slicerZipperFunc(F,E,G,B);});\\n};Changeset.mutateAttributionLines=function(N,Q,O){var I=Changeset.unpack(N);var H=Changeset.opIterator(I.ops);\\nvar M=I.charBank;var G=0;var F=Changeset.textLinesMutator(Q);var B=null;function L(){return(B&&B.hasNext())||F.hasMore();\\n}function P(R){if((!(B&&B.hasNext()))&&F.hasMore()){var S=F.removeLines(1);B=Changeset.opIterator(S);\\n}if(B&&B.hasNext()){B.next(R);}else{R.opcode="";}}var D=null;function J(R){if(!D){D=Changeset.mergingOpAssembler();\\n}D.append(R);if(R.lines>0){Changeset.assert(R.lines==1,"Can\\\'t have op.lines of ",R.lines," in attribution lines");\\nF.insert(D.toString(),1);D=null;}}var A=Changeset.newOp();var E=Changeset.newOp();var C=Changeset.newOp();\\nwhile(A.opcode||H.hasNext()||E.opcode||L()){if((!A.opcode)&&H.hasNext()){H.next(A);}if((!A.opcode)&&(!E.opcode)&&(!D)&&(!(B&&B.hasNext()))){break;\\n}else{if(A.opcode=="="&&A.lines>0&&(!A.attribs)&&(!E.opcode)&&(!D)&&(!(B&&B.hasNext()))){F.skipLines(A.lines);\\nA.opcode="";}else{if(A.opcode=="+"){if(A.lines>1){var K=M.indexOf("\\\\n",G)+1-G;Changeset.copyOp(A,C);A.chars-=K;\\nA.lines--;C.lines=1;C.chars=K;}else{Changeset.copyOp(A,C);A.opcode="";}J(C);G+=C.chars;C.opcode="";}else{if((!E.opcode)&&L()){P(E);\\n}Changeset._slicerZipperFunc(E,A,C,O);if(C.opcode){J(C);C.opcode="";}}}}}Changeset.assert(!D,"line assembler not finished");\\nF.close();};Changeset.joinAttributionLines=function(D){var C=Changeset.mergingOpAssembler();for(var A=0;\\nA\\x3cD.length;A++){var E=D[A];var B=Changeset.opIterator(E);while(B.hasNext()){C.append(B.next());}}return C.toString();\\n};Changeset.splitAttributionLines=function(J,K){var G=Changeset.opIterator(J);var C=Changeset.mergingOpAssembler();\\nvar I=[];var D=0;function E(L){C.append(L);if(L.lines>0){I.push(C.toString());C.clear();}D+=L.chars;}while(G.hasNext()){var A=G.next();\\nvar F=A.chars;var B=A.lines;while(B>1){var H=K.indexOf("\\\\n",D)+1;Changeset.assert(H>0,"newlineEnd \\x3c= 0 in splitAttributionLines");\\nA.chars=H-D;A.lines=1;E(A);F-=A.chars;B-=A.lines;}if(B==1){A.chars=F;A.lines=1;}E(A);}return I;};Changeset.splitTextLines=function(A){return A.match(/[^\\\\n]*(?:\\\\n|[^\\\\n]$)/g);\\n};Changeset.compose=function(J,H,L){var B=Changeset.unpack(J);var A=Changeset.unpack(H);var K=B.oldLen;\\nvar I=B.newLen;Changeset.assert(I==A.oldLen,"mismatched composition");var G=A.newLen;var D=Changeset.stringIterator(B.charBank);\\nvar E=Changeset.stringIterator(A.charBank);var C=Changeset.stringAssembler();var F=Changeset.applyZip(B.ops,0,A.ops,0,function(O,N,M){var Q=O.opcode;\\nvar P=N.opcode;if(Q=="+"&&P=="-"){D.skip(Math.min(O.chars,N.chars));}Changeset._slicerZipperFunc(O,N,M,L);\\nif(M.opcode=="+"){if(P=="+"){C.append(E.take(M.chars));}else{C.append(D.take(M.chars));}}});return Changeset.pack(K,G,F,C.toString());\\n};Changeset.attributeTester=function(D,B){if(!B){return C;}var A=B.putAttrib(D,true);if(A\\x3c0){return C;\\n}else{var E=new RegExp("\\\\\\\\*"+Changeset.numToString(A)+"(?!\\\\\\\\w)");return function(F){return E.test(F);\\n};}function C(F){return false;}};Changeset.identity=function(A){return Changeset.pack(A,A,"","");};Changeset.makeSplice=function(B,A,F,E,H,J){var D=B.length;\\nif(A>=D){A=D-1;}if(F>B.length-A-1){F=B.length-A-1;}var G=B.substring(A,A+F);var I=D+E.length-G.length;\\nvar C=Changeset.smartOpAssembler();C.appendOpWithText("=",B.substring(0,A));C.appendOpWithText("-",G);\\nC.appendOpWithText("+",E,H,J);C.endDocument();return Changeset.pack(D,I,C.toString(),E);};Changeset.toSplices=function(G){var F=Changeset.unpack(G);\\nvar B=[];var C=0;var E=Changeset.opIterator(F.ops);var H=Changeset.stringIterator(F.charBank);var D=false;\\nwhile(E.hasNext()){var A=E.next();if(A.opcode=="="){C+=A.chars;D=false;}else{if(!D){B.push([C,C,""]);\\nD=true;}if(A.opcode=="-"){C+=A.chars;B[B.length-1][1]+=A.chars;}else{if(A.opcode=="+"){B[B.length-1][2]+=H.take(A.chars);\\n}}}}return B;};Changeset.characterRangeFollow=function(M,N,L,K){var C=N;var A=L;var J=Changeset.toSplices(M);\\nvar H=0;for(var G=0;G\\x3cJ.length;G++){var F=J[G];var B=F[0]+H;var E=F[1]+H;var I=F[2].length;var D=I-(E-B);\\nif(B\\x3c=C&&E>=A){if(K){C=A=B;}else{C=A=B+I;}}else{if(E\\x3c=C){C+=D;A+=D;}else{if(B>=A){}else{if(B>=C&&E\\x3c=A){A+=D;\\n}else{if(E\\x3cA){C=B+I;A+=D;}else{A=B;}}}}}H+=D;}return[C,A];};Changeset.moveOpsToNewPool=function(A,F,C){var B=A.indexOf("$");\\nif(B\\x3c0){B=A.length;}var D=A.substring(0,B);var E=A.substring(B);return D.replace(/\\\\*([0-9a-z]+)/g,function(K,G){var H=Changeset.parseNum(G);\\nvar J=F.getAttrib(H);var I=C.putAttrib(J);return"*"+Changeset.numToString(I);})+E;};Changeset.makeAttribution=function(B){var A=Changeset.smartOpAssembler();\\nA.appendOpWithText("+",B);return A.toString();};Changeset.eachAttribNumber=function(A,D){var B=A.indexOf("$");\\nif(B\\x3c0){B=A.length;}var C=A.substring(0,B);C.replace(/\\\\*([0-9a-z]+)/g,function(F,E){D(Changeset.parseNum(E));\\nreturn"";});};Changeset.filterAttribNumbers=function(B,A){return Changeset.mapAttribNumbers(B,A);};Changeset.mapAttribNumbers=function(A,E){var B=A.indexOf("$");\\nif(B\\x3c0){B=A.length;}var D=A.substring(0,B);var C=D.replace(/\\\\*([0-9a-z]+)/g,function(H,G){var F=E(Changeset.parseNum(G));\\nif(F===true){return H;}else{if((typeof F)==="number"){return"*"+Changeset.numToString(F);}else{return"";\\n}}});return C+A.substring(B);};Changeset.makeAText=function(A,B){return{text:A,attribs:(B||Changeset.makeAttribution(A))};\\n};Changeset.applyToAText=function(A,B,C){return{text:Changeset.applyToText(A,B.text),attribs:Changeset.applyToAttribution(A,B.attribs,C)};\\n};Changeset.cloneAText=function(A){return{text:A.text,attribs:A.attribs};};Changeset.copyAText=function(A,B){B.text=A.text;\\nB.attribs=A.attribs;};Changeset.appendATextToAssembler=function(C,B){var D=Changeset.opIterator(C.attribs);\\nvar A=Changeset.newOp();while(D.hasNext()){D.next(A);if(!D.hasNext()){if(A.lines\\x3c=1){A.lines=0;A.chars--;\\nif(A.chars){B.append(A);}}else{var F=C.text.lastIndexOf("\\\\n",C.text.length-2)+1;var E=C.text.length-F-1;\\nA.lines--;A.chars-=(E+1);B.append(A);A.lines=0;A.chars=E;if(A.chars){B.append(A);}}}else{B.append(A);\\n}}};Changeset.prepareForWire=function(C,B){var A=new AttribPool();var D=Changeset.moveOpsToNewPool(C,B,A);\\nreturn{translated:D,pool:A};};Changeset.isIdentity=function(B){var A=Changeset.unpack(B);return A.ops==""&&A.oldLen==A.newLen;\\n};Changeset.opAttributeValue=function(C,B,A){return Changeset.attribsAttributeValue(C.attribs,B,A);};\\nChangeset.attribsAttributeValue=function(C,D,A){var B="";if(C){Changeset.eachAttribNumber(C,function(E){if(A.getAttribKey(E)==D){B=A.getAttribValue(E);\\n}});}return B;};Changeset.builder=function(D){var B=Changeset.smartOpAssembler();var A=Changeset.newOp();\\nvar E=Changeset.stringAssembler();var C={keep:function(I,G,F,H){A.opcode="=";A.attribs=(F&&Changeset.makeAttribsString("=",F,H))||"";\\nA.chars=I;A.lines=(G||0);B.append(A);return C;},keepText:function(H,G,F){B.appendOpWithText("=",H,G,F);\\nreturn C;},insert:function(F,H,G){B.appendOpWithText("+",F,H,G);E.append(F);return C;},remove:function(G,F){A.opcode="-";\\nA.attribs="";A.chars=G;A.lines=(F||0);B.append(A);return C;},toString:function(){B.endDocument();var F=D+B.getLengthChange();\\nreturn Changeset.pack(D,F,B.toString(),E.toString());}};return C;};Changeset.makeAttribsString=function(E,A,D){if(!A){return"";\\n}else{if((typeof A)=="string"){return A;}else{if(D&&A&&A.length){if(A.length>1){A=A.slice();A.sort();\\n}var C=[];for(var B=0;B\\x3cA.length;B++){var F=A[B];if(E=="="||(E=="+"&&F[1])){C.push("*"+Changeset.numToString(D.putAttrib(F)));\\n}}return C.join("");}}}};Changeset.subattribution=function(I,F,H){var E=Changeset.opIterator(I,0);var D=Changeset.smartOpAssembler();\\nvar A=Changeset.newOp();var B=Changeset.newOp();var C=Changeset.newOp();function G(){if(B.chars){while(B.opcode&&(A.opcode||E.hasNext())){if(!A.opcode){E.next(A);\\n}if(B.opcode&&A.opcode&&B.chars>=A.chars&&A.lines>0&&B.lines\\x3c=0){B.lines++;}Changeset._slicerZipperFunc(A,B,C,null);\\nif(C.opcode){D.append(C);C.opcode="";}}}}B.opcode="-";B.chars=F;G();if(H===undefined){if(A.opcode){D.append(A);\\n}while(E.hasNext()){E.next(A);D.append(A);}}else{B.opcode="=";B.chars=H-F;G();}return D.toString();};\\nChangeset.inverse=function(U,F,G,J){function P(a){if(F.get){return F.get(a);}else{return F[a];}}function Z(){if((typeof F.length)=="number"){return F.length;\\n}else{return F.length();}}function Q(a){if(G.get){return G.get(a);}else{return G[a];}}function Y(){if((typeof G.length)=="number"){return G.length;\\n}else{return G.length();}}var C=0;var E=0;var D=null;var I;var A=Changeset.newOp("+");var R=Changeset.unpack(U);\\nvar N=Changeset.opIterator(R.ops);var H=Changeset.builder(R.newLen);function M(c,e){if((!D)||(I!=C)){D=Changeset.opIterator(Q(C));\\nI=C;var b=0;var d=false;while(!d){D.next(A);if(b+A.chars>=E){A.chars-=(E-b);d=true;}else{b+=A.chars;}}}while(c>0){if((!A.chars)&&(!D.hasNext())){C++;\\nE=0;I=C;A.chars=0;D=Changeset.opIterator(Q(C));}if(!A.chars){D.next(A);}var a=Math.min(c,A.chars);e(a,A.attribs,a==A.chars&&A.lines>0);\\nc-=a;A.chars-=a;E+=a;}if((!A.chars)&&(!D.hasNext())){C++;E=0;}}function X(b,a){if(a){C+=a;E=0;}else{if(D&&I==C){M(b,function(){});\\n}else{E+=b;}}}function S(e){var a=0;var b=Changeset.stringAssembler();var c=P(C).substring(E);a+=c.length;\\nb.append(c);var f=C+1;while(a\\x3ce){var d=P(f);a+=d.length;b.append(d);f++;}return b.toString().substring(0,e);\\n}function W(b){var a={};return function(c){if(!a[c]){a[c]=b(c);}return a[c];};}var K=[];var L=[];while(N.hasNext()){var B=N.next();\\nif(B.opcode=="="){if(B.attribs){K.length=0;L.length=0;Changeset.eachAttribNumber(B.attribs,function(a){K.push(J.getAttribKey(a));\\nL.push(J.getAttribValue(a));});var T=W(function(f){var d=[];for(var a=0;a\\x3cK.length;a++){var c=K[a];var e=L[a];\\nvar b=Changeset.attribsAttributeValue(f,c,J);if(e!=b){d.push([c,b]);}}return Changeset.makeAttribsString("=",d,J);\\n});M(B.chars,function(a,c,b){H.keep(a,b?1:0,T(c));});}else{X(B.chars,B.lines);H.keep(B.chars,B.lines);\\n}}else{if(B.opcode=="+"){H.remove(B.chars,B.lines);}else{if(B.opcode=="-"){var V=S(B.chars);var O=0;M(B.chars,function(a,b,c){H.insert(V.substr(O,a),b);\\nO+=a;});}}}}return Changeset.checkRep(H.toString());};Changeset.follow=function(N,L,K,G){var C=Changeset.unpack(N);\\nvar B=Changeset.unpack(L);var O=C.oldLen;var M=B.oldLen;Changeset.assert(O==M,"mismatched follow");var I=Changeset.stringIterator(C.charBank);\\nvar H=Changeset.stringIterator(B.charBank);var F=C.newLen;var D=0;var A=0;var E=Changeset.attributeTester(["insertorder","first"],G);\\nvar J=Changeset.applyZip(C.ops,0,B.ops,0,function(Q,P,R){if(Q.opcode=="+"||P.opcode=="+"){var S;if(P.opcode!="+"){S=1;\\n}else{if(Q.opcode!="+"){S=2;}else{var V=I.peek(1);var T=H.peek(1);var W=E(Q.attribs);var U=E(P.attribs);\\nif(W&&!U){S=1;}else{if(U&&!W){S=2;}else{if(V=="\\\\n"&&T!="\\\\n"){S=2;}else{if(V!="\\\\n"&&T=="\\\\n"){S=1;}else{if(K){S=2;\\n}else{S=1;}}}}}}}if(S==1){I.skip(Q.chars);R.opcode="=";R.lines=Q.lines;R.chars=Q.chars;R.attribs="";Q.opcode="";\\n}else{H.skip(P.chars);Changeset.copyOp(P,R);P.opcode="";}}else{if(Q.opcode=="-"){if(!P.opcode){Q.opcode="";\\n}else{if(Q.chars\\x3c=P.chars){P.chars-=Q.chars;P.lines-=Q.lines;Q.opcode="";if(!P.chars){P.opcode="";}}else{Q.chars-=P.chars;\\nQ.lines-=P.lines;P.opcode="";}}}else{if(P.opcode=="-"){Changeset.copyOp(P,R);if(!Q.opcode){P.opcode="";\\n}else{if(P.chars\\x3c=Q.chars){Q.chars-=P.chars;Q.lines-=P.lines;P.opcode="";if(!Q.chars){Q.opcode="";}}else{R.lines=Q.lines;\\nR.chars=Q.chars;P.lines-=Q.lines;P.chars-=Q.chars;Q.opcode="";}}}else{if(!Q.opcode){Changeset.copyOp(P,R);\\nP.opcode="";}else{if(!P.opcode){Changeset.copyOp(Q,R);Q.opcode="";}else{R.opcode="=";R.attribs=Changeset.followAttributes(Q.attribs,P.attribs,G);\\nif(Q.chars\\x3c=P.chars){R.chars=Q.chars;R.lines=Q.lines;P.chars-=Q.chars;P.lines-=Q.lines;Q.opcode="";if(!P.chars){P.opcode="";\\n}}else{R.chars=P.chars;R.lines=P.lines;Q.chars-=P.chars;Q.lines-=P.lines;P.opcode="";}}}}}}switch(R.opcode){case"=":D+=R.chars;\\nA+=R.chars;break;case"-":D+=R.chars;break;case"+":A+=R.chars;break;}});A+=F-D;return Changeset.pack(F,A,J,B.charBank);\\n};Changeset.followAttributes=function(F,E,B){if((!E)||(!B)){return"";}if(!F){return E;}var A=[];E.replace(/\\\\*([0-9a-z]+)/g,function(H,G){A.push(B.getAttrib(Changeset.parseNum(G)));\\nreturn"";});F.replace(/\\\\*([0-9a-z]+)/g,function(K,J){var I=B.getAttrib(Changeset.parseNum(J));for(var G=0;\\nG\\x3cA.length;G++){var H=A[G];if(I[0]==H[0]){if(I[1]\\x3c=H[1]){A.splice(G,1);}break;}}return"";});var C=Changeset.stringAssembler();\\nfor(var D=0;D\\x3cA.length;D++){C.append("*");C.append(Changeset.numToString(B.putAttrib(A[D])));}return C.toString();\\n};function makeCSSManager(I){function E(N){var M=document.styleSheets;for(var K=0;K\\x3cM.length;K++){var L=M[K];\\nif(L.title==N){return L;}}return null;}var A=E(I);function C(){return(A.cssRules||A.rules);}function H(K){if(A.deleteRule){A.deleteRule(K);\\n}else{A.removeRule(K);}}function F(L,K){if(A.insertRule){A.insertRule(K+" {}",L);}else{A.addRule(K,null,L);\\n}}var B=[];function D(L){for(var K=0;K\\x3cB.length;K++){if(B[K]==L){return K;}}return -1;}function G(K){var L=D(K);\\nif(L\\x3c0){F(0,K);B.splice(0,0,K);L=0;}return C().item(L).style;}function J(L){var K=D(L);if(K>=0){H(K);\\nB.splice(K,1);}}return{selectorStyle:G,removeSelectorStyle:J,info:function(){return B.length+":"+C().length;\\n}};}var colorutils={};colorutils.css2triple=function(C){var B=colorutils.css2sixhex(C);function A(D){return Number("0x"+D)/255;\\n}return[A(B.substr(0,2)),A(B.substr(2,2)),A(B.substr(4,2))];};colorutils.css2sixhex=function(E){var A=/[0-9a-fA-F]+/.exec(E)[0];\\nif(A.length!=6){var C=A.charAt(0);var B=A.charAt(1);var D=A.charAt(2);A=C+C+B+B+D+D;}return A;};colorutils.triple2css=function(B){function A(D){var C=colorutils.clamp(Math.round(D*255),0,255);\\nreturn("0"+C.toString(16)).slice(-2);}return"#"+A(B[0])+A(B[1])+A(B[2]);};colorutils.clamp=function(A,C,B){return A\\x3cC?C:(A>B?B:A);\\n};colorutils.min3=function(C,B,A){return(C\\x3cB)?(C\\x3cA?C:A):(B\\x3cA?B:A);};colorutils.max3=function(C,B,A){return(C>B)?(C>A?C:A):(B>A?B:A);\\n};colorutils.colorMin=function(A){return colorutils.min3(A[0],A[1],A[2]);};colorutils.colorMax=function(A){return colorutils.max3(A[0],A[1],A[2]);\\n};colorutils.scale=function(B,A,C){return colorutils.clamp(A+B*(C-A),0,1);};colorutils.unscale=function(B,A,C){return colorutils.clamp((B-A)/(C-A),0,1);\\n};colorutils.scaleColor=function(C,B,A){return[colorutils.scale(C[0],B,A),colorutils.scale(C[1],B,A),colorutils.scale(C[2],B,A)];\\n};colorutils.unscaleColor=function(C,B,A){return[colorutils.unscale(C[0],B,A),colorutils.unscale(C[1],B,A),colorutils.unscale(C[2],B,A)];\\n};colorutils.luminosity=function(A){return A[0]*0.3+A[1]*0.59+A[2]*0.11;};colorutils.saturate=function(A){var C=colorutils.colorMin(A);\\nvar B=colorutils.colorMax(A);if(B-C\\x3c=0){return[1,1,1];}return colorutils.unscaleColor(A,C,B);};colorutils.blend=function(C,B,A){return[colorutils.scale(A,C[0],B[0]),colorutils.scale(A,C[1],B[1]),colorutils.scale(A,C[2],B[2])];\\n};undoModule=(function(){var A=(function(){var M=[];var O=0;var Q="undoableEvent";var N="externalChange";\\nfunction P(){M.length=0;M.push({elementType:Q,eventType:"bottom"});O=1;}P();function T(Y){var X=extend({},Y);\\nX.elementType=Q;M.push(X);O++;}function U(Y){var X=M.length-1;if(M[X].elementType==N){M[X].changeset=Changeset.compose(M[X].changeset,Y,D());\\n}else{M.push({elementType:N,changeset:Y});}}function R(e){var c=M.length-1-e;var X=M.length-1;while(X>c||M[X].elementType==N){if(M[X].elementType==N){var Z=M[X];\\nvar Y=M[X-1];if(Y.backset){var b=Z.changeset;var d=Y.backset;Y.backset=Changeset.follow(b,Y.backset,false,D());\\nZ.changeset=Changeset.follow(d,Z.changeset,true,D());if((typeof Y.selStart)=="number"){var a=Changeset.characterRangeFollow(b,Y.selStart,Y.selEnd);\\nY.selStart=a[0];Y.selEnd=a[1];if(Y.selStart==Y.selEnd){Y.selFocusAtStart=false;}}}M[X-1]=Z;M[X]=Y;if(X>=2&&M[X-2].elementType==N){Z.changeset=Changeset.compose(M[X-2].changeset,Z.changeset,D());\\nM.splice(X-2,1);X--;}}else{X--;}}}function W(X){R(X);return M[M.length-1-X];}function V(){return O;}function S(){R(0);\\nO--;return M.pop();}return{numEvents:V,popEvent:S,pushEvent:T,pushExternalChange:U,clearStack:P,getNthFromTop:W};\\n})();var B=0;function J(){A.clearStack();B=0;}function H(O,P){var M=0;var N=0;while(M>=0&&M\\x3cO.length){M=O.indexOf(P,M);\\nif(M>=0){N++;M++;}}return N;}function C(M,N){return H(Changeset.unpack(M).ops,N);}function K(N,M){if(!N){return M;\\n}if(!M){return N;}var U=C(N,"+");var T=C(M,"+");var R=C(N,"-");var Q=C(M,"-");if(U==1&&T==1&&R==0&&Q==0){var O=Changeset.compose(N,M,D());\\nvar S=C(O,"+");var P=C(O,"-");if(S==1&&P==0){return O;}}else{if(U==0&&T==0&&R==1&&Q==1){var O=Changeset.compose(N,M,D());\\nvar S=C(O,"+");var P=C(O,"-");if(S==0&&P==1){return O;}}}return null;}function I(M){var N=A.getNthFromTop(0);\\nfunction P(){if((typeof M.selStart)=="number"){N.selStart=M.selStart;N.selEnd=M.selEnd;N.selFocusAtStart=M.selFocusAtStart;\\n}}if((!M.backset)||Changeset.isIdentity(M.backset)){P();}else{var O=false;if(N.eventType==M.eventType){var Q=K(M.backset,N.backset);\\nif(Q){N.backset=Q;P();O=true;}}if(!O){A.pushEvent(M);}B=0;}}function G(M){if(M&&!Changeset.isIdentity(M)){A.pushExternalChange(M);\\n}}function E(M){if((typeof M.selStart)!="number"){return null;}else{return{selStart:M.selStart,selEnd:M.selEnd,selFocusAtStart:M.selFocusAtStart};\\n}}function F(M){if(B\\x3cA.numEvents()-1){var O=A.getNthFromTop(B);var N=A.getNthFromTop(B+1);var P=M(O.backset,E(N));\\nA.pushEvent(P);B+=2;}else{M();}}function L(M){if(B>=2){var O=A.getNthFromTop(0);var N=A.getNthFromTop(1);\\nM(O.backset,E(N));A.popEvent();B-=2;}else{M();}}function D(){return undoModule.apool;}return{clearHistory:J,reportEvent:I,reportExternalChange:G,performUndo:F,performRedo:L,enabled:true,apool:null};\\n})();var _MAX_LIST_LEVEL=8;function sanitizeUnicode(A){return A.replace(/[\\\\uffff\\\\ufffe\\\\ufeff\\\\ufdd0-\\\\ufdef\\\\ud800-\\\\udfff]/g,"?");\\n}function makeContentCollector(h,H,M,Y,U){H=H||{};var B=Y||{isNodeText:function(k){return(k.nodeType==3);\\n},nodeTagName:function(k){return k.tagName;},nodeValue:function(k){return k.nodeValue;},nodeNumChildren:function(k){return k.childNodes.length;\\n},nodeChild:function(l,k){return l.childNodes.item(k);},nodeProp:function(l,k){return l[k];},nodeAttr:function(l,k){return l.getAttribute(k);\\n},optNodeInnerHTML:function(k){return k.innerHTML;}};var i={div:1,p:1,pre:1,li:1};function R(k){return !!i[(B.nodeTagName(k)||"").toLowerCase()];\\n}function e(k){return sanitizeUnicode(k.replace(/[\\\\n\\\\r ]/g," ").replace(/\\\\xa0/g," ").replace(/\\\\t/g," "));\\n}function Q(l,k){return B.nodeProp(l,"_magicdom_"+k);}var A=(function(){var k=[];var o=[];var l=null;\\nvar n=Changeset.newOp("+");var m={length:function(){return k.length;},atColumnZero:function(){return k[k.length-1]==="";\\n},startNew:function(){k.push("");m.flush(true);l=Changeset.smartOpAssembler();},textOfLine:function(p){return k[p];\\n},appendText:function(p,q){k[k.length-1]+=p;n.attribs=q;n.chars=p.length;l.append(n);},textLines:function(){return k.slice();\\n},attribLines:function(){return o;},flush:function(p){if(l){o.push(l.toString());l=null;}}};m.startNew();\\nreturn m;}());var E={};function O(k){if(!A.atColumnZero()){K(k);}}var N,D,C;var J=[-1,-1],I=[-1,-1];var j={div:1,p:1,pre:1};\\nfunction S(k,l){if(B.nodeNumChildren(k)==0){return true;}if(B.nodeNumChildren(k)==1&&Q(k,"shouldBeEmpty")&&B.optNodeInnerHTML(k)==" "&&!Q(k,"unpasted")){if(l){var m=B.nodeChild(k,0);\\nL(m,0,l);L(m,1,l);}return true;}return false;}function F(n,m){var l=A.length()-1;var k=A.textOfLine(l).length;\\nif(k==0&&m.listType&&m.listType!="none"){k+=1;}k+=n;return[l,k];}function P(k,l,m){if(!B.isNodeText(k)){L(k,l,m);\\n}}function L(m,k,l){if(D&&m==D.node&&D.index==k){J=F(0,l);}if(C&&m==C.node&&C.index==k){I=F(0,l);}}function b(k,l){k.flags[l]=(k.flags[l]||0)+1;\\n}function W(k,l){k.flags[l]--;}function X(k,l){if(!k.attribs[l]){k.attribs[l]=1;}else{k.attribs[l]++;\\n}G(k);}function f(k,l){k.attribs[l]--;G(k);}function T(k,l){var m=k.listType;k.listLevel=(k.listLevel||0)+1;\\nif(l!="none"){k.listNesting=(k.listNesting||0)+1;}k.listType=l;G(k);return m;}function d(k,l){k.listLevel--;\\nif(k.listType!="none"){k.listNesting--;}k.listType=l;G(k);}function c(k,m){var l=k.author;k.authorLevel=(k.authorLevel||0)+1;\\nk.author=m;G(k);return l;}function g(k,l){k.authorLevel--;k.author=l;G(k);}function G(k){var l=[];for(var m in k.attribs){if(k.attribs[m]){l.push([m,"true"]);\\n}}if(k.authorLevel>0){var n=["author",k.author];if(M.putAttrib(n,true)>=0){l.push(n);}}k.attribString=Changeset.makeAttribsString("+",l,M);\\n}function V(k){A.appendText("*",Changeset.makeAttribsString("+",[["list",k.listType],["insertorder","first"]],M));\\n}function K(k){if(k){var l=A.textOfLine(A.length()-1).length==0;if(l&&k.listType&&k.listType!="none"){V(k);\\n}}A.startNew();}E.notifySelection=function(k){if(k){N=k;D=N.startPoint;C=N.endPoint;}};E.collectContent=function(m,k){if(!k){k={flags:{},attribs:{},attribString:""};\\n}var AF=R(m);var AK=S(m,k);if(AF){O(k);}var AL=A.length()-1;P(m,0,k);if(B.isNodeText(m)){var n=B.nodeValue(m);\\nvar AG="";var t=0;if(n.length==0){if(D&&m==D.node){J=F(0,k);}if(C&&m==C.node){I=F(0,k);}}while(n.length>0){var AA=0;\\nif(k.flags.preMode){var AE=n.split("\\\\n",1)[0];AA=AE.length+1;AG=n.substring(AA);n=AE;}else{}if(D&&m==D.node&&D.index-t\\x3c=n.length){J=F(D.index-t,k);\\n}if(C&&m==C.node&&C.index-t\\x3c=n.length){I=F(C.index-t,k);}var u=n;if((!k.flags.preMode)&&/^[\\\\r\\\\n]*$/.exec(n)){u="";\\n}var AC=A.textOfLine(A.length()-1).length==0;if(AC){u=u.replace(/^\\\\n*/,"");}if(AC&&k.listType&&k.listType!="none"){V(k);\\n}A.appendText(e(u),k.attribString);t+=AA;n=AG;if(n.length>0){K(k);}}}else{var l=(B.nodeTagName(m)||"").toLowerCase();\\nif(l=="br"){K(k);}else{if(l=="script"||l=="style"){}else{if(!AK){var p=B.nodeAttr(m,"style");var r=B.nodeProp(m,"className");\\nvar w=(l=="pre");if((!w)&&H.safari){w=(p&&/\\\\bwhite-space:\\\\s*pre\\\\b/i.exec(p));}if(w){b(k,"preMode");}var s=null;\\nvar v=null;var AB=null;if(h){function o(x){s=(s||[]);s.push(x);X(k,x);}if(l=="b"||(p&&/\\\\bfont-weight:\\\\s*bold\\\\b/i.exec(p))||l=="strong"){o("bold");\\n}if(l=="i"||(p&&/\\\\bfont-style:\\\\s*italic\\\\b/i.exec(p))||l=="em"){o("italic");}if(l=="u"||(p&&/\\\\btext-decoration:\\\\s*underline\\\\b/i.exec(p))||l=="ins"){o("underline");\\n}if(l=="s"||(p&&/\\\\btext-decoration:\\\\s*line-through\\\\b/i.exec(p))||l=="del"){o("strikethrough");}if(l=="h1"){o("h1");\\n}if(l=="h2"){o("h2");}if(l=="h3"){o("h3");}if(l=="h4"){o("h4");}if(l=="h5"){o("h5");}if(l=="h6"){o("h6");\\n}if(l=="ul"){var z;var AD=r&&/(?:^| )list-(bullet[12345678])\\\\b/.exec(r);z=AD&&AD[1]||"bullet"+String(Math.min(_MAX_LIST_LEVEL,(k.listNesting||0)+1));\\nv=(T(k,z)||"none");}else{if((l=="div"||l=="p")&&r&&r.match(/(?:^| )ace-line\\\\b/)){v=(T(k,z)||"none");}}if(U&&r){var y=r.match(/\\\\S+/g);\\nif(y&&y.length>0){for(var q=0;q\\x3cy.length;q++){var AH=y[q];var AI=U(AH);if(AI){AB=(c(k,AI)||"none");break;\\n}}}}}var AJ=B.nodeNumChildren(m);for(var q=0;q\\x3cAJ;q++){var AH=B.nodeChild(m,q);E.collectContent(AH,k);\\n}if(w){W(k,"preMode");}if(s){for(var q=0;q\\x3cs.length;q++){f(k,s[q]);}}if(v){d(k,v);}if(AB){g(k,AB);}}}}}if(!H.msie){P(m,1,k);\\n}if(AF){if(A.length()-1==AL){K(k);}else{O(k);}}if(H.msie){P(m,1,k);}};E.notifyNextNode=function(k){if((!k)||(R(k)&&!S(k))){O(null);\\n}};var a=function(){return J;};var Z=function(){return I;};E.getLines=function(){return A.textLines();\\n};E.finish=function(){A.flush();var l=A.attribLines();var k=E.getLines();k.length--;l.length--;var n=a();\\nvar o=Z();function p(){var v=2000;var z=10;var x=0;var w=0;for(var q=k.length-1;q>=0;q--){var s=k[q];\\nvar u=l[q];if(s.length>v+z){var r=[];var t=[];while(s.length>v){lengthToTake=v;r.push(s.substring(0,lengthToTake));\\ns=s.substring(lengthToTake);t.push(Changeset.subattribution(u,0,lengthToTake));u=Changeset.subattribution(u,lengthToTake);\\n}if(s.length>0){r.push(s);t.push(u);}function y(AA){if(AA[0]\\x3c0){return;}var AB=AA[0];var AD=AA[1];if(AB>q){AB+=(r.length-1);\\n}else{if(AB==q){var AC=0;while(AD>r[AC].length){AD-=r[AC].length;AC++;}AB+=AC;}}AA[0]=AB;AA[1]=AD;}y(n);\\ny(o);x++;w+=r.length;r.unshift(q,1);k.splice.apply(k,r);t.unshift(q,1);l.splice.apply(l,t);}}return{linesWrapped:x,numLinesAfter:w};\\n}var m=p();return{selStart:n,selEnd:o,linesWrapped:m.linesWrapped,numLinesAfter:m.numLinesAfter,lines:k,lineAttribs:l};\\n};return E;}function makeChangesetTracker(K,A,J){var D=Changeset.makeAText("\\\\n");var B=null;var C=Changeset.identity(1);\\nvar F=false;var E=false;var G=null;var H=null;function L(){if(G&&H===null){H=K.setTimeout(function(){try{G();\\n}finally{H=null;}},0);}}var I;return I={isTracking:function(){return F;},setBaseText:function(M){I.setBaseAttributedText(Changeset.makeAText(M),null);\\n},setBaseAttributedText:function(M,N){J.withCallbacks("setBaseText",function(P){F=true;D=Changeset.cloneAText(M);\\nif(N){var O=(new AttribPool()).fromJsonable(N);D.attribs=Changeset.moveOpsToNewPool(D.attribs,O,A);}B=null;\\nC=Changeset.identity(M.text.length);E=true;try{P.setDocumentAttributedText(M);}finally{E=false;}});},composeUserChangeset:function(M){if(!F){return;\\n}if(E){return;}if(Changeset.isIdentity(M)){return;}C=Changeset.compose(C,M,A);L();},applyChangesToBase:function(M,O,N){if(!F){return;\\n}J.withCallbacks("applyChangesToBase",function(V){if(N){var U=(new AttribPool()).fromJsonable(N);M=Changeset.moveOpsToNewPool(M,U,A);\\n}D=Changeset.applyToAText(M,D,A);var P=M;if(B){var Q=B;B=Changeset.follow(M,Q,false,A);P=Changeset.follow(Q,M,true,A);\\n}var R=true;var S=C;C=Changeset.follow(P,S,R,A);var T=Changeset.follow(S,P,!R,A);var W=true;E=true;try{V.applyChangesetToDocument(T,W);\\n}finally{E=false;}});},prepareUserChangeset:function(){var M;if(B){M=Changeset.compose(B,C,A);}else{if(Changeset.isIdentity(C)){M=null;\\n}else{M=C;}}var N=null;if(M){B=M;C=Changeset.identity(Changeset.newLen(M));N=M;}var P=null;if(N){var O=Changeset.prepareForWire(N,A);\\nP=O.pool.toJsonable();N=O.translated;}var Q={changeset:N,apool:P};return Q;},applyPreparedChangesetToBase:function(){if(!B){throw new Error("applySubmittedChangesToBase: no submitted changes to apply");\\n}D=Changeset.applyToAText(B,D,A);B=null;},setUserChangeNotificationCallback:function(M){G=M;},hasUncommittedChanges:function(){return !!(B||(!Changeset.isIdentity(C)));\\n}};}var linestylefilter={};linestylefilter.ATTRIB_CLASSES={bold:"tag:b",italic:"tag:i",underline:"tag:u",strikethrough:"tag:s",h1:"tag:h1",h2:"tag:h2",h3:"tag:h3",h4:"tag:h4",h5:"tag:h5",h6:"tag:h6"};\\nlinestylefilter.getAuthorClassName=function(A){return"author-"+A.replace(/[^a-y0-9]/g,function(B){if(B=="."){return"-";\\n}return"z"+B.charCodeAt(0)+"z";});};linestylefilter.getLineStyleFilter=function(B,E,A,D){if(B==0){return A;\\n}var C=A;var F=(function(){var N=B;var L=0;var J;var G;function P(R){var Q="";Changeset.eachAttribNumber(R,function(U){var S=D.getAttribKey(U);\\nif(S){var T=D.getAttribValue(U);if(T){if(S=="author"){Q+=" "+linestylefilter.getAuthorClassName(T);}else{if(S=="list"){Q+=" list:"+T;\\n}else{if(linestylefilter.ATTRIB_CLASSES[S]){Q+=" "+linestylefilter.ATTRIB_CLASSES[S];}}}}}});return Q.substring(1);\\n}var O=Changeset.opIterator(E);var H,I;function K(){H=O.next();I=(H.opcode&&P(H.attribs));}K();function M(){if(L\\x3cN){J=I;\\nG=H.chars;K();while(H.opcode&&I==J){G+=H.chars;K();}}}M();return function(Q,S){while(Q.length>0){if(G\\x3c=0){return C(Q,S);\\n}var R=Q.length;if(R>G){R=G;}var T=Q.substring(0,R);Q=Q.substring(R);C(T,(S&&S+" ")+J);L+=R;G-=R;if(G==0){M();\\n}}};})();return F;};linestylefilter.getAtSignSplitterFilter=function(E,C){var B=/@/g;B.lastIndex=0;var A=null;\\nvar D;while((D=B.exec(E))){if(!A){A=[];}A.push(D.index);}if(!A){return C;}return linestylefilter.textAndClassFuncSplitter(C,A);\\n};linestylefilter.REGEX_WORDCHAR=/[\\\\u0030-\\\\u0039\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u00FF\\\\u0100-\\\\u1FFF\\\\u3040-\\\\u9FFF\\\\uF900-\\\\uFDFF\\\\uFE70-\\\\uFEFE\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFDC]/;\\nlinestylefilter.REGEX_URLCHAR=new RegExp("("+/[-:@a-zA-Z0-9_.,~%+\\\\\\x2f\\\\\\\\?=&#;()$]/.source+"|"+linestylefilter.REGEX_WORDCHAR.source+")");\\nlinestylefilter.REGEX_URL=new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\\\\\\x2f\\\\\\x2f|mailto:)/.source+linestylefilter.REGEX_URLCHAR.source+"*(?![:.,;])"+linestylefilter.REGEX_URLCHAR.source,"g");\\nlinestylefilter.getURLFilter=function(I,F){linestylefilter.REGEX_URL.lastIndex=0;var A=null;var C=null;\\nvar B;while((B=linestylefilter.REGEX_URL.exec(I))){if(!A){A=[];C=[];}var D=B.index;var E=B[0];A.push([D,E]);\\nC.push(D,D+E.length);}if(!A){return F;}function G(L){for(var K=0;K\\x3cA.length;K++){var J=A[K];if(L>=J[0]&&L\\x3cJ[0]+J[1].length){return J[1];\\n}}return false;}var H=(function(){var J=0;return function(K,N){var O=K.length;var M=N;var L=G(J);if(L){M+=" url:"+L;\\n}F(K,M);J+=O;};})();return linestylefilter.textAndClassFuncSplitter(H,C);};linestylefilter.textAndClassFuncSplitter=function(D,B){var A=0;\\nvar C=0;while(B&&A\\x3cB.length&&B[A]==0){A++;}function E(F,H){if((!B)||A>=B.length){D(F,H);C+=F.length;}else{var J=B;\\nvar G=J[A]-C;var I=F.length;if(G>=I){D(F,H);C+=F.length;if(G==I){A++;}}else{if(G>0){D(F.substring(0,G),H);\\nC+=G;}A++;E(F.substring(G),H);}}}return E;};linestylefilter.populateDomLine=function(F,D,E,G){var A=F;\\nif(A.slice(-1)=="\\\\n"){A=A.substring(0,A.length-1);}function C(H,I){G.appendSpan(H,I);}var B=C;B=linestylefilter.getURLFilter(A,B);\\nB=linestylefilter.getLineStyleFilter(A.length,D,B,E);B(A,"");};var domline={};domline.noop=function(){};\\ndomline.identity=function(A){return A;};domline.addToLineClass=function(A,B){B.replace(/\\\\S+/g,function(C){if(C.indexOf("line:")==0){A=(A?A+" ":"")+C.substring(5);\\n}});return A;};domline.createDomLine=function(N,H,J,O){var A={node:null,appendSpan:domline.noop,prepareForAdd:domline.noop,notifyAdded:domline.noop,clearSpans:domline.noop,finishUpdate:domline.noop,lineMarker:0};\\nvar M=(J||{});var G=O;if(G){A.node=G.createElement("div");}else{A.node={innerHTML:"",className:""};}var D=[];\\nvar F,E;var C=null;function K(R){return domline.processSpaces(R,H);}var L=domline.identity;var Q=(H?L:K);\\nvar P=(H?K:L);var B="ace-line";A.appendSpan=function(W,R){if(R.indexOf("list")>=0){var U=/(?:^| )list:(\\\\S+)/.exec(R);\\nif(U){U=U[1];if(U){F=\\\'\\x3cul class="list-\\\'+U+\\\'">\\x3cli>\\\';E="\\x3c/li>\\x3c/ul>";}A.lineMarker+=W.length;return;}}var X=null;\\nvar S=null;if(R.indexOf("url")>=0){R=R.replace(/(^| )url:(\\\\S+)/g,function(a,Z,Y){X=Y;return Z+"url";});\\n}if(R.indexOf("tag")>=0){R=R.replace(/(^| )tag:(\\\\S+)/g,function(a,Z,Y){if(!S){S=[];}S.push(Y.toLowerCase());\\nreturn Z+Y;});}if((!W)&&R){B=domline.addToLineClass(B,R);}else{if(W){var T="";var V="";if(X){T=T+\\\'\\x3ca href="\\\'+X.replace(/\\\\"/g,""")+\\\'">\\\';\\nV="\\x3c/a>"+V;}if(S){S.sort();T=T+"\\x3c"+S.join(">\\x3c")+">";S.reverse();V="\\x3c/"+S.join(">\\x3c/")+">"+V;}D.push(\\\'\\x3cspan class="\\\',R||"",\\\'">\\\',T,Q(domline.escapeHTML(W)),V,"\\x3c/span>");\\n}}};A.clearSpans=function(){D=[];B="";A.lineMarker=0;};function I(){var R=P(D.join(""));if(!R){if((!G)||(!J)){R+=" ";\\n}else{if(!M.msie){R+="\\x3cbr/>";}}}if(N){R=(F||"")+R+(E||"");}D=F=E=null;if(R!==C){C=R;A.node.innerHTML=C;\\n}if(B!==null){A.node.className=B;}}A.prepareForAdd=I;A.finishUpdate=I;A.getInnerHTML=function(){return C||"";\\n};return A;};domline.escapeHTML=function(B){var A=/[&\\x3c>\\\'"]/g;/\\\']/;if(!A.MAP){A.MAP={"&":"&","\\x3c":"<",">":">",\\\'"\\\':""","\\\'":"'"};\\n}return B.replace(A,function(C){return A.MAP[C];});};domline.processSpaces=function(F,G){if(F.indexOf("\\x3c")\\x3c0&&!G){return F.replace(/ /g," ");\\n}var B=[];F.replace(/\\x3c[^>]*>?| |[^ \\x3c]+/g,function(H){B.push(H);});if(G){var D=true;var E=false;for(var A=B.length-1;\\nA>=0;A--){var C=B[A];if(C==" "){if(D||E){B[A]=" ";}D=false;E=true;}else{if(C.charAt(0)!="\\x3c"){D=false;\\nE=false;}}}for(var A=0;A\\x3cB.length;A++){var C=B[A];if(C==" "){B[A]=" ";break;}else{if(C.charAt(0)!="\\x3c"){break;\\n}}}}else{for(var A=0;A\\x3cB.length;A++){var C=B[A];if(C==" "){B[A]=" ";}}}return B.join("");};\'+\'//-->\\n\\x3c/script>\')')); +T.push(('(\'\\x3cscript type="text/javascript">//<!--\\n\'+\'function OUTER(Cj){var AL=false;var B4=false;var Ae=" ";var BW=8;var BO=4;var CC=4;var Ai=20;var Bj=8;\\nvar BS=8;var BU=[];var e="";var BL=false;var E=parent.editorInfo;var g=window.frameElement;var F=g.ace_outerWin;\\ng.ace_outerWin=null;var U=g.nextSibling;var x=U.nextSibling;var Cb=x.nextSibling;BX();var Au=function(i){};\\nvar Ar=function(i){return true;};var An=function(){};var A={lines:newSkipList(),selStart:null,selEnd:null,selFocusAtStart:false,alltext:"",alines:[],apool:new AttribPool()};\\nif(undoModule.enabled){undoModule.apool=A.apool;}var B,D;var l=true;var L=true;var AQ=true;var AY=true;\\nvar q=Ai+BO+BS;var Aj=Bj;var Bo=0,CQ=0;var T=(AL&&top.console);if(!T){var Al=["log","debug","info","warn","error","assert","dir","dirxml","group","groupEnd","time","timeEnd","count","trace","profile","profileEnd"];\\nT={};for(var Ah=0;Ah\\x3cAl.length;++Ah){T[Al[Ah]]=function(){};}}var P=window.PROFILER;if(!P){P=function(){return{start:I,mark:I,literal:I,end:I,cancel:I};\\n};}function I(){}function Ce(i){return i;}var w=I;window.dmesg=I;var O=parent;var AR="monospace";var v=12;\\nfunction AW(){return Math.round(v*4/3);}var X=null;function Bh(){X=makeCSSManager("dynamicsyntax");}var N=makeChangesetTracker(O,A.apool,{withCallbacks:function(i,Cp){Z(i,function(){G(1);\\nCp({setDocumentAttributedText:function(Cq){Ab(Cq);},applyChangesetToDocument:function(Cs,Cr){var Cq=C.editEvent.eventType;\\nC.startNewEvent("nonundoable");c(Cs,Cr);C.startNewEvent(Cq);}});});}});var Ao={};function CV(i,Cp){if((typeof i)!="string"){throw new Error("setAuthorInfo: author ("+i+") is not a string");\\n}if(!Cp){delete Ao[i];if(X){X.removeSelectorStyle(Av(BP(i)));}}else{Ao[i]=Cp;if(Cp.bgcolor){if(X){var Cq=Cp.bgcolor;\\nif((typeof Cp.fade)=="number"){Cq=BZ(Cq,Cp.fade);}X.selectorStyle(Av(BP(i))).backgroundColor=Cq;}}}}function BP(i){return"author-"+i.replace(/[^a-y0-9]/g,function(Cp){if(Cp=="."){return"-";\\n}return"z"+Cp.charCodeAt(0)+"z";});}function Bd(i){if(i.substring(0,7)=="author-"){return i.substring(7).replace(/[a-y0-9]+|-|z.+?z/g,function(Cp){if(Cp=="-"){return".";\\n}else{if(Cp.charAt(0)=="z"){return String.fromCharCode(Number(Cp.slice(1,-1)));}else{return Cp;}}});}return null;\\n}function Av(i){return".authorColors ."+i;}function AT(){if(X){var Cp=x.offsetHeight;var Cq=AW();var i=0;\\nvar Cs=0;if(Cp\\x3cCq){i=Math.ceil((Cq-Cp)/2);Cs=Cq-Cp-i;}var Cr=X.selectorStyle("#innerdocbody span");Cr.paddingTop=Cs+"px";\\nCr.paddingBottom=i+"px";}}function Ci(Cp){var i=colorutils.css2triple(Cp);i=colorutils.saturate(i);i=colorutils.scaleColor(i,0,0.5/colorutils.luminosity(i));\\nreturn colorutils.triple2css(i);}function BZ(Cp,Cq){var i=colorutils.css2triple(Cp);i=colorutils.blend(i,[1,1,1],Cq);\\nreturn colorutils.triple2css(i);}function By(i){O.setTimeout(function(){alert(i);},0);}var C=null;function b(Cq,Cx){if(BL){return;\\n}if(C){T.error("Can\\\'t enter callstack "+Cq+", already in "+C.type);}var Ct=false;function Cw(){Ct=true;\\nT.profile();}function Cr(Cz){return{eventType:Cz,backset:null};}function Cs(Cz){if(A.selStart&&A.selEnd){var C2=A.lines.offsetOfIndex(A.selStart[0])+A.selStart[1];\\nvar C1=A.lines.offsetOfIndex(A.selEnd[0])+A.selEnd[1];Cz.selStart=C2;Cz.selEnd=C1;Cz.selFocusAtStart=A.selFocusAtStart;\\n}if(undoModule.enabled){var C0=false;try{if(Cz.eventType=="setup"||Cz.eventType=="importText"||Cz.eventType=="setBaseText"){undoModule.clearHistory();\\n}else{if(Cz.eventType=="nonundoable"){if(Cz.changeset){undoModule.reportExternalChange(Cz.changeset);\\n}}else{undoModule.reportEvent(Cz);}}C0=true;}finally{if(!C0){undoModule.enabled=false;}}}}function Cy(C1,C0){var Cz=C.editEvent;\\nif(!C0){Cs(Cz);}C.editEvent=Cr(C1);return Cz;}C={type:Cq,docTextChanged:false,selectionAffected:false,userChangedSelection:false,domClean:false,profileRest:Cw,isUserChange:false,repChanged:false,editEvent:Cr(Cq),startNewEvent:Cy};\\nvar Cu=false;var Cv;try{Cv=Cx();Cu=true;}catch(Cp){BU.push({error:Cp,time:+new Date()});w(Cp.toString());\\nthrow Cp;}finally{var i=C;if(Cu){Cs(i.editEvent);if(i.domClean&&i.type!="setup"){if(i.isUserChange){if(i.repChanged){AH.notifyChange();\\n}else{AH.notifyTick();}}Be.recolorLines();if(i.selectionAffected){Ba();}if((i.docTextChanged||i.userChangedSelection)&&i.type!="applyChangesToBase"){CP();\\n}if(i.docTextChanged&&i.type.indexOf("importText")\\x3c0){An();}}}else{if(C.type=="idleWorkTimer"){H.atLeast(1000);\\n}}C=null;if(Ct){T.profileEnd();}}return Cv;}function Z(Cp,i){if(!C){b(Cp,i);}else{i();}}function Ag(i){if(A.lines.containsKey(i)){var Cp=A.lines.offsetOfKey(i);\\nvar Cq=A.lines.atKey(i).width;AV(Cp,Cp+Cq);}}function AM(i){return A.lines.atOffset(i).key;}var Be=(function(){var i={};\\nvar Cp={};Cp.setCharNeedsRecoloring=function(Cq){if(Cq>=A.alltext.length){Cq=A.alltext.length-1;}i[AM(Cq)]=true;\\n};Cp.setCharRangeNeedsRecoloring=function(Cs,Cr){if(Cs>=A.alltext.length){Cs=A.alltext.length-1;}if(Cr>=A.alltext.length){Cr=A.alltext.length-1;\\n}var Cu=A.lines.atOffset(Cs);var Ct=A.lines.atOffset(Cr).key;i[Ct]=true;var Cq=Cu;while(Cq&&Cq.key!=Ct){i[Cq.key]=true;\\nCq=A.lines.next(Cq);}};Cp.recolorLines=function(){for(var Cq in i){Ag(Cq);}i={};};return Cp;})();var AH=(function(){var i={};\\ni.notifyTick=function(){Cr(false);};i.notifyChange=function(){Cr(true);};i.shouldNormalizeOnChar=function(Ct){if(Cq.active){return true;\\n}Ct=String.fromCharCode(Ct);return !!(Cp[Ct]);};var Cq={active:false,whichChars:null,whichLineKeys:null,expireTime:null};\\nvar Cp={"(":1,")":-1,"[":2,"]":-2,"{":3,"}":-3};var Cs=/[{}\\\\[\\\\]()]/g;function Cr(C0){function C5(C8){var C7=BI();\\nvar DA=100;var C9=3000;if(C7[0]>C8-DA){C7[0]=C8-DA;}if(C7[0]\\x3cC8-C9){C7[0]=C8-C9;}if(C7[0]\\x3c0){C7[0]=0;\\n}if(C7[1]\\x3cC8+DA){C7[1]=C8+DA;}if(C7[1]>C8+C9){C7[1]=C8+C9;}if(C7[1]>A.lines.totalWidth()){C7[1]=A.lines.totalWidth();\\n}return C7;}function C6(DH,DC){var C8=C5(DH);var DF=A.alltext.substring(C8[0],C8[1]);var DG=DF.replace(Cs,"(");\\nvar C7=DH-C8[0];var DE=[];var DA=false;var DB=false;function DI(){if(C7\\x3c0){return;}if(DC){C7++;}else{C7--;\\n}if(C7\\x3c0||C7>=DF.length){C7=-1;}if(C7>=0){if(DC){C7=DG.indexOf("(",C7);}else{C7=DG.lastIndexOf("(",C7);\\n}}}while((!DA)&&(C7>=0)){if(BH(C7+C8[0])=="p"){var DJ=Cp[DF.charAt(C7)];var DD=DC;var C9=DJ;if(C9\\x3c0){DD=!DD;\\nC9=-C9;}if(DD){DE.push(C9);}else{var DK=DE.pop();if(DK!=C9){DA=true;DB=false;}else{if(DE.length==0){DA=true;\\nDB=true;}}}}if((!DA)&&(C7>=0)){DI();}}if(!DA){return null;}return{chr:(C7+C8[0]),good:DB};}var Ct=Cq;\\nvar Cu=null;var Cw=null;if(Ct.active&&(C0||(S()>Ct.expireTime))){Cw=Ct.whichLineKeys;Ct.active=false;\\n}if((!Ct.active)&&C0&&V()&&u()>0){var Cv=A7();if(Cv>0&&BH(Cv-1)=="p"){var Cz=A.alltext.charAt(Cv-1);if(Cp[Cz]){var C2=(Cp[Cz]>0);\\nvar Cx=C6(Cv-1,C2);if(Cx){var Cy=Cx.chr;var C4=Cx.good;Ct.active=true;Cu={};Cu[Cv-1]="flash";Cu[Cy]=(C4?"flash":"flashbad");\\nCt.whichLineKeys=[];Ct.whichLineKeys.push(AM(Cv-1));Ct.whichLineKeys.push(AM(Cy));Ct.expireTime=S()+4000;\\nnewlyActive=true;}}}}if(Cw){Ag(Cw[0]);Ag(Cw[1]);}if(Ct.active&&Cu){function C3(C8,C7,C9,DB){var DA=Cu[DB];\\nif(C7){C9(C8,C7+" "+DA);}else{C9(C8,C7);}}for(var C1 in Cu){AV((+C1),(+C1)+1,null,C3);}}}return i;})();\\nfunction B8(){BL=true;if(H){H.never();}BF();}function BN(){return;function Cp(){throw new Error("checkALines");\\n}if(A.alines.length!=A.lines.length()){Cp();}for(var Cq=0;Cq\\x3cA.alines.length;Cq++){var Cu=A.alines[Cq];\\nvar Cv=A.lines.atIndex(Cq).text+"\\\\n";var Cw=Cv.length;var Cr=Changeset.opIterator(Cu);var Ct=0;while(Cr.hasNext()){var Cs=Cr.next();\\nCt+=Cs.chars;if(Cr.hasNext()){if(Cs.lines!=0){Cp();}}else{if(Cs.lines!=1){Cp();}}}if(Ct!=Cw){Cp();}}}function CD(i){L=i;\\nvar Cp="doesWrap";R(B,"doesWrap",L);O.setTimeout(function(){Z("setWraps",function(){G(7);BY();h();});\\n},0);}function CK(i){var Cp=AY;AY=!!i;if(i!=Cp){if(!i){Z("setStyled",function(){G(12);var Cq=[];for(var Cr in Ad){Cq.push([Cr,""]);\\n}A2(0,A.alltext.length,Cq);});}}}function Bv(i){AR=i;B.style.fontFamily=AR;x.style.fontFamily=AR;O.setTimeout(function(){AT();\\n},0);}function Bl(i){v=i;B.style.fontSize=v+"px";B.style.lineHeight=AW()+"px";U.style.lineHeight=AW()+"px";\\nx.style.fontSize=v+"px";O.setTimeout(function(){AT();},0);}function BY(){AV(0,A.alltext.length);}function BG(i){l=i;\\nif(!l){Az(false);}else{Az(true);}R(B,"static",!l);}function Ax(){BG(l);}function CA(i,Cs,Cq){var Cp;if(Cq){if(i.charAt(i.length-1)!="\\\\n"){throw new Error("new raw text must end with newline");\\n}if(/[\\\\r\\\\t\\\\xa0]/.exec(i)){throw new Error("new raw text must not contain CR, tab, or nbsp");}Cp=i.substring(0,i.length-1).split("\\\\n");\\n}else{Cp=map(i.split("\\\\n"),CH);}var Cr="\\\\n";if(Cp.length>0){Cr=Cp.join("\\\\n")+"\\\\n";}Z("importText"+(Cs?"Undoable":""),function(){Bb(Cr);\\n});if(Cq&&A.alltext!=i){throw new Error("mismatch error setting raw text in importText");}}function B9(i,Cp,Cr){i=Changeset.cloneAText(i);\\nif(Cp){var Cq=(new AttribPool()).fromJsonable(Cp);i.attribs=Changeset.moveOpsToNewPool(i.attribs,Cq,A.apool);\\n}Z("importText"+(Cr?"Undoable":""),function(){Ab(i);});}function Ab(Cq){G(8);var Cs=A.lines.totalWidth();\\nvar Cr=A.lines.length();var Cu=A.lines.offsetOfIndex(Cr-1);var Ct=A.lines.atIndex(Cr-1).text.length;var Cp=Changeset.smartOpAssembler();\\nvar i=Changeset.newOp("-");i.chars=Cu;i.lines=Cr-1;Cp.append(i);i.chars=Ct;i.lines=0;Cp.append(i);Changeset.appendATextToAssembler(Cq,Cp);\\nvar Cv=Cs+Cp.getLengthChange();var Cw=Changeset.checkRep(Changeset.pack(Cs,Cv,Cp.toString(),Cq.text.slice(0,-1)));\\nc(Cw);d([0,A.lines.atIndex(0).lineMarker],[0,A.lines.atIndex(0).lineMarker]);H.atMost(100);if(A.alltext!=Cq.text){w(htmlPrettyEscape(A.alltext));\\nw(htmlPrettyEscape(Cq.text));throw new Error("mismatch error setting raw text in setDocAText");}}function Bb(i){Ab(Changeset.makeAText(i));\\n}function CW(){var Cp=A.alltext;var i=Cp.length;if(i>0){i--;}return Cp.substring(0,i);}function CL(){if(C&&!C.domClean){Z("exportText",function(){G(2);\\n});}return CW();}function B7(){h();}function Bn(i){Ar=i;}function Bq(i){Au=i;}function Bp(i){An=i;}function Bm(){if(C&&!C.domClean){Z("getFormattedCode",r);\\n}var Cp=[];if(A.lines.length()>0){var i=A.lines.atIndex(0);while(i){var Cq=i.domInfo;Cp.push((Cq&&Cq.getInnerHTML())||domline.processSpaces(domline.escapeHTML(i.text),L)||" ");\\ni=A.lines.next(i);}}return\\\'\\x3cdiv class="syntax">\\x3cdiv>\\\'+Cp.join("\\x3c/div>\\\\n\\x3cdiv>")+"\\x3c/div>\\x3c/div>";}var Aa={bold:function(){J("bold");\\n},italic:function(){J("italic");},underline:function(){J("underline");},strikethrough:function(){J("strikethrough");\\n},h1:function(){J("h1");},h2:function(){J("h2");},h3:function(){J("h3");},h4:function(){J("h4");},h5:function(){J("h5");\\n},h6:function(){J("h6");},undo:function(){t("undo");},redo:function(){t("redo");},clearauthorship:function(i){if((!(A.selStart&&A.selEnd))||V()){if(i){i();\\n}else{A2(0,A.alltext.length,[["author",""]]);}}else{Bi("author","");}},insertunorderedlist:As,indent:function(){if(!AU(false)){As();\\n}},outdent:function(){AU(true);}};function CR(i){i=i.toLowerCase();var Cp=Array.prototype.slice.call(arguments,1);\\nif(Aa[i]){b(i,function(){G(9);Aa[i].apply(Aa,Cp);});}}E.ace_focus=Bc;E.ace_importText=CA;E.ace_importAText=B9;\\nE.ace_exportText=CL;E.ace_editorChangedSize=B7;E.ace_setOnKeyPress=Bn;E.ace_setOnKeyDown=Bq;E.ace_setNotifyDirty=Bp;\\nE.ace_dispose=B8;E.ace_getFormattedCode=Bm;E.ace_setEditable=BG;E.ace_execCommand=CR;E.ace_setProperty=function(Cq,i){var Cp=Cq.toLowerCase();\\nif(Cp=="wraps"){CD(i);}else{if(Cp=="showsauthorcolors"){R(B,"authorColors",!!i);}else{if(Cp=="showsuserselections"){R(B,"userSelections",!!i);\\n}else{if(Cp=="showslinenumbers"){AQ=!!i;R(U,"sidedivhidden",!AQ);h();}else{if(Cp=="grayedout"){R(F.document.body,"grayedout",!!i);\\n}else{if(Cp=="dmesg"){w=i;window.dmesg=i;}else{if(Cp=="userauthor"){e=String(i);}else{if(Cp=="styled"){CK(i);\\n}else{if(Cp=="textface"){Bv(i);}else{if(Cp=="textsize"){Bl(i);}}}}}}}}}}};E.ace_setBaseText=function(i){N.setBaseText(i);\\n};E.ace_setBaseAttributedText=function(Cp,i){AT();N.setBaseAttributedText(Cp,i);};E.ace_applyChangesToBase=function(Cq,i,Cp){N.applyChangesToBase(Cq,i,Cp);\\n};E.ace_prepareUserChangeset=function(){return N.prepareUserChangeset();};E.ace_applyPreparedChangesetToBase=function(){N.applyPreparedChangesetToBase();\\n};E.ace_setUserChangeNotificationCallback=function(i){N.setUserChangeNotificationCallback(i);};E.ace_setAuthorInfo=function(i,Cp){CV(i,Cp);\\n};E.ace_setAuthorSelectionRange=function(Cp,Cq,i){N.setAuthorSelectionRange(Cp,Cq,i);};E.ace_getUnhandledErrors=function(){return BU.slice();\\n};E.ace_getDebugProperty=function(i){if(i=="debugger"){window["eval"]("debugger");}else{if(i=="rep"){return A;\\n}else{if(i=="window"){return window;}else{if(i=="document"){return document;}}}}return undefined;};function S(){return(new Date()).getTime();\\n}function AD(Cs){var Cq=S();var Ct=0;var i=false;var Cr=false;var Cp=function(){if(i){if((!Cr)){Cr=true;\\n}return true;}var Cu=S()-Cq;if(Cu>Cs){i=true;return true;}else{Ct=Cu;return false;}};Cp.elapsed=function(){return S()-Cq;\\n};return Cp;}function CZ(Cs){var i=null;var Cp=0;function Cr(){if(i){O.clearTimeout(i);i=null;}}function Cq(Cv){Cr();\\nCp=Cv;var Cu=Cv-S();if(Cu\\x3c0){Cu=0;}i=O.setTimeout(Ct,Cu);}function Ct(){i=null;Cs();}return{atMost:function(Cv){var Cu=S()+Cv;\\nif((!i)||Cp>Cu){Cq(Cu);}},atLeast:function(Cv){var Cu=S()+Cv;if((!i)||Cp\\x3cCu){Cq(Cu);}},never:function(){Cr();\\n}};}function G(i){r(AD(0));}function A8(){var i=A8;var Cr=(i.failures||0);if(Cr\\x3c5){var Cq=AD(40);var Cs=r(Cq);\\nif(Cq()){i.failures=Cr+1;}return true;}else{var Cp=(i.skipCount||0);Cp++;if(Cp==20){Cp=0;i.failures=0;\\n}i.skipCount=Cp;}return false;}var H=CZ(function(){if(!l){return;}if(s){H.atLeast(500);return;}b("idleWorkTimer",function(){var i=AD(250);\\nvar Cq=false;var Cr=false;try{r(i);if(i()){return;}CN();if(i()){return;}var Ct=BI();var Cs=[0,A.lines.totalWidth()];\\nCq=true;Cr=true;}finally{if(Cr){H.atMost(1000);}else{if(Cq){H.atMost(500);}else{var Cp=Math.round(i.elapsed()/2);\\nif(Cp\\x3c100){Cp=100;}H.atMost(Cp);}}}});});var B1=1;function M(Cp){var i=Cp.id;if(i){return i;}return(Cp.id="magicdomid"+(B1++));\\n}function AV(Cr,Cx,Cs,Cv){if(Cx\\x3c=Cr){return;}if(Cr\\x3c0||Cr>=A.lines.totalWidth()){return;}var i=A.lines.atOffset(Cr);\\nvar Cp=A.lines.offsetOfEntry(i);var Cq=A.lines.indexOfEntry(i);var Cw=false;var Cy=null;var C1=null;Cs=(Cs||I);\\nvar Cu;var Ct=function(C2,C3){i.domInfo.appendSpan(C2,C3);};if(Cv){var C0=Ct;Ct=function(C2,C3){Cv(C2,C3,C0,Cu);\\nCu+=C2.length;};}while(i&&Cp\\x3cCx&&!Cs()){var Cz=Cp+i.width;Cu=Cp;i.domInfo.clearSpans();BJ(i,Ct,Cp);i.domInfo.finishUpdate();\\nAA(i.lineNode);if(A.selStart&&A.selStart[0]==Cq||A.selEnd&&A.selEnd[0]==Cq){Cw=true;}if(Cy===null){Cy=Cq;\\n}C1=Cq;Cp=Cz;i=A.lines.next(i);Cq++;}if(Cw){C.selectionAffected=true;}}function BJ(Cq,Cs,Cw){var Cr=Cw;\\nif((typeof Cr)!="number"){Cr=A.lines.offsetOfEntry(Cq);}var Cp=Cq.text;var Cx=Cq.width;if(Cp.length==0){var Ct=linestylefilter.getLineStyleFilter(0,"",Cs,A.apool);\\nCt("","");}else{var Cy=0;var i=Cs;i=linestylefilter.getURLFilter(Cp,i);if(browser.msie){i=linestylefilter.getAtSignSplitterFilter(Cp,i);\\n}var Cu=A.lines.indexOfEntry(Cq);var Cv=A.alines[Cu];i=linestylefilter.getLineStyleFilter(Cp.length,Cv,i,A.apool);\\ni(Cp,"");}}function BH(i){return"";}var AF;function A4(){AF={cleanNodesNearChanges:{}};}A4();function m(Cq){var i=P("getCleanNodeByKey",false);\\ni.extra=0;var Cp=D.getElementById(Cq);while(Cp&&W(Cp)){i.extra++;Cp.id="";Cp=D.getElementById(Cq);}i.literal(i.extra,"extra");\\ni.end();return Cp;}function z(Cs){var i;var Cu;if(!W(Cs)){i=Cs;var Ct=i.previousSibling;var Cr=i.nextSibling;\\nCu=((Ct&&W(Ct))||(Cr&&W(Cr)));}else{var Cp=Cs.previousSibling;while(Cp&&W(Cp)){Cp=Cp.previousSibling;\\n}if(Cp){i=Cp;}else{var Cq=Cs.nextSibling;while(Cq&&W(Cq)){Cq=Cq.nextSibling;}if(Cq){i=Cq;}}if(!i){return;\\n}Cu=true;}if(Cu){AF.cleanNodesNearChanges["$"+M(i)]=true;}else{var Cx=M(i);var Ct=i.previousSibling;var Cr=i.nextSibling;\\nvar C1=((Ct&&M(Ct))||null);var C0=((Cr&&M(Cr))||null);var Cv=A.lines.prev(A.lines.atKey(Cx));var Cw=A.lines.next(A.lines.atKey(Cx));\\nvar Cz=((Cv&&Cv.key)||null);var Cy=((Cw&&Cw.key)||null);if(C1!=Cz||C0!=Cy){AF.cleanNodesNearChanges["$"+M(i)]=true;\\n}}}function Aw(){if(C.observedSelection){return;}C.observedSelection=true;var Cs=P("getSelection",false);\\nvar Cq=Af();Cs.end();if(Cq){function Cr(Ct){if((!Ct)||Ct==B){return null;}while(Ct.parentNode!=B){Ct=Ct.parentNode;\\n}return Ct;}var Cp=Cr(Cq.startPoint.node);var i=Cr(Cq.endPoint.node);if(Cp){z(Cp);}if(i&&Cp!=i){z(i);\\n}}}function BV(){if(B.getElementsByTagName){var Cr=B.getElementsByTagName("style");for(var Cq=0;Cq\\x3cCr.length;\\nCq++){var Cp=Cr[Cq];while(Cp.parentNode&&Cp.parentNode!=B){Cp=Cp.parentNode;}if(Cp.parentNode==B){z(Cp);\\n}}}}function r(C9){if(C.domClean){return false;}s=false;C.isUserChange=true;C9=(C9||function(){return false;\\n});if(AL&&top.DONT_INCORP||window.DEBUG_DONT_INCORP){return false;}var Cq=P("incorp",false);if(!B.firstChild){B.innerHTML="\\x3cdiv>\\x3c!-- -->\\x3c/div>";\\n}Cq.mark("obs");Aw();BV();Cq.mark("dirty");var Cy=BK();var DN=true;var C5=0;var Cp,Ct;while(C5\\x3cCy.length){Cp=Cy[C5][0];\\nCt=Cy[C5][1];if(!((Cp==0||m(A.lines.atIndex(Cp-1).key))&&(Ct==A.lines.length()||m(A.lines.atIndex(Ct).key)))){DN=false;\\nbreak;}C5++;}if(!DN){var DS=B.childNodes.length;for(var C0=0;C0\\x3cDS;C0++){var C7=B.childNodes.item(C0);\\nif((C7.tagName)&&((!C7.id)||(!A.lines.containsKey(C7.id)))){z(C7);}}Cy=BK();}A4();Cq.mark("getsel");var Cv=Af();\\nvar Cs,Cr;var DE=0;var C6=[];var C3=0;var C8=[];Cq.mark("ranges");Cq.literal(Cy.length,"numdirt");var DI=[];\\nwhile(DE\\x3cCy.length){var DG=Cy[DE];Cp=DG[0];Ct=DG[1];var C1=(((Cp==0)&&B.firstChild)||m(A.lines.atIndex(Cp-1).key).nextSibling);\\nC1=(C1&&W(C1)&&C1);var Cu=(((Ct==A.lines.length())&&B.lastChild)||m(A.lines.atIndex(Ct).key).previousSibling);\\nCu=(Cu&&W(Cu)&&Cu);if(C1&&Cu){var Cz=makeContentCollector(AY,browser,A.apool,null,Bd);Cz.notifySelection(Cv);\\nvar DJ=[];for(var Cx=C1;Cx&&!(Cx.previousSibling&&Cx.previousSibling==Cu);Cx=Cx.nextSibling){if(browser.msie){try{Cx.createTextRange().execCommand("unlink",false,null);\\n}catch(DR){}}Cz.collectContent(Cx);DJ.push(Cx);}Cz.notifyNextNode(Cu.nextSibling);var Cw=Cz.getLines();\\nif((Cw.length\\x3c=1||Cw[Cw.length-1]!=="")&&Cu.nextSibling){Ct++;var DF=Cu.nextSibling;Cz.collectContent(DF);\\nC8.push(DF);Cz.notifyNextNode(DF.nextSibling);}var C2=Cz.finish();var DA=C2.selStart;var DB=C2.selEnd;\\nCw=C2.lines;var DP=C2.lineAttribs;var DC=C2.linesWrapped;if(DC>0){By("Editor warning: "+DC+" long line"+(DC==1?" was":"s were")+" hard-wrapped into "+C2.numLinesAfter+" lines.");\\n}if(DA[0]>=0){Cs=[DA[0]+Cp+C3,DA[1]];}if(DB[0]>=0){Cr=[DB[0]+Cp+C3,DB[1]];}var DL=[];var DO=Cu;var DH=new Array(Cw.length);\\nfor(var C0=0;C0\\x3cCw.length;C0++){var DQ=Cw[C0];var DK=AO(DQ);DL.push(DK);DH[C0]=DK.domInfo;}DI.push([DO,DH]);\\nforEach(DJ,function(i){C8.push(i);});var DD={};if(Cs){DD.selStart=Cs;}if(Cr){DD.selEnd=Cr;}C6.push([Cp+C3,Ct-Cp,DL,DP,DD]);\\nC3+=(Cw.length-(Ct-Cp));}else{if(Ct>Cp){C6.push([Cp+C3,Ct-Cp,[],[]]);}}DE++;}var DM=(C6.length>0);Cq.mark("splice");\\nforEach(C6,function(i){CI(i[0],i[1],i[2],i[3],i[4]);});Cq.mark("insert");forEach(DI,function(i){AI(i[0],i[1],C9);\\n});Cq.mark("del");forEach(C8,function(i){i.parentNode.removeChild(i);});Cq.mark("findsel");if(Cv&&!Cs){Cs=Aq(Cv.startPoint);\\n}if(Cv&&!Cr){Cr=Aq(Cv.endPoint);}var C4=A.lines.length();if(Cs&&Cs[0]>=C4){Cs[0]=C4-1;Cs[1]=A.lines.atIndex(Cs[0]).text.length;\\n}if(Cr&&Cr[0]>=C4){Cr[0]=C4-1;Cr[1]=A.lines.atIndex(Cr[0]).text.length;}Cq.mark("repsel");BR(Cs,Cr,Cv&&Cv.focusAtStart);\\nCq.mark("browsel");if(Cv&&(DM||V())){C.selectionAffected=true;}C.domClean=true;Cq.mark("fixview");h();\\nCq.end("END");return DM;}function Cc(Cp){var i=D.createElement("DIV");i.appendChild(Cp);return i.innerHTML;\\n}var Ad={bold:true,italic:true,underline:true,strikethrough:true,h1:true,h2:true,h3:true,h4:true,h5:true,h6:true,list:true};\\nvar CF={insertorder:true,author:true};function A0(i){return !!Ad[i];}function Ck(i){return(!!Ad[i])||(!!CF[i]);\\n}function AI(Cq,i,Cr){Cr=(Cr||function(){return false;});var Cp;var Cs;if(i.length\\x3c1){return;}var Cu=A.lines.atKey(M(i[0].node));\\nvar Ct=A.lines.atKey(M(i[i.length-1].node));var Cv=A.lines.offsetOfEntry(Cu);var Cw=A.lines.offsetOfEntry(Ct)+Ct.width;\\nforEach(i,function(C0){var Cx=P("insertLine",false);var Cz=C0.node;var C1=M(Cz);var Cy;Cx.mark("findEntry");\\nif(Cp){var C2=A.lines.next(Cp);if(C2&&C2.key==C1){Cy=C2;Cs+=Cp.width;}}if(!Cy){Cx.literal(1,"nonopt");\\nCy=A.lines.atKey(C1);Cs=A.lines.offsetOfKey(C1);}else{Cx.literal(0,"nonopt");}Cp=Cy;Cx.mark("spans");\\nBJ(Cy,function(C3,C4){C0.appendSpan(C3,C4);},Cs,Cr());Cx.mark("addLine");C0.prepareForAdd();Cy.lineMarker=C0.lineMarker;\\nif(!Cq){B.insertBefore(Cz,B.firstChild);}else{B.insertBefore(Cz,Cq.nextSibling);}Cq=Cz;C0.notifyAdded();\\nCx.mark("markClean");AA(Cz);Cx.end();});}function V(){return(A.selStart&&A.selEnd&&A.selStart[0]==A.selEnd[0]&&A.selStart[1]==A.selEnd[1]);\\n}function n(){return A.selStart[0];}function u(){return A.selStart[1];}function A7(){return A.lines.offsetOfIndex(n())+u();\\n}function CE(){if(V()&&u()==0&&n()>0){var i=n();var Ct=A.lines.atIndex(i);var Cs=A.lines.prev(Ct);var Cq=Cs.text;\\nvar Cp=/^ *(?:)/.exec(Cq)[0];if(/[\\\\[\\\\(\\\\{]\\\\s*$/.exec(Cq)){Cp+=Ae;}var Cr=Changeset.builder(A.lines.totalWidth()).keep(A.lines.offsetOfIndex(i),i).insert(Cp,[["author",e]],A.apool).toString();\\nc(Cr);d([i,Cp.length],[i,Cp.length]);}}function Bk(Cr){var Cq=A.lines.atIndex(Cr).lineNode;var i=Cq.firstChild;\\nwhile(AG(i)&&i.firstChild){i=i.firstChild;}var Cp;if(isNodeText(i)){i.nodeValue=" "+i.nodeValue;Cp=i;\\n}else{Cp=D.createTextNode(" ");i.parentNode.insertBefore(Cp,i);}AA(Cq);return{unhack:function(){if(Cp.nodeValue==" "){Cp.parentNode.removeChild(Cp);\\n}else{Cp.nodeValue=Cp.nodeValue.substring(1);}AA(Cq);}};}function Am(Cv){var Cw=Cv[0];var Cp=Cv[1];var Ct=A.lines.atIndex(Cw);\\nCp-=Ct.lineMarker;if(Cp\\x3c0){Cp=0;}var Cr=Ct.lineNode;var i=Cr;var Cq=false;if(Cp==0){var Cu=0;if(browser.msie&&Cw==(A.lines.length()-1)&&Cr.childNodes.length==0){Cu=1;\\n}return{node:Cr,index:Cu,maxIndex:1};}while(!(i==Cr&&Cq)){if(Cq){if(i.nextSibling){i=i.nextSibling;Cq=false;\\n}else{i=i.parentNode;}}else{if(isNodeText(i)){var Cs=i.nodeValue.length;if(Cp\\x3c=Cs){return{node:i,index:Cp,maxIndex:Cs};\\n}Cp-=Cs;Cq=true;}else{if(i.firstChild){i=i.firstChild;}else{Cq=true;}}}}return{node:Cr,index:1,maxIndex:1};\\n}function BD(i){return i.innerText||i.textContent||i.nodeValue||"";}function Aq(Cq){if(Cq.node==B){if(Cq.index==0){return[0,0];\\n}else{var Ct=A.lines.length();var Cw=A.lines.atIndex(Ct-1);return[Ct-1,Cw.text.length];}}else{var i=Cq.node;\\nvar Cp=0;if(isNodeText(i)){Cp=Cq.index;}else{if(Cq.index>0){Cp=BD(i).length;}}var Cr,Cs;while((Cr=i.parentNode)!=B){if((Cs=i.previousSibling)){i=Cs;\\nCp+=BD(i).length;}else{i=Cr;}}if(i.id==""){T.debug("BAD");}if(i.firstChild&&AG(i.firstChild)){Cp+=1;}var Cu=A.lines.atKey(i.id);\\nvar Cv=A.lines.indexOfEntry(Cu);return[Cv,Cp];}}function AO(Cq){var Cp=CS(Cq.length>0);var i=Cp.node;\\nreturn{key:M(i),text:Cq,lineNode:i,domInfo:Cp,lineMarker:0};}function Co(i){return Changeset.oldLen(i)==A.alltext.length;\\n}function c(Cp,Cr){Ap(Cp,Cr);var i=null;if(A.selStart&&A.selEnd){var Cv=A.lines.offsetOfIndex(A.selStart[0])+A.selStart[1];\\nvar Cs=A.lines.offsetOfIndex(A.selEnd[0])+A.selEnd[1];var Cq=Changeset.characterRangeFollow(Cp,Cv,Cs,Cr);\\ni=[Cq[0],Cq[1],A.selFocusAtStart];}var Cu={splice:function(Cx,Cw,Cy){Ct(Cx,Cw,map(Array.prototype.slice.call(arguments,2),function(Cz){return Cz.slice(0,-1);\\n}),null);},get:function(Cw){return A.lines.atIndex(Cw).text+"\\\\n";},length:function(){return A.lines.length();\\n},slice_notused:function(Cx,Cw){return map(A.lines.slice(Cx,Cw),function(Cy){return Cy.text+"\\\\n";});}};\\nChangeset.mutateTextLines(Cp,Cu);BN();if(i){d(Q(i[0]),Q(i[1]),i[2]);}function Ct(Cw,Cx,C4,Cz){Cz=(Cz||AD(50));\\nvar C1=[];if(Cx>0){var C0=A.lines.atIndex(Cw);for(var C3=0;C3\\x3cCx;C3++){C1.push(C0.key);C0=A.lines.next(C0);\\n}}var C2=map(C4,AO);AK(Cw,Cx,C2);var Cy;if(Cw>0){Cy=m(A.lines.atIndex(Cw-1).key);}else{Cy=null;}AI(Cy,map(C2,function(C5){return C5.domInfo;\\n}),Cz);forEach(C1,function(C6){var C5=D.getElementById(C6);C5.parentNode.removeChild(C5);});if((A.selStart&&A.selStart[0]>=Cw&&A.selStart[0]\\x3c=Cw+Cx)||(A.selEnd&&A.selEnd[0]>=Cw&&A.selEnd[0]\\x3c=Cw+Cx)){C.selectionAffected=true;\\n}}}function Bz(Cw){return true;var Cs=Changeset.opIterator(Changeset.unpack(Cw).ops);var Cp=0;var Cr=0;\\nvar Cq=0;while(Cs.hasNext()){var i=Cs.next();if(i.opcode=="-"||i.opcode=="="){Cp+=i.chars;if(i.lines){Cr+=i.lines;\\nCq=0;}else{Cq+=i.chars;}}var Ct=A.lines.indexOfOffset(Cp);var Cv=A.lines.offsetOfIndex(Ct);var Cu=Cp-Cv;\\nif(Cu!=Cq||Ct!=Cr){return false;}}return true;}function Ap(i,Cq){Changeset.checkRep(i);if(Changeset.oldLen(i)!=A.alltext.length){throw new Error("doRepApplyChangeset length mismatch: "+Changeset.oldLen(i)+"/"+A.alltext.length);\\n}if(!Bz(i)){throw new Error("doRepApplyChangeset line break mismatch");}(function Cp(Cs){var Cr=C.editEvent;\\nif(Cr.eventType=="nonundoable"){if(!Cr.changeset){Cr.changeset=Cs;}else{Cr.changeset=Changeset.compose(Cr.changeset,Cs,A.apool);\\n}}else{var Ct=Changeset.inverse(Cs,{get:function(Cu){return A.lines.atIndex(Cu).text+"\\\\n";},length:function(){return A.lines.length();\\n}},A.alines,A.apool);if(!Cr.backset){Cr.backset=Ct;}else{Cr.backset=Changeset.compose(Ct,Cr.backset,A.apool);\\n}}})(i);Changeset.mutateAttributionLines(i,A.alines,A.apool);if(N.isTracking()){N.composeUserChangeset(i);\\n}}function Q(i){var Cp=A.lines.atOffset(i);var Cq=A.lines.offsetOfEntry(Cp);var Cr=A.lines.indexOfEntry(Cp);\\nreturn[Cr,i-Cq];}function BA(Cq,Cp,i){if(Cq==Cp&&i.length==0){return;}if(Cp==A.alltext.length){if(Cq==Cp){Cq--;\\nCp--;i="\\\\n"+i.substring(0,i.length-1);}else{if(i.length==0){Cq--;Cp--;}else{Cp--;i=i.substring(0,i.length-1);\\n}}}f(Q(Cq),Q(Cp),i);}function f(Cp,Cq,Cs){var i=Changeset.builder(A.lines.totalWidth());At(i,Cp);BQ(i,Cp,Cq);\\ni.insert(Cs,[["author",e]],A.apool);var Cr=i.toString();c(Cr);}function A2(Cq,i,Cp){if(i>=A.alltext.length){i=A.alltext.length-1;\\n}AC(Q(Cq),Q(i),Cp);}function AC(Cp,Cq,Cs){var i=Changeset.builder(A.lines.totalWidth());At(i,Cp);AS(i,Cp,Cq,Cs,A.apool);\\nvar Cr=i.toString();c(Cr);}function At(Cp,i){var Cq=A.lines.offsetOfIndex(i[0]);Cp.keep(Cq,i[0]);Cp.keep(i[1]);\\n}function BQ(Cq,Cp,i){var Cs=A.lines.offsetOfIndex(Cp[0]);var Cr=A.lines.offsetOfIndex(i[0]);if(i[0]>Cp[0]){Cq.remove(Cr-Cs-Cp[1],i[0]-Cp[0]);\\nCq.remove(i[1]);}else{Cq.remove(i[1]-Cp[1]);}}function AS(Cq,Cp,i,Cs,Cr){var Cu=A.lines.offsetOfIndex(Cp[0]);\\nvar Ct=A.lines.offsetOfIndex(i[0]);if(i[0]>Cp[0]){Cq.keep(Ct-Cu-Cp[1],i[0]-Cp[0],Cs,Cr);Cq.keep(i[1],0,Cs,Cr);\\n}else{Cq.keep(i[1]-Cp[1],0,Cs,Cr);}}function Bi(i,Cp){if(!(A.selStart&&A.selEnd)){return;}AC(A.selStart,A.selEnd,[[i,Cp]]);\\n}function J(i){if(!(A.selStart&&A.selEnd)){return;}var Cr=true;var C2=Changeset.makeAttribsString("+",[[i,"true"]],A.apool);\\nvar C3=new RegExp(C2.replace(/\\\\*/g,"\\\\\\\\*")+"(\\\\\\\\*|$)");function C1(C4){return C3.test(C4);}var Cy=A.selStart[0];\\nvar Cv=A.selEnd[0];for(var Cq=Cy;Cq\\x3c=Cv;Cq++){var Ct=Changeset.opIterator(A.alines[Cq]);var C0=0;var Cx=0;\\nvar Cs=A.lines.atIndex(Cq).text.length;if(Cq==Cy){Cx=A.selStart[1];}if(Cq==Cv){Cs=A.selEnd[1];}while(Ct.hasNext()){var Cw=Ct.next();\\nvar Cz=C0;var Cu=Cz+Cw.chars;if(!C1(Cw.attribs)){if(!(Cu\\x3c=Cx||Cz>=Cs)){Cr=false;break;}}C0=Cu;}if(!Cr){break;\\n}}if(Cr){AC(A.selStart,A.selEnd,[[i,""]]);}else{var Cp=[[i,"true"]];if(i=="h1"||i=="h2"||i=="h3"||i=="h4"||i=="h5"||i=="h6"){Cp=[["h1",""],["h2",""],["h3",""],["h4",""],["h5",""],["h6",""]];\\nif(i=="h1"){Cp[0]=[i,"true"];}else{if(i=="h2"){Cp[1]=[i,"true"];}else{if(i=="h3"){Cp[2]=[i,"true"];}else{if(i=="h4"){Cp[3]=[i,"true"];\\n}else{if(i=="h5"){Cp[4]=[i,"true"];}else{if(i=="h6"){Cp[5]=[i,"true"];}}}}}}}AC(A.selStart,A.selEnd,Cp);\\n}}function AZ(i){if(!(A.selStart&&A.selEnd)){return;}f(A.selStart,A.selEnd,i);}function AK(i,Cq,Cp){forEach(Cp,function(Cx){Cx.width=Cx.text.length+1;\\n});var Cs=A.lines.offsetOfIndex(i);var Ct=A.lines.offsetOfIndex(i+Cq);var Cu=A.lines.offsetOfIndex(i);\\nvar Cw=A.lines.offsetOfIndex(i+Cq);A.lines.splice(i,Cq,Cp);C.docTextChanged=true;C.repChanged=true;var Cv=A.lines.offsetOfIndex(i+Cp.length);\\nvar Cr=map(Cp,function(Cx){return Cx.text+"\\\\n";}).join("");A.alltext=A.alltext.substring(0,Cs)+Cr+A.alltext.substring(Ct,A.alltext.length);\\n}function CI(Cv,C6,DE,DO,Cr){var DF=A.lines.offsetOfIndex(Cv);var DK=A.lines.offsetOfIndex(Cv+C6);var DJ=A.lines.offsetOfIndex(Cv);\\nvar DI,DM;if(Cr&&Cr.selStart){DI=A.lines.offsetOfIndex(Cr.selStart[0])+Cr.selStart[1]-DJ;}if(Cr&&Cr.selEnd){DM=A.lines.offsetOfIndex(Cr.selEnd[0])+Cr.selEnd[1]-DJ;\\n}var Cs=map(DE,function(DU){return DU.text+"\\\\n";}).join("");var C1=A.alltext.substring(DF,DK);var DG=A.alines.slice(Cv,Cv+C6).join("");\\nvar C0=DO.join("|1+1")+"|1+1";var DC=B6(C1,Cs,DG,C0,DI,DM);var Cz=DC[0];var Cx=DC[1];var Cq=C1.substring(Cz,C1.length-Cx);\\nvar i=Cs.substring(Cz,Cs.length-Cx);var Cp=DF+Cz;var Ct=DK-Cx;var Cw=false;if(Cq.charAt(Cq.length-1)=="\\\\n"&&i.charAt(i.length-1)=="\\\\n"){Cq=Cq.slice(0,-1);\\ni=i.slice(0,-1);Ct--;Cx++;}if(Cq.length==0&&Cp==A.alltext.length&&i.length>0){Cp--;Ct--;i="\\\\n"+i.slice(0,-1);\\nCw=true;}if(Ct==A.alltext.length&&Cq.length>0&&i.length==0){if(A.alltext.charAt(Cp-1)=="\\\\n"){Cp--;Ct--;\\n}}if(!(Cq.length==0&&i.length==0)){var DR=A.alltext;var DT=DR.length;var C4=A.lines.indexOfOffset(Cp);\\nvar DA=A.lines.offsetOfIndex(C4);function C8(){var DU=Changeset.builder(DT);DU.keep(DA,C4);DU.keep(Cp-DA);\\nreturn DU;}function Cy(Db,Da){var DW=Changeset.opIterator(Db);var DU=0;var DX=Cz;var DZ=Cs.length-Cx-(Cw?1:0);\\nwhile(DW.hasNext()){var DY=DW.next();var DV=DU+DY.chars;if(!(DV\\x3c=DX||DU>=DZ)){Da(Math.max(DX,DU),Math.min(DZ,DV),DY.attribs);\\n}DU=DV;}}var DP=(i==Cq);var C5;if(DP){var DN=BT(function(DU){return Changeset.mapAttribNumbers(DU,function(DW){var DV=A.apool.getAttribKey(DW);\\nif(A0(DV)){return A.apool.putAttrib([DV,""]);}return false;});});var C3=C8();if(Cw){C3.keep(1,1);}Cy(DG,function(DW,DU,DV){C3.keepText(Cs.substring(DW,DU),DN(DV));\\n});var DS=C3.toString();var C2=C8();if(Cw){C2.keep(1,1);}Cy(C0,function(DW,DU,DV){C2.keepText(Cs.substring(DW,DU),DV);\\n});var DQ=C2.toString();C5=Changeset.compose(DS,DQ,A.apool);}else{var Cu=C8();var DH=A.lines.indexOfOffset(Ct);\\nvar C9=A.lines.offsetOfIndex(DH);if(C9>Cp){Cu.remove(C9-Cp,DH-C4);Cu.remove(Ct-C9);}else{Cu.remove(Ct-Cp);\\n}var DL=false;var DD=Changeset.makeAttribsString("+",(e?[["author",e]]:[]),A.apool);var DB=BT(function(DU){if(DL){return Changeset.composeAttributes(DD,DU,true,A.apool);\\n}else{return Changeset.composeAttributes(DU,DD,true,A.apool);}});var C7="";Cy(C0,function(DX,DW,DV){var DU=Changeset.attribsAttributeValue(DV,"author",A.apool);\\nif(DU&&DU!=C7){if(!C7){C7=DU;}else{DL=true;}}});if(Cw){Cu.insert("\\\\n",DB(""));}Cy(C0,function(DW,DU,DV){Cu.insert(Cs.substring(DW,DU),DB(DV));\\n});C5=Cu.toString();}Ap(C5);}AK(Cv,C6,DE);BN();}function BT(Cp){var i={};return function(Cq){if(!i[Cq]){i[Cq]=Cp(Cq);\\n}return i[Cq];};}function B6(Cv,Cw,C6,C7,DA,Cx){function Cy(DB){return A0(A.apool.getAttribKey(DB));}function C5(DF){var DC=[];\\nvar DE=[];var DB=Changeset.opIterator(DF);while(DB.hasNext()){var DD=DB.next();DC.push(DD.chars);DE.push(DD.attribs);\\n}return[DC,DE];}function Ct(DF,DE){var DD=DF[0];var DG=DF[1];var DB=(DE?DD.length-1:0);var DC=0;return function DH(){while(DC>=DD[DB]){if(DE){DB--;\\n}else{DB++;}DC=0;}var DI=DG[DB];DC++;return DI;};}var Cs=Cv.length;var Cr=Cw.length;var C2=Math.min(Cs,Cr);\\nvar C3=C5(Changeset.filterAttribNumbers(C6,Cy));var C1=C5(Changeset.filterAttribNumbers(C7,Cy));var Cp=0;\\nvar C9=Ct(C3,false);var C8=Ct(C1,false);while(Cp\\x3cC2){if(Cv.charAt(Cp)==Cw.charAt(Cp)&&C9()==C8()){Cp++;\\n}else{break;}}var i=0;var C0=Ct(C3,true);var C4=Ct(C1,true);while(i\\x3cC2){if(i==0){C0();C4();i++;}else{if(Cv.charAt(Cs-1-i)==Cw.charAt(Cr-1-i)&&C0()==C4()){i++;\\n}else{break;}}}var Cq=-1;if((typeof Cx)=="number"){Cq=Cr-Cx;}if(Cp+i>Cs){var Cu=Cs-Cp;var Cz=i;if(Cq>=Cu&&Cq\\x3c=Cz){i=Cq;\\n}else{i=Cu;}Cp=Cs-i;}if(Cp+i>Cr){var Cu=Cr-Cp;var Cz=i;if(Cq>=Cu&&Cq\\x3c=Cz){i=Cq;}else{i=Cu;}Cp=Cr-i;}return[Cp,i];\\n}function A3(Cp,i){if(!Cp){return !i;}if(!i){return !Cp;}return(Cp[0]==i[0]&&Cp[1]==i[1]);}function d(Cq,i,Cp){if(BR(Cq,i,Cp)){C.selectionAffected=true;\\n}}function BR(Cp,i,Cq){Cq=!!Cq;var Cr=(Cq&&((!Cp)||(!i)||(Cp[0]!=i[0])||(Cp[1]!=i[1])));if((!A3(A.selStart,Cp))||(!A3(A.selEnd,i))||(A.selFocusAtStart!=Cr)){A.selStart=Cp;\\nA.selEnd=i;A.selFocusAtStart=Cr;if(AB){AB.notifySelectionChanged();}C.repChanged=true;return true;}return false;\\n}function CS(Cs){if(browser.msie&&(!Cs)){var i={node:null,appendSpan:I,prepareForAdd:I,notifyAdded:I,clearSpans:I,finishUpdate:I,lineMarker:0};\\nvar Cq=D.createElement("div");i.node=Cq;i.notifyAdded=function(){Cq.innerHTML="";setAssoc(Cq,"shouldBeEmpty",true);\\nsetAssoc(Cq,"unpasted",{});};var Cp="ace-line";i.appendSpan=function(Cu,Ct){if((!Cu)&&Ct){Cp=domline.addToLineClass(Cp,Ct);\\n}};i.clearSpans=function(){Cp="";};function Cr(){if(Cp!==null){Cq.className=Cp;}}i.prepareForAdd=Cr;i.finishUpdate=Cr;\\ni.getInnerHTML=function(){return"";};return i;}else{return domline.createDomLine(Cs,L,browser,D);}}function CH(i){return i.replace(/[\\\\n\\\\r ]/g," ").replace(/\\\\xa0/g," ").replace(/\\\\t/g," ");\\n}var Br={div:1,p:1,pre:1,li:1,ol:1,ul:1};function AG(i){return !!Br[(i.tagName||"").toLowerCase()];}function BK(){var i=P("getDirtyRanges",false);\\ni.forIndices=0;i.consecutives=0;i.corrections=0;var Cs={};var Cq=A.lines.length();function Cu(C7){if(Cs[C7]===undefined){i.forIndices++;\\nvar C8;if(C7\\x3c0||C7>=Cq){C8=true;}else{var C9=A.lines.atIndex(C7).key;C8=(m(C9)||false);}Cs[C7]=C8;}return Cs[C7];\\n}var Cv={};function Cw(C7){if(Cv[C7]===undefined){i.consecutives++;Cv[C7]=(function(){var C9=Cu(C7-1);\\nvar C8=Cu(C7);if((!C9)||(!C8)){return false;}if((C9===true)&&(C8===true)){return !B.firstChild;}if((C9===true)&&C8.previousSibling){return false;\\n}if((C8===true)&&C9.nextSibling){return false;}if((C9===true)||(C8===true)){return true;}return C9.nextSibling==C8;\\n})();}return Cv[C7];}function Cx(C7){return !!Cu(C7);}var Cp=[[-1,Cq+1]];function C4(C7){var C8=-1;forEach(Cp,function(C9,DA){if(C7>=C9[1]){return false;\\n}if(C7\\x3cC9[0]){return true;}C8=DA;return true;});return C8;}function C3(C7,C8){var DA=Cp[C7][0];var C9=Cp[C7][1];\\nif((DA+1)==C9){Cp.splice(C7,1);}else{if(C8==DA){Cp[C7][0]++;}else{if(C8==(C9-1)){Cp[C7][1]--;}else{Cp.splice(C7,1,[DA,C8],[C8+1,C9]);\\n}}}}function Ct(C7,C8){var DA=Cp[C7][0];var C9=Cp[C7][1];Cp.splice(C7,1,[DA,C8],[C8,C9]);}var Cz={};function C1(C7){if(Cz[C7]){return true;\\n}i.corrections++;Cz[C7]=true;var C8=C4(C7);var DA=Cx(C7);if(C8\\x3c0){if(DA){T.debug("somehow lost clean line");\\n}return true;}if(!DA){C3(C8,C7);return false;}else{var DC=Cp[C8][0];var DB=Cp[C8][1];var C9=false;if(DC\\x3cC7&&Cx(C7-1)&&!Cw(C7)){Ct(C8,C7);\\nC9=true;}if(DB>(C7+1)&&Cx(C7+1)&&!Cw(C7+1)){Ct(C8,C7+1);C9=true;}return !C9;}}function Cy(C9,DA){var C8=0;\\nvar C7=C9;while(C8\\x3cDA&&C7>=0){if(C1(C7)){C8++;}else{C8=0;}C7--;}C8=0;C7=C9;while(C8\\x3cDA&&C7\\x3cCq){if(C1(C7)){C8++;\\n}else{C8=0;}C7++;}}if(Cq==0){i.cancel();if(!Cw(0)){Ct(0,0);}}else{i.mark("topbot");Cy(0,1);Cy(Cq-1,1);\\ni.mark("obs");for(var C6 in AF.cleanNodesNearChanges){var C2=C6.substring(1);if(A.lines.containsKey(C2)){var C5=A.lines.indexOfKey(C2);\\nCy(C5,2);}}i.mark("stats&calc");i.literal(i.forIndices,"byidx");i.literal(i.consecutives,"cons");i.literal(i.corrections,"corr");\\n}var C0=[];for(var Cr=0;Cr\\x3cCp.length-1;Cr++){C0.push([Cp[Cr][1],Cp[Cr+1][0]]);}i.end();return C0;}function AA(Cp){var i={};\\ni.nodeId=M(Cp);i.knownHTML=Cp.innerHTML;if(browser.msie){i.knownText=Cp.innerText;}setAssoc(Cp,"dirtiness",i);\\n}function W(i){var Cq=P("cleanCheck",false);if(i.parentNode!=B){return true;}var Cp=getAssoc(i,"dirtiness");\\nif(!Cp){return true;}if(i.id!==Cp.nodeId){return true;}if(browser.msie){if(i.innerText!==Cp.knownText){return true;\\n}}if(i.innerHTML!==Cp.knownHTML){return true;}Cq.end();return false;}function A1(Ct,Cs){var Cq=Ct.lineNode;\\nvar Cp=Cq.offsetTop;var Cr=Cq.offsetHeight;var i=(Cs||{});i.top=Cp;i.bottom=(Cp+Cr);return i;}function B5(){var i=Ac();\\nvar Cq=F.document;var Cp=Cq.documentElement.clientHeight;return{top:i,bottom:(i+Cp)};}function Bs(){var Cq=B5();\\nvar Cr={};var Cp=A.lines.search(function(Cs){return A1(Cs,Cr).bottom>Cq.top;});var i=A.lines.search(function(Cs){return A1(Cs,Cr).top>=Cq.bottom;\\n});if(i\\x3cCp){i=Cp;}return[Cp,i];}function BI(){var i=Bs();return[A.lines.offsetOfIndex(i[0]),A.lines.offsetOfIndex(i[1])];\\n}function CY(Cp){b("handleClick",function(){H.atMost(200);});if((!Cp.ctrlKey)&&(Cp.button!=2)&&(Cp.button!=3)){function Cq(Ct){return(Ct.tagName||"").toLowerCase()=="a"&&Ct.href;\\n}var i=Cp.target;while(i&&i.parentNode&&!Cq(i)){i=i.parentNode;}if(i&&Cq(i)){try{var Cr=window.open(i.href,"_blank");\\nCr.focus();}catch(Cs){}Cp.preventDefault();}}}function Bu(){if(!(A.selStart&&A.selEnd)){return;}var i=A.selStart[0];\\nvar Cp=Y(i);AZ("\\\\n");if(Cp){if(i+1\\x3cA.lines.length()){Bg(i+1,Cp);}}else{CE();}}function AU(Cw){if(!(A.selStart&&A.selEnd)){return false;\\n}var Cq,Cv;Cq=A.selStart[0];Cv=Math.max(Cq,A.selEnd[0]-((A.selEnd[1]==0)?1:0));var Cr=[];var Cs=false;\\nfor(var Cp=Cq;Cp\\x3c=Cv;Cp++){var i=Y(Cp);if(i){i=/([a-z]+)([12345678])/.exec(i);if(i){Cs=true;var Cx=i[1];\\nvar Ct=Number(i[2]);var Cu=Math.max(1,Math.min(BW,Ct+(Cw?-1:1)));if(Ct!=Cu){Cr.push([Cp,Cx+Cu]);}}}}if(Cr.length>0){AJ(Cr);\\n}return Cs;}function Bw(i){if(!AU(i)){AZ(Ae);}}function A5(C4){var Cu=C4||{};var Cw=false;if(A.selStart){if(V()){var Cv=n();\\nvar Ct=u();var Cp=A.lines.atIndex(Cv);var C0=Cp.text;var Cx=Cp.lineMarker;if(/^ +$/.exec(C0.substring(Cx,Ct))){var C3=Ct-Cx;\\nvar C1=Ae.length;var Cz=((C3-1)%C1)+1;f([Cv,Ct-Cz],[Cv,Ct],"");Cw=true;}}if(!Cw){if(V()){var i=n();var Cp=A.lines.atIndex(i);\\nif(u()\\x3c=Cp.lineMarker){var C6="delete_newline";var C2=(i>0?Y(i-1):"");var C5=Y(i);var Cq=(i>0&&A.lines.atIndex(i-1));\\nvar Cy=(Cq&&Cq.text.length==Cq.lineMarker);if(C5){if(Cy&&!C2){f([i-1,Cq.text.length],[i,0],"");}else{f([i,0],[i,Cp.lineMarker],"");\\n}}else{if(i>0){f([i-1,Cq.text.length],[i,0],"");}}}else{var Cr=A7();if(Cr>0){if(Cu.metaKey||Cu.ctrlKey||Cu.altKey){var Cs=Cr-1;\\nwhile(Cs>Cp.lineMarker&&o(A.alltext.charAt(Cs-1))){Cs--;}BA(Cs,Cr,"");}else{BA(Cr-1,Cr,"");}}}}else{AZ("");\\n}}}}var Bf=/[\\\\u0030-\\\\u0039\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u00FF\\\\u0100-\\\\u1FFF\\\\u3040-\\\\u9FFF\\\\uF900-\\\\uFDFF\\\\uFE70-\\\\uFEFE\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFDC]/;\\nvar CU=/\\\\s/;function o(i){return !!Bf.exec(i);}function Cf(i){return !!CU.exec(i);}function y(Cu,Cv,Cr){var Cp=Cv;\\nfunction Ct(){if(Cr){return Cu.charAt(Cp);}else{return Cu.charAt(Cp-1);}}function Cs(){if(Cr){Cp++;}else{Cp--;\\n}}function Cq(){if(Cr){return Cp>=Cu.length;}else{return Cp\\x3c=0;}}if(browser.windows&&Cr){while((!Cq())&&o(Ct())){Cs();\\n}while((!Cq())&&!o(Ct())){Cs();}}else{while((!Cq())&&!o(Ct())){Cs();}while((!Cq())&&o(Ct())){Cs();}}return Cp;\\n}function AN(i){if(AL&&top.DONT_INCORP){return;}if(!l){return;}var Cq=i.type;var Cw=i.charCode;var Cr=i.keyCode;\\nvar Cs="";if(i.altKey){Cs=Cs+"A";}if(i.ctrlKey){Cs=Cs+"C";}if(i.shiftKey){Cs=Cs+"S";}if(i.metaKey){Cs=Cs+"M";\\n}var Cz="";if(Cs){Cz=Cs+"-";}var Ct=i.which;var Cy=((!Cw)&&((Cq=="keyup")||(Cq=="keydown"))&&(Cr==16||Cr==17||Cr==18||Cr==20||Cr==224||Cr==91));\\nif(Cy){return;}var Cp=false;var Cv=((browser.msie||browser.safari)?(Cq=="keydown"):(Cq=="keypress"));\\nvar Cu=((browser.msie||browser.safari)?(Cq=="keydown"):(Cq=="keypress"));var Cx=false;b("handleKeyEvent",function(){if(Cq=="keypress"||(Cv&&Cr==13)){if(!Ar(i)){i.preventDefault();\\nCx=true;}}else{if(Cq=="keydown"){Au(i);}}if(!Cx){if(Cv&&Cr==8){G(3);i.preventDefault();A5(i);Cp=true;\\n}if((!Cp)&&Cv&&Cr==13){G(4);i.preventDefault();Bu();O.setTimeout(function(){F.scrollBy(-100,0);},0);Cp=true;\\n}if((!Cp)&&Cv&&Cr==9&&!(i.metaKey||i.ctrlKey)){G(5);i.preventDefault();Bw(i.shiftKey);Cp=true;}if((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="z"&&(i.metaKey||i.ctrlKey)){G(6);\\ni.preventDefault();if(i.shiftKey){t("redo");}else{t("undo");}Cp=true;}if((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="y"&&(i.metaKey||i.ctrlKey)){G(10);\\ni.preventDefault();t("redo");Cp=true;}if((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="b"&&(i.metaKey||i.ctrlKey)){G(13);\\ni.preventDefault();J("bold");Cp=true;}if((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="i"&&(i.metaKey||i.ctrlKey)){G(14);\\ni.preventDefault();J("italic");Cp=true;}if((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="u"&&(i.metaKey||i.ctrlKey)){G(15);\\ni.preventDefault();J("underline");Cp=true;}if((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="h"&&(i.ctrlKey)){G(20);\\ni.preventDefault();A5();Cp=true;}if(AB&&AB.handleKeyEvent(i)){i.preventDefault();Cp=true;}}if(Cq=="keydown"){H.atLeast(500);\\n}else{if(Cq=="keypress"){if((!Cp)&&AH.shouldNormalizeOnChar(Cw)){H.atMost(0);}else{H.atLeast(500);}}else{if(Cq=="keyup"){var C0=200;\\nH.atLeast(C0);H.atMost(C0);}}}var C2=(browser.mozilla&&i.altKey&&Cw==0&&Cr==0);var C1=(browser.safari&&i.altKey&&Cr==229);\\nif(AE||C2||C1){H.atLeast(3000);AE=true;}if((!Cp)&&(!AE)&&(!s)){if(Cq!="keyup"||!A8()){Aw();}}if(Cq=="keyup"){AE=false;\\n}});}var AE=false;function t(Cp){if(undoModule.enabled){var i;if(Cp=="undo"){i="performUndo";}if(Cp=="redo"){i="performRedo";\\n}if(i){var Cq=C.editEvent.eventType;C.startNewEvent(Cp);undoModule[i](function(Cs,Cr){if(Cs){c(Cs);}if(Cr){d(Q(Cr.selStart),Q(Cr.selEnd),Cr.selFocusAtStart);\\n}var Ct=C.startNewEvent(Cq,true);return Ct;});}}}function Ba(){var i=A.selStart,Cp=A.selEnd;if(!(i&&Cp)){AX(null);\\nreturn;}var Cr=(false&&browser.mozilla&&i&&Cp&&i[0]==Cp[0]&&i[1]==A.lines.atIndex(i[0]).lineMarker&&Cp[1]==A.lines.atIndex(Cp[0]).lineMarker&&Bk(i[0]));\\nvar Cq={};var Cs=[i[0],i[1]];if(Cr){Cs[1]+=1;}Cq.startPoint=Am(Cs);var Ct=[Cp[0],Cp[1]];if(Cr){Ct[1]+=1;\\n}Cq.endPoint=Am(Ct);Cq.focusAtStart=!!A.selFocusAtStart;AX(Cq);if(Cr){Cr.unhack();}}function Ca(){return map(A.lines.slice(),function(Cq){var Cp=Cq.text;\\nvar i;if(Cp.length==0){i=\\\'\\x3cspan style="color: #aaa">--\\x3c/span>\\\';}else{i=htmlPrettyEscape(Cp);}return"\\x3cdiv>\\x3ccode>"+i+"\\x3c/div>\\x3c/code>";\\n}).join("");}function k(i){if(isNodeText(i)){return i.nodeValue.length;}else{return 1;}}function CX(){var i;\\ntry{i=D.selection;}catch(Cq){}if(!i){return false;}var Cp;try{Cp=i.createRange();}catch(Cq){}if(!Cp){return false;\\n}var Cr=Cp.parentElement();if(Cr.ownerDocument!=D){return false;}return true;}function Af(){if(browser.msie){var i;\\ntry{i=D.selection;}catch(Cx){}if(!i){return null;}var Cr;try{Cr=i.createRange();}catch(Cx){}if(!Cr){return null;\\n}var C0=Cr.parentElement();if(C0.ownerDocument!=D){return null;}function C1(){return D.body.createTextRange();\\n}function Cv(C3){var C2=C1();C2.moveToElementText(C3);return C2;}function Ct(C6){var C2=C6.parentElement();\\nvar C5=-1;var C8=C2.childNodes.length;var C7=Cv(C2);if(C6.compareEndPoints("StartToStart",C7)==0){return{node:C2,index:0,maxIndex:1};\\n}else{if(C6.compareEndPoints("EndToEnd",C7)==0){if(AG(C2)&&C2.nextSibling){return{node:C2.nextSibling,index:0,maxIndex:1};\\n}return{node:C2,index:1,maxIndex:1};}else{if(C2.childNodes.length==0){return{node:C2,index:0,maxIndex:1};\\n}}}for(var C3=0;C3\\x3cC2.childNodes.length;C3++){var DD=C2.childNodes.item(C3);if(!isNodeText(DD)){var DA=Cv(DD);\\nvar DE=C6.compareEndPoints("StartToStart",DA);var DH=C6.compareEndPoints("EndToEnd",DA);if(DE>=0&&DH\\x3c=0){var DG=0;\\nif(DE>0){DG=1;}return{node:DD,index:DG,maxIndex:1};}else{if(DH>0){if(C3>C5){C5=C3;C7.setEndPoint("StartToEnd",DA);\\n}}else{if(DE\\x3c0){if(C3\\x3cC8){C8=C3;C7.setEndPoint("EndToStart",DA);}}}}}}if((C8-C5)==1){if(C5>=0){return{node:C2.childNodes.item(C5),index:1,maxIndex:1};\\n}else{return{node:C2.childNodes.item(C8),index:0,maxIndex:1};}}var DF=0;var C9=C6.duplicate();var DI=binarySearchInfinite(40,function(DL){var DK=DL-DF;\\nvar DJ=Math.abs(C9.move("character",-DK));if(C9.move("character",-1)){C9.move("character",1);}if(DK\\x3c0){DF-=DJ;\\n}else{DF+=DJ;}return(C9.compareEndPoints("StartToStart",C7)\\x3c=0);});var DB=C5+1;var DC=DI;while(DB\\x3cC8){var C4=C2.childNodes.item(DB);\\nif(DC\\x3c=C4.nodeValue.length){return{node:C4,index:DC,maxIndex:C4.nodeValue.length};}DC-=C4.nodeValue.length;\\nDB++;}var C4=C2.childNodes.item(DB-1);return{node:C4,index:C4.nodeValue.length,maxIndex:C4.nodeValue.length};\\n}var Cq={};if(Cr.compareEndPoints("StartToEnd",Cr)==0){var Cs=Ct(Cr);Cq.startPoint=Cs;Cq.endPoint={node:Cs.node,index:Cs.index,maxIndex:Cs.maxIndex};\\n}else{var Cu=Cr.duplicate();Cu.collapse(true);var Cw=Cr.duplicate();Cw.collapse(false);Cq.startPoint=Ct(Cu);\\nCq.endPoint=Ct(Cw);}return Cq;}else{var i=window.getSelection();if(i&&i.type!="None"&&i.rangeCount!==0){var Cp=i.getRangeAt(0);\\nfunction Cz(C2){while(C2&&!(C2.tagName&&C2.tagName.toLowerCase()=="body")){C2=C2.parentNode;}return !!C2;\\n}function Cy(C7,C6){if(!Cz(C7)){return{node:B,index:0,maxIndex:1};}var C2=C7;var C5=C2.childNodes.length;\\nif(isNodeText(C2)){return{node:C2,index:C6,maxIndex:C2.nodeValue.length};}else{if(C5==0){return{node:C2,index:0,maxIndex:1};\\n}else{if(C6==C5){var C3=C2.childNodes.item(C5-1);var C4=k(C3);return{node:C3,index:C4,maxIndex:C4};}else{var C3=C2.childNodes.item(C6);\\nvar C4=k(C3);return{node:C3,index:0,maxIndex:C4};}}}}var Cq={};Cq.startPoint=Cy(Cp.startContainer,Cp.startOffset);\\nCq.endPoint=Cy(Cp.endContainer,Cp.endOffset);Cq.focusAtStart=(((Cp.startContainer!=Cp.endContainer)||(Cp.startOffset!=Cp.endOffset))&&i.anchorNode&&(i.anchorNode==Cp.endContainer)&&(i.anchorOffset==Cp.endOffset));\\nreturn Cq;}else{return null;}}}function AX(i){function Cv(C5){return{node:C5.node,index:C5.index,maxIndex:C5.maxIndex};\\n}if(browser.msie){D.body.scrollHeight;function Cz(C6,C5){while(C5.firstChild&&!isNodeText(C5.firstChild)){C5=C5.firstChild;\\n}C6.moveToElementText(C5);}function C4(){return D.body.createTextRange();}function Cs(C5,C6){if(isNodeText(C6)){if(C6.previousSibling&&!isNodeText(C6.previousSibling)){Cx(C5,C6.previousSibling);\\n}else{Cs(C5,C6.parentNode);}}else{Cz(C5,C6);if(C5.move("character",1)){C5.move("character",-1);}C5.collapse(true);\\n}}function Cx(C5,C6){if(isNodeText(C6)){Cs(C5,C6);C5.move("character",C6.nodeValue.length);}else{Cz(C5,C6);\\nC5.collapse(false);}}function Cy(C7){var C5=C4();var C6=C7.node;if(isNodeText(C6)){Cs(C5,C6);C5.move("character",C7.index);\\n}else{if(C7.index==0){Cs(C5,C6);}else{Cx(C5,C6);}}return C5;}if(i){if(!CX()){return;}var C1=Cv(i.startPoint);\\nvar Cp=Cv(i.endPoint);if(Cp.index==Cp.maxIndex&&Cp.node.nextSibling){Cp.node=Cp.node.nextSibling;Cp.index=0;\\nCp.maxIndex=k(Cp.node);}var Cr=Cy(C1);Cr.setEndPoint("EndToEnd",Cy(Cp));function C3(C7){var C6;try{C6=D.selection;\\n}catch(C8){}if(!C6){return false;}var C5=C6.createRange();if(C5.parentElement().ownerDocument!=D){return false;\\n}if(C7.compareEndPoints("StartToStart",C5)!==0){return false;}if(C7.compareEndPoints("EndToEnd",C5)!==0){return false;\\n}return true;}if(!C3(Cr)){Cr.select();}}else{try{D.selection.empty();}catch(C2){}}}else{var Cw;function C0(C8){var C5=Cv(C8);\\nif(Cw){function C7(){while(C5.node.childNodes.length>0){if(C5.index==0){C5.node=C5.node.firstChild;C5.maxIndex=k(C5.node);\\n}else{if(C5.index==C5.maxIndex){C5.node=C5.node.lastChild;C5.maxIndex=k(C5.node);C5.index=C5.maxIndex;\\n}else{break;}}}}if(isNodeText(C5.node)&&C5.index==C5.maxIndex){var C6=C5.node;while((!C6.nextSibling)&&(C6!=B)&&(C6.parentNode!=B)){C6=C6.parentNode;\\n}if(C6.nextSibling&&(!((typeof C6.nextSibling.tagName)=="string"&&C6.nextSibling.tagName.toLowerCase()=="br"))&&(C6!=C5.node)&&(C6!=B)&&(C6.parentNode!=B)){C5.node=C6.nextSibling;\\nC5.maxIndex=k(C5.node);C5.index=0;C7();}}if(!isNodeText(C5.node)){C7();}}if(isNodeText(C5.node)){return{container:C5.node,offset:C5.index};\\n}else{return{container:C5.node.parentNode,offset:Bx(C5.node)+C5.index};}}var Cq=window.getSelection();\\nif(Cq){Cq.removeAllRanges();if(i){Cw=(i.startPoint.node===i.endPoint.node&&i.startPoint.index===i.endPoint.index);\\nvar Ct=C0(i.startPoint);var Cu=C0(i.endPoint);if((!Cw)&&i.focusAtStart&&Cq.collapse&&Cq.extend){Cq.collapse(Cu.container,Cu.offset);\\nCq.extend(Ct.container,Ct.offset);}else{var Cr=D.createRange();Cr.setStart(Ct.container,Ct.offset);Cr.setEnd(Cu.container,Cu.offset);\\nCq.removeAllRanges();Cq.addRange(Cr);}}}}}function Bx(i){var Cp=0;while(i.previousSibling){Cp++;i=i.previousSibling;\\n}return Cp;}function h(){if(AP()==0||Ak()==0){return;}function Cp(C3,C4,i){if(C3[C4]!=i){C3[C4]=i;}}var Cx=U.firstChild.offsetWidth;\\nvar Cs=Cx+CC;if(Cs\\x3cAi){Cs=Ai;}q=BS;if(AQ){q+=Cs+BO;}Cp(g.style,"left",q+"px");Cp(U.style,"width",Cs+"px");\\nfor(var Cv=0;Cv\\x3c2;Cv++){var Cq=B.clientHeight;var Cr=(browser.msie?B.createTextRange().boundingWidth:B.clientWidth);\\nvar Ct=Ak()-Bo-Aj;var Cu=AP()-q-CQ;if(Cq\\x3cCt){Cq=Ct;if(browser.msie){Cp(F.document.documentElement.style,"overflowY","auto");\\n}}else{if(browser.msie){Cp(F.document.documentElement.style,"overflowY","scroll");}}if(L){Cr=Cu;}else{if(Cr\\x3cCu){Cr=Cu;\\n}}if(Cq>32000){Cq=32000;}if(Cr>32000){Cr=32000;}Cp(g.style,"height",Cq+"px");Cp(g.style,"width",Cr+"px");\\nCp(U.style,"height",Cq+"px");}if(browser.mozilla){if(!L){var Cy=B;var Cw=Ct+"px";Cp(Cy.style,"height",Cw);\\n}else{Cp(B.style,"height","");}}var C2=BB();var C1=Ac();var C0=F;var Cz=20;Ax();p(U,"sidedivdelayed");\\n}function BE(){var Cp=F;var Cq=F.document;if(typeof(Cp.pageYOffset)=="number"){return{x:Cp.pageXOffset,y:Cp.pageYOffset};\\n}var i=Cq.documentElement;if(i&&typeof(i.scrollTop)=="number"){return{x:i.scrollLeft,y:i.scrollTop};}}function BB(){return BE().x;\\n}function Ac(){return BE().y;}function Cm(i){F.scrollTo(i,Ac());}function Cl(i){F.scrollTo(BB(),i);}function Ch(i,Cp){F.scrollTo(i,Cp);\\n}var BM=[];function BF(){forEach(BM,function(i){i();});}K(window,"load",CB);function Az(i){try{function Cp(Cs,Cu,Ct){if(String(Cs[Cu]).toLowerCase()!=Ct){Cs[Cu]=Ct;\\nreturn true;}return false;}if(browser.msie||browser.safari){Cp(B,"contentEditable",(i?"true":"false"));\\n}else{var Cq=Cp(D,"designMode",(i?"on":"off"));if(Cq&&i&&browser.opera){A9();}}return true;}catch(Cr){return false;\\n}}var Cg=null;function B3(Cp){var i=window.clipboardData&&window.clipboardData.getData("Text");if(i&&D.selection){}}var s=false;\\nfunction A6(i){if(i.type=="compositionstart"){s=true;}else{if(i.type=="compositionend"){s=false;}}}function A9(){K(window,"unload",BF);\\nK(document,"keydown",AN);K(document,"keypress",AN);K(document,"keyup",AN);K(document,"click",CY);K(B,"blur",CJ);\\nif(browser.msie){K(document,"click",CM);}if(browser.msie){K(B,"paste",B3);}if((!browser.msie)&&document.documentElement){K(document.documentElement,"compositionstart",A6);\\nK(document.documentElement,"compositionend",A6);}}function CM(i){if((i.target.tagName||"").toLowerCase()!="html"){return;\\n}if(!(i.pageY>B.clientHeight)){return;}b("handleOuterClick",function(){G(11);if(V()){var Cp=A.lines.length()-1;\\nvar Cq=A.lines.atIndex(Cp).text.length;d([Cp,Cq],[Cp,Cq]);}});}function BC(Cq,i){var Cp=[];(Cq.className||"").replace(/\\\\S+/g,function(Cr){if((!i)||(i(Cr))){Cp.push(Cr);\\n}});return Cp;}function Ay(i,Cp){i.className=Cp.join(" ");}function p(Cq,Cp){var i=false;var Cr=BC(Cq,function(Cs){if(Cs==Cp){i=true;\\n}return true;});if(!i){Cr.push(Cp);Ay(Cq,Cr);}}function CG(Cp,Cq){var i=false;var Cr=BC(Cp,function(Cs){if(Cs==Cq){i=true;\\nreturn false;}return true;});if(i){Ay(Cp,Cr);}}function R(Cp,i,Cq){if(Cq){p(Cp,i);}else{CG(Cp,i);}}function CB(){D=document;\\nb("setup",function(){var Cp=D.getElementById("innerdocbody");B=Cp;if(browser.mozilla){p(B,"mozilla");\\n}if(browser.safari){p(B,"safari");}if(browser.msie){p(B,"msie");}if(browser.msie){try{D.execCommand("BackgroundImageCache",false,true);\\n}catch(Cq){}}R(B,"authorColors",true);R(B,"doesWrap",L);Bh();Ax();while(B.firstChild){B.removeChild(B.firstChild);\\n}var i=AO("");AK(0,A.lines.length(),[i]);AI(null,[i.domInfo],null);A.alines=Changeset.splitAttributionLines(Changeset.makeAttribution("\\\\n"),"\\\\n");\\nA9();});O.setTimeout(function(){parent.readyFunc();},0);B4=true;}function Bc(){window.focus();}function CJ(i){if(browser.msie){AX(null);\\n}}function K(Cp,Cq,i){var Cr;if((typeof i._wrapper)!="function"){i._wrapper=function(Cs){i(CO(Cs||window.event||{}));\\n};}var Cr=i._wrapper;if(Cp.addEventListener){Cp.addEventListener(Cq,Cr,false);}else{Cp.attachEvent("on"+Cq,Cr);\\n}BM.push(function(){B2(Cp,Cq,i);});}function B2(i,Cq,Cr){var Cp=Cr._wrapper;if(i.removeEventListener){i.removeEventListener(Cq,Cp,false);\\n}else{i.detachEvent("on"+Cq,Cp);}}function B0(Cw){var Cp=Cw.node;var Ct=Cw.index;function Cq(C0){return C0.offsetLeft;\\n}function Cr(C0){return C0.offsetLeft+C0.offsetWidth;}if(!isNodeText(Cp)){if(Ct==0){return Cq(Cp);}else{return Cr(Cp);\\n}}else{var Cs=Ct;var Cv=Cp.nodeValue.length-Ct;var i;for(i=Cp.previousSibling;i&&isNodeText(i);i=i.previousSibling){Cs+=i.nodeValue;\\n}var Cu=(i?Cr(i):Cq(Cp.parentNode));for(i=Cp.nextSibling;i&&isNodeText(i);i=i.nextSibling){Cv+=i.nodeValue;\\n}var Cz=(i?Cq(i):Cr(Cp.parentNode));var Cx=(Cs/(Cs+Cv));var Cy=Cu+Cx*(Cz-Cu);return Math.round(Cy);}}function Cd(){var i=F;\\nvar Cp=i.document;if(i.innerHeight&&i.scrollMaxY){return i.innerHeight+i.scrollMaxY;}else{if(Cp.body.scrollHeight>Cp.body.offsetHeight){return Cp.body.scrollHeight;\\n}else{return Cp.body.offsetHeight;}}}function Cn(){var i=F;var Cp=i.document;if(i.innerWidth&&i.scrollMaxX){return i.innerWidth+i.scrollMaxX;\\n}else{if(Cp.body.scrollWidth>Cp.body.offsetWidth){return Cp.body.scrollWidth;}else{return Cp.body.offsetWidth;\\n}}}function Ak(){var Cp=F;var Cq=Cp.document;var i;if(browser.opera){i=Cp.innerHeight;}else{i=Cq.documentElement.clientHeight;\\n}if(i){return i;}return Number(E.frame.parentNode.style.height.replace(/[^0-9]/g,"")||0);}function AP(){var Cp=F;\\nvar i=Cp.document;return i.documentElement.clientWidth;}function Bt(Cp){var i=F;var Cs=F.document;var Cq=Cp.offsetTop+Aj-i.scrollY;\\nvar Cr=i.scrollY+Ak()-(Cp.offsetTop+Aj+Cp.offsetHeight);if(Cq\\x3c0){i.scrollBy(0,Cq);}else{if(Cr\\x3c0){i.scrollBy(0,-Cr);\\n}}}function CT(Cp){var i=F;var Cs=F.document;Cp+=q;var Cq=Cp-i.scrollX;var Cr=i.scrollX+AP()-Cp;if(Cq\\x3c0){i.scrollBy(Cq,0);\\n}else{if(Cr\\x3c0){i.scrollBy(-Cr+1,0);}}}function CP(){if(!A.selStart){return;}h();var Cq=(A.selFocusAtStart?A.selStart[0]:A.selEnd[0]);\\nBt(A.lines.atIndex(Cq).lineNode);if(!L){var i=Af();if(i){var Cr=(i.focusAtStart?i.startPoint:i.endPoint);\\nvar Cp=B0(Cr);CT(Cp);h();}}}function Y(Cq){var Cp=A.alines[Cq];if(Cp){var i=Changeset.opIterator(Cp);\\nif(i.hasNext()){return Changeset.opAttributeValue(i.next(),"list",A.apool)||"";}}return"";}function Bg(Cp,i){AJ([[Cp,i]]);\\n}function AJ(Cw){var Cp=[0,0];var Cq=Changeset.builder(A.lines.totalWidth());for(var Ct=0;Ct\\x3cCw.length;\\nCt++){var Cv=Cw[Ct];var Cs=Cv[0];var Cr=Cv[1];AS(Cq,Cp,(Cp=[Cs,0]));if(Y(Cs)){if(Cr){AS(Cq,Cp,(Cp=[Cs,1]),[["list",Cr]],A.apool);\\n}else{BQ(Cq,Cp,(Cp=[Cs,1]));}}else{if(Cr){Cq.insert("*",[["author",e],["insertorder","first"],["list",Cr]],A.apool);\\n}}}var Cu=Cq.toString();if(!Changeset.isIdentity(Cu)){c(Cu);}}function As(){if(!(A.selStart&&A.selEnd)){return;\\n}var Cp,Cq;Cp=A.selStart[0];Cq=Math.max(Cp,A.selEnd[0]-((A.selEnd[1]==0)?1:0));var Ct=true;for(var i=Cp;\\ni\\x3c=Cq;i++){if(!Y(i)){Ct=false;break;}}var Cs=[];for(var i=Cp;i\\x3c=Cq;i++){var Cr=Y(i);Cs.push([i,Ct?"":(Cr?Cr:"bullet1")]);\\n}AJ(Cs);}var AB=(browser.mozilla&&(function(){var i=0;var Cp=false;function Cr(Cu){var Ct=A.lines.atIndex(Cu).lineNode;\\nwhile(Ct.firstChild&&AG(Ct.firstChild)){Ct=Ct.firstChild;}return makeVirtualLineView(Ct);}function Cs(Ct,Cu){return[Ct,Cu-A.lines.atIndex(Ct).lineMarker];\\n}function Cq(Ct,Cu){return[Ct,Cu+A.lines.atIndex(Ct).lineMarker];}return{notifySelectionChanged:function(){if(!Cp){i=0;\\n}},handleKeyEvent:function(C0){if(C0.type!="keypress"){return false;}var Cw=C0.keyCode;if(Cw\\x3c37||Cw>40){return false;\\n}r();if(!(A.selStart&&A.selEnd)){return true;}var Cx=(C0.altKey?"byWord":(C0.ctrlKey?"byWord":(C0.metaKey?"toEnd":"normal")));\\nvar Cu=Cs(A.selStart[0],A.selStart[1]);var Ct=Cs(A.selEnd[0],A.selEnd[1]);var DB=V();if(A.selFocusAtStart){var DK=Cu;\\nCu=Ct;Ct=DK;}var DH=38,DJ=40,C7=37,DE=39;var C8=false;if(DB&&!C0.shiftKey){Cu=Ct;}else{if((!DB)&&(!C0.shiftKey)){if(Cw==C7){if(A.selFocusAtStart){Cu=Ct;\\n}else{Ct=Cu;}if(Cx=="normal"){C8=true;}}else{if(Cw==DE){if(A.selFocusAtStart){Ct=Cu;}else{Cu=Ct;}if(Cx=="normal"){C8=true;\\n}}else{Cu=Ct;}}}}if(!C8){function C1(DN){var DM=A.lines.atIndex(DN);return DM.text.length-DM.lineMarker;\\n}function C4(DN){var DM=A.lines.atIndex(DN);return DM.text.substring(DM.lineMarker);}if(Cw==DH||Cw==DJ){var Cy=(Cw==DH);\\nvar C3=((Cy&&Ct[0])||((!Cy)&&Ct[0]\\x3cA.lines.length()-1));var C6,C2,DA=false;if(L){C6=Cr(Ct[0]);C2=C6.getVLineAndOffsetForChar(Ct[1]);\\nDA=((Cy&&C2.vline>0)||((!Cy)&&C2.vline\\x3c(C6.getNumVirtualLines()-1)));}var DL;if(Cx=="toEnd"){if(Cy){Ct[0]=0;\\nCt[1]=0;}else{Ct[0]=A.lines.length()-1;Ct[1]=C1(Ct[0]);}}else{if(Cx=="byWord"){if(Cy){if(Ct[1]==0&&C3){Ct[0]--;\\nCt[1]=0;}else{Ct[1]=0;}}else{var Cz=C1(Ct[0]);if(browser.windows){if(C3){Ct[0]++;Ct[1]=0;}else{Ct[1]=Cz;\\n}}else{if(Ct[1]==Cz&&C3){Ct[0]++;Ct[1]=C1(Ct[0]);}else{Ct[1]=Cz;}}}i=0;}else{if(DA){var C5=C2.vline;var Cv=C2.offset;\\nif(Cy){C5--;}else{C5++;}if(i>Cv){Cv=i;}else{i=Cv;}var DF=C6.getCharForVLineAndOffset(C5,Cv);Ct[1]=DF.lineChar;\\n}else{if(C3){if(Cy){Ct[0]--;}else{Ct[0]++;}var Cv=Ct[1];if(L){Cv=C2.offset;}if(i>Cv){Cv=i;}else{i=Cv;\\n}if(L){var DG=Cr(Ct[0]);var C5=(Cy?DG.getNumVirtualLines()-1:0);var DF=DG.getCharForVLineAndOffset(C5,Cv);\\nCt[1]=DF.lineChar;}else{var Cz=C1(Ct[0]);if(Cv>Cz){Cv=Cz;}Ct[1]=Cv;}}else{if(Cy){Ct[1]=0;}else{Ct[1]=C1(Ct[0]);\\n}i=0;}}}}}else{if(Cw==C7||Cw==DE){var DI=(Cw==C7);if(DI){if(Cx=="toEnd"){Ct[1]=0;}else{if(Ct[1]>0){if(Cx=="byWord"){Ct[1]=y(C4(Ct[0]),Ct[1],false);\\n}else{Ct[1]--;}}else{if(Ct[0]>0){Ct[0]--;Ct[1]=C1(Ct[0]);if(Cx=="byWord"){Ct[1]=y(C4(Ct[0]),Ct[1],false);\\n}}}}}else{var Cz=C1(Ct[0]);if(Cx=="toEnd"){Ct[1]=Cz;}else{if(Ct[1]\\x3cCz){if(Cx=="byWord"){Ct[1]=y(C4(Ct[0]),Ct[1],true);\\n}else{Ct[1]++;}}else{if(Ct[0]\\x3cA.lines.length()-1){Ct[0]++;Ct[1]=0;if(Cx=="byWord"){Ct[1]=y(C4(Ct[0]),Ct[1],true);\\n}}}}}i=0;}}}var C9=((Ct[0]\\x3cCu[0])||(Ct[0]==Cu[0]&&Ct[1]\\x3cCu[1]));var DD=(C9?Ct:Cu);var DC=(C9?Cu:Ct);Cp=true;\\nd(Cq(DD[0],DD[1]),Cq(DC[0],DC[1]),C9);Cp=false;C.userChangedSelection=true;return true;}};})());function CO(i){var Cp=i;\\ni=extend({},Cp);i.preventDefault=function(){if(Cp.preventDefault){Cp.preventDefault();}Cp.returnValue=false;\\n};i.stopPropagation=function(){if(Cp.stopPropagation){Cp.stopPropagation();}Cp.cancelBubble=true;};if(!i.target&&i.srcElement){i.target=i.srcElement;\\n}if(browser.safari&&i.target.nodeType==3){i.target=Cp.target.parentNode;}if(!i.relatedTarget&&i.fromElement){i.relatedTarget=i.fromElement==i.target?i.toElement:i.fromElement;\\n}if(i.pageX==null&&i.clientX!=null){var Cq=document.documentElement,Cr=document.body;i.pageX=i.clientX+(Cq&&Cq.scrollLeft||Cr.scrollLeft||0);\\ni.pageY=i.clientY+(Cq&&Cq.scrollTop||Cr.scrollTop||0);}if(!i.which&&(i.charCode||i.keyCode)){i.which=i.charCode||i.keyCode;\\n}if(!i.metaKey&&i.ctrlKey){i.metaKey=i.ctrlKey;}if(!i.which&&i.button){i.which=(i.button&1?1:(i.button&2?3:(i.button&4?2:0)));\\n}return i;}var a;var j;function BX(){a=1;U.innerHTML=\\\'\\x3ctable border="0" cellpadding="0" cellspacing="0" align="right">\\x3ctr>\\x3ctd id="sidedivinner">\\x3cdiv>1\\x3c/div>\\x3c/td>\\x3c/tr>\\x3c/table>\\\';\\nj=F.document.getElementById("sidedivinner");}function CN(){var Cq=A.lines.length();if(Cq\\x3c1){Cq=1;}if(Cq!=a){var Cr=j;\\nvar Cv=F.document;while(a\\x3cCq){a++;var Cw=a;var Ct=Cv.createElement("DIV");Ct.appendChild(Cv.createTextNode(String(Cw)));\\nCr.appendChild(Ct);}while(a>Cq){Cr.removeChild(Cr.lastChild);a--;}}if(C&&C.domClean){var Cp=j.firstChild;\\nvar i=D.body.firstChild;while(Cp&&i){var Cs=(i.clientHeight||i.offsetHeight);if(i.nextSibling){Cs=i.nextSibling.offsetTop-i.offsetTop;\\n}if(Cs){var Cu=Cs+"px";if(Cp.style.height!=Cu){Cp.style.height=Cu;}}Cp=Cp.nextSibling;i=i.nextSibling;\\n}j.firstChild.style.marginTop=(D.body.firstChild.offsetTop-j.firstChild.offsetTop+parseInt(j.firstChild.style.marginTop+"0"))+"px";\\n}}}OUTER(this);\'+\'//-->\\n\\x3c/script>\')')); +T.push('\'\\n<style type="text/css" title="dynamicsyntax"></style>\\n\'');T.push('\'</head><body id="innerdocbody" class="syntax" spellcheck="false"> </body></html>\''); +var X='editorId = "'+A.id+'"; editorInfo = parent.'+K+'.registry[editorId]; window.onload = function() { window.onload = null; setTimeout(function() { var iframe = document.createElement("IFRAME"); iframe.scrolling = "no"; var outerdocbody = document.getElementById("outerdocbody"); iframe.frameBorder = 0; iframe.allowTransparency = true; outerdocbody.insertBefore(iframe, outerdocbody.firstChild); iframe.ace_outerWin = window; readyFunc = function() { editorInfo.onEditorReady(); readyFunc = null; editorInfo = null; }; var doc = iframe.contentWindow.document; doc.open(); doc.write('+T.join("+")+"); doc.close(); }, 0); }"; +var Y=[W,"<html><head>",('<style type="text/css">body{margin:0;white-space:nowrap;}h1,h2,h3,h4,h5,h6{display:inline;line-height:2em;}#outerdocbody{background-color:#fff;}body.grayedout{background-color:#eee!important;}#innerdocbody{font-size:12px;font-family:monospace;line-height:16px;}body.doesWrap{white-space:normal;}#innerdocbody{padding-top:1px;padding-right:10px;padding-bottom:8px;padding-left:1px;overflow:hidden;background-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);}#sidediv{font-size:11px;font-family:monospace;line-height:16px;padding-top:8px;padding-right:3px;position:absolute;width:20px;top:0;left:0;cursor:default;color:white;}#sidedivinner{text-align:right;}.sidedivdelayed{background-color:#eee;color:#888!important;border-right:1px solid #999;}.sidedivhidden{display:none;}#outerdocbody iframe{display:block;position:relative;left:32px;top:7px;border:0;width:1px;height:1px;}#outerdocbody .hotrect{border:1px solid #999;position:absolute;}body.mozilla,body.safari{display:table-cell;}body.doesWrap{display:block!important;}.safari div{padding-right:1px;}p{margin:0;}#linemetricsdiv{position:absolute;left:-1000px;top:-1000px;color:white;z-index:-1;font-size:12px;font-family:monospace;}#overlaysdiv{position:absolute;left:-1000px;top:-1000px;}</style>'),'<link rel="stylesheet" type="text/css" href="data:text/css,"/>',"\x3cscript>",X,"\x3c/script>",'</head><body id="outerdocbody"><div id="sidediv"><!-- --></div><div id="linemetricsdiv">x</div><div id="overlaysdiv"><!-- --></div></body></html>']; +var U=document.createElement("IFRAME");U.frameBorder=0;A.frame=U;document.getElementById(Q).appendChild(U); +var V=U.contentWindow.document;V.open();V.write(Y.join(""));V.close();B.adjustSize();})();};return B; +}
\ No newline at end of file diff --git a/trunk/etherpad/src/static/js/linestylefilter_client.js b/trunk/etherpad/src/static/js/linestylefilter_client.js new file mode 100644 index 0000000..ca60296 --- /dev/null +++ b/trunk/etherpad/src/static/js/linestylefilter_client.js @@ -0,0 +1,252 @@ +// DO NOT EDIT THIS FILE, edit infrastructure/ace/www/linestylefilter.js + +/** + * Copyright 2009 Google Inc. + * + * 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. + */ + +// requires: easysync2.Changeset + +var linestylefilter = {}; + +linestylefilter.ATTRIB_CLASSES = { + 'bold':'tag:b', + 'italic':'tag:i', + 'underline':'tag:u', + 'strikethrough':'tag:s', + 'h1':'tag:h1', + 'h2':'tag:h2', + 'h3':'tag:h3', + 'h4':'tag:h4', + 'h5':'tag:h5', + 'h6':'tag:h6' +}; + +linestylefilter.getAuthorClassName = function(author) { + return "author-"+author.replace(/[^a-y0-9]/g, function(c) { + if (c == ".") return "-"; + return 'z'+c.charCodeAt(0)+'z'; + }); +}; + +// lineLength is without newline; aline includes newline, +// but may be falsy if lineLength == 0 +linestylefilter.getLineStyleFilter = function(lineLength, aline, + textAndClassFunc, apool) { + + if (lineLength == 0) return textAndClassFunc; + + var nextAfterAuthorColors = textAndClassFunc; + + var authorColorFunc = (function() { + var lineEnd = lineLength; + var curIndex = 0; + var extraClasses; + var leftInAuthor; + + function attribsToClasses(attribs) { + var classes = ''; + Changeset.eachAttribNumber(attribs, function(n) { + var key = apool.getAttribKey(n); + if (key) { + var value = apool.getAttribValue(n); + if (value) { + if (key == 'author') { + classes += ' '+linestylefilter.getAuthorClassName(value); + } + else if (key == 'list') { + classes += ' list:'+value; + } + else if (linestylefilter.ATTRIB_CLASSES[key]) { + classes += ' '+linestylefilter.ATTRIB_CLASSES[key]; + } + } + } + }); + return classes.substring(1); + } + + var attributionIter = Changeset.opIterator(aline); + var nextOp, nextOpClasses; + function goNextOp() { + nextOp = attributionIter.next(); + nextOpClasses = (nextOp.opcode && attribsToClasses(nextOp.attribs)); + } + goNextOp(); + function nextClasses() { + if (curIndex < lineEnd) { + extraClasses = nextOpClasses; + leftInAuthor = nextOp.chars; + goNextOp(); + while (nextOp.opcode && nextOpClasses == extraClasses) { + leftInAuthor += nextOp.chars; + goNextOp(); + } + } + } + nextClasses(); + + return function(txt, cls) { + while (txt.length > 0) { + if (leftInAuthor <= 0) { + // prevent infinite loop if something funny's going on + return nextAfterAuthorColors(txt, cls); + } + var spanSize = txt.length; + if (spanSize > leftInAuthor) { + spanSize = leftInAuthor; + } + var curTxt = txt.substring(0, spanSize); + txt = txt.substring(spanSize); + nextAfterAuthorColors(curTxt, (cls&&cls+" ")+extraClasses); + curIndex += spanSize; + leftInAuthor -= spanSize; + if (leftInAuthor == 0) { + nextClasses(); + } + } + }; + })(); + return authorColorFunc; +}; + +linestylefilter.getAtSignSplitterFilter = function(lineText, + textAndClassFunc) { + var at = /@/g; + at.lastIndex = 0; + var splitPoints = null; + var execResult; + while ((execResult = at.exec(lineText))) { + if (! splitPoints) { + splitPoints = []; + } + splitPoints.push(execResult.index); + } + + if (! splitPoints) return textAndClassFunc; + + return linestylefilter.textAndClassFuncSplitter(textAndClassFunc, + splitPoints); +}; + +linestylefilter.REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; +linestylefilter.REGEX_URLCHAR = new RegExp('('+/[-:@a-zA-Z0-9_.,~%+\/\\?=&#;()$]/.source+'|'+linestylefilter.REGEX_WORDCHAR.source+')'); +linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\/\/|mailto:)/.source+linestylefilter.REGEX_URLCHAR.source+'*(?![:.,;])'+linestylefilter.REGEX_URLCHAR.source, 'g'); + +linestylefilter.getURLFilter = function(lineText, textAndClassFunc) { + linestylefilter.REGEX_URL.lastIndex = 0; + var urls = null; + var splitPoints = null; + var execResult; + while ((execResult = linestylefilter.REGEX_URL.exec(lineText))) { + if (! urls) { + urls = []; + splitPoints = []; + } + var startIndex = execResult.index; + var url = execResult[0]; + urls.push([startIndex, url]); + splitPoints.push(startIndex, startIndex + url.length); + } + + if (! urls) return textAndClassFunc; + + function urlForIndex(idx) { + for(var k=0; k<urls.length; k++) { + var u = urls[k]; + if (idx >= u[0] && idx < u[0]+u[1].length) { + return u[1]; + } + } + return false; + } + + var handleUrlsAfterSplit = (function() { + var curIndex = 0; + return function(txt, cls) { + var txtlen = txt.length; + var newCls = cls; + var url = urlForIndex(curIndex); + if (url) { + newCls += " url:"+url; + } + textAndClassFunc(txt, newCls); + curIndex += txtlen; + }; + })(); + + return linestylefilter.textAndClassFuncSplitter(handleUrlsAfterSplit, + splitPoints); +}; + +linestylefilter.textAndClassFuncSplitter = function(func, splitPointsOpt) { + var nextPointIndex = 0; + var idx = 0; + + // don't split at 0 + while (splitPointsOpt && + nextPointIndex < splitPointsOpt.length && + splitPointsOpt[nextPointIndex] == 0) { + nextPointIndex++; + } + + function spanHandler(txt, cls) { + if ((! splitPointsOpt) || nextPointIndex >= splitPointsOpt.length) { + func(txt, cls); + idx += txt.length; + } + else { + var splitPoints = splitPointsOpt; + var pointLocInSpan = splitPoints[nextPointIndex] - idx; + var txtlen = txt.length; + if (pointLocInSpan >= txtlen) { + func(txt, cls); + idx += txt.length; + if (pointLocInSpan == txtlen) { + nextPointIndex++; + } + } + else { + if (pointLocInSpan > 0) { + func(txt.substring(0, pointLocInSpan), cls); + idx += pointLocInSpan; + } + nextPointIndex++; + // recurse + spanHandler(txt.substring(pointLocInSpan), cls); + } + } + } + return spanHandler; +}; + +// domLineObj is like that returned by domline.createDomLine +linestylefilter.populateDomLine = function(textLine, aline, apool, + domLineObj) { + // remove final newline from text if any + var text = textLine; + if (text.slice(-1) == '\n') { + text = text.substring(0, text.length-1); + } + + function textAndClassFunc(tokenText, tokenClass) { + domLineObj.appendSpan(tokenText, tokenClass); + } + + var func = textAndClassFunc; + func = linestylefilter.getURLFilter(text, func); + func = linestylefilter.getLineStyleFilter(text.length, aline, + func, apool); + func(text, ''); +}; diff --git a/trunk/etherpad/src/templates/email/eepnet_license_info.ejs b/trunk/etherpad/src/templates/email/eepnet_license_info.ejs new file mode 100644 index 0000000..85556c7 --- /dev/null +++ b/trunk/etherpad/src/templates/email/eepnet_license_info.ejs @@ -0,0 +1,72 @@ +<% /* Copyright 2009 Google Inc. + +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. */ %><% + var parts = licenseKey.split(":"); + var name = parts[0]; + var org = parts[1]; + var key = parts[2]; + + if ((key.length % 2) != 0) { + key = key + "+"; + } + var keyLine1 = key.substr(0, key.length/2); + var keyLine2 = key.substr(key.length/2, key.length); +%> +Dear <%= userName %>, + +Thank you for downloading EtherPad Private Network Edition. +This is an automated email containing your license information. + +<% if (isEvaluation) { %> +NOTE: This is an EVALUATION license, which will expire on +<%= expiresDate.toString() %>. +<% } %> + +**************************************** +NAME: + + <%= name %> + +**************************************** +ORGANIZATION: + + <%= org %> + +**************************************** +LICENSE KEY: + + <%= keyLine1 %> + <%= keyLine2 %> + +**************************************** +INSTRUCTIONS: + + http://<%= request.host %>/ep/pne-manual + +**************************************** +DOWNLOAD LINK: + + http://<%= request.host %><%= isEvaluation ? "/ep/store/eepnet-download" : "/ep/store/eepnet-download-nextsteps" %> + +<% if (isEvaluation) { %> +-- + +This email was sent automatically from pad.spline.inf.fu-berlin.de because you signed +up for EtherPad PNE. If you did not sign up for +this, then you can safely just ignore this email. + +<% } else { %> +-- + +Thanks for buying EtherPad! +<% } %>
\ No newline at end of file diff --git a/trunk/etherpad/src/templates/pad/pad_body2.ejs b/trunk/etherpad/src/templates/pad/pad_body2.ejs new file mode 100644 index 0000000..23b7adb --- /dev/null +++ b/trunk/etherpad/src/templates/pad/pad_body2.ejs @@ -0,0 +1,472 @@ +<% /* Copyright 2009 Google Inc. + +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. */ %> +<% helpers.setHtmlTitle("EtherPad: "+pageTitle); %> +<% helpers.setBodyId("padbody") %> +<% helpers.addBodyClass(bodyClass) %> +<% helpers.includeCss("pad2_ejs.css") %> +<% helpers.includeJs("undo-xpopup.js") %> +<% helpers.includeCometJs() %> +<% helpers.includeJQuery(); %> +<% helpers.includeJs("json2.js") %> +<% helpers.includeJs("colorutils.js") %> +<% helpers.includeJs("ace.js") %> +<% helpers.includeJs("collab_client.js") %> +<% helpers.includeJs("draggable.js") %> +<% helpers.includeJs("pad_utils.js") %> +<% helpers.includeJs("pad_cookie.js") %> +<% helpers.includeJs("pad_editor.js") %> +<% helpers.includeJs("pad_userlist.js") %> +<% helpers.includeJs("pad_editbar.js") %> +<% helpers.includeJs("pad_chat.js") %> +<% helpers.includeJs("pad_docbar.js") %> +<% helpers.includeJs("pad_impexp.js") %> +<% helpers.includeJs("pad_savedrevs.js") %> +<% helpers.includeJs("pad_connectionstatus.js") %> +<% helpers.includeJs("pad_modals.js") %> +<% helpers.includeJs("pad2.js") %> +<% helpers.suppressGA() %> +<% helpers.setRobotsPolicy({index: false, follow: false}) %> +<% + var padUrlAttrValue = request.url.split("?", 1)[0].replace(/\"/g, '"'); //" +%> + +<% + function exportLink(type, n, label, requiresOffice, url, title) { + url = url || '/ep/pad/export/'+localPadId+'/latest?format='+type; + var classes = ["exportlink", "exporthref"+type, "n"+n]; + if (requiresOffice && !hasOffice) { + classes.push("disabledexport"); + } + else { + classes.push("requiresoffice"); + } + var pieces = ['<a']; + pieces.push(' class="', classes.join(' '), '"'); + pieces.push(' target="_blank"'); + pieces.push(' href="', url, '"'); + if (title) { + pieces.push(' title="', title.replace(/\"/g, """), '"'); //" + } + pieces.push('>', label); + /* if (title) { + pieces.push('<sup>?</sup>'); + }*/ + pieces.push('</a>'); + return pieces.join(''); + } +%> + +<div id="padpage"> + +<div id="padtop"> + <div id="topbar"> + <% /* floated left */ %> + <div id="topbarleft"><!-- --></div> + <% /* <a href="#" id="topbarnewpad">New Pad</a> */ %> + <% /* floated right */ %> + <div id="topbarright"><!-- --></div> + <% /* <a href="#" id="topbarfullwidth">Toggle Width</a> */ %> + <% /* non-floated */ %> + <div id="topbarcenter"> + <a href="/" id="topbaretherpad">EtherPad</a> + </div> +<% if (isProAccountHolder) { %> + <a id="backtoprosite" href="/ep/padlist/">Return to pad list</a> + <div id="accountnav"><%= toHTML(account.email) %> + <a href="/ep/account/sign-out">(sign out)</a> + </div> +<% } else if (isPro) { %> + <div id="accountnav"> + <a href="<%= signinUrl %>">sign in</a> + </div> +<% } %> + <div id="specialkeyarea"><!-- --></div> + </div> +<!-- + <div id="shuttingdown"> + <strong style="color:red">Note: EtherPad.com is shutting down March 31, 2010.</strong> + <a href="http://<%= fullSuperdomain %>/ep/blog/posts/google-acquires-appjet">(more info)</a> + </div> + --> + <div id="alertbar"> + <div id="servermsg"> + <h3>Server Notice<span id="servermsgdate"><!-- --></span>:</h3> + <a id="hidetopmsg" href="javascript: void pad.hideServerMessage()">hide</a> + <p id="servermsgtext"><!-- --></p> + </div> + </div> + + <div id="docbar"> + <div id="docbarleft"><!-- --></div> + <div id="docbarpadtitle"><span><%= initialTitle %></span></div> +<% if (isProAccountHolder) { %> + <div id="docbarsecurity-outer"><a href="javascript:void(0)" id="docbarsecurity">Security</a></div> +<% } /* isProAccountHolder */ %> + <div id="docbaroptions-outer"><a href="javascript:void(0)" id="docbaroptions">Pad Options</a></div> + <div id="docbarsavedrevs-outer"><a href="javascript:void(0)" id="docbarsavedrevs">Saved revisions</a></div> + <div id="docbarimpexp-outer"><a href="javascript:void(0)" id="docbarimpexp">Import/Export</a></div> + <div id="docbarslider-outer"><a target="_blank" href="/ep/pad/view/<%= localPadId %>/latest" id="docbarslider">Time Slider</a></div> +<% if (isProAccountHolder) { %> + <div id="docbarrenamelink"> + <a href="javascript:void(0)">(rename)</a> + </div> +<% } /* isProAccountHolder */ %> + <input type="text" id="padtitleedit"/> + <div id="padtitlebuttons"> + <a id="padtitlesave" href="javascript:void(0)">Save</a> + <a id="padtitlecancel" href="javascript:void(0)">Cancel</a> + </div> + <div id="impexp-wrapper" class="dbpanel-wrapper"> + <div id="impexp-panel" class="dbpanel-panel"> + <div class="dbpanel-leftedge"><!-- --></div> + <div class="dbpanel-rightedge"><!-- --></div> + <div class="dbpanel-botleftcorner"><!-- --></div> + <div class="dbpanel-botrightcorner"><!-- --></div> + <div class="dbpanel-middle"> + <div class="dbpanel-inner"> + <div class="dbpanel-top"><!-- --></div> + </div> + <div class="dbpanel-bottom"><!-- --></div> + <div id="importexport"> + <div id="impexp-import"> + <div id="impexp-importlabel"><b>Import</b> from text file, HTML:</div> + <form id="importform" method="post" action="/ep/pad/impexp/import" + target="importiframe" enctype="multipart/form-data"> + <div class="importformdiv" id="importformfilediv"> + <input type="file" name="file" size="20" id="importfileinput" /> + <div class="importmessage" id="importmessagefail"></div> + </div> + <div class="importmessage" id="importmessagesuccess">Successful!</div> + <div class="importformdiv" id="importformsubmitdiv"> + <input type="hidden" name="padId" value="<%= encodeURIComponent(localPadId) %>" /> + <span class="nowrap"> + <input type="submit" name="submit" value="Import Now" disabled="disabled" id="importsubmitinput" /> + <img alt="" id="importstatusball" src="/static/img/misc/status-ball.gif" align="top" /> + <img alt="" id="importarrow" src="/static/img/may09/leftarrow2.gif" align="top" /> + </span> + </div> + </form> + </div><!-- /impexp-import --> + <div id="impexp-export"> + <div id="impexp-exportlabel"><b>Export</b> current pad as:</div> + <div id="exportlinks"> + <%= exportLink('html', 1, 'HTML', false) %> + <%= exportLink('txt', 2, 'Plain text', false) %> + <%= exportLink('link', 3, 'Bookmark file', false, '/ep/pad/linkfile?padId='+localPadId, 'This will save a file that, when opened, takes you to this pad.') %> + </div> + </div><!-- /impexp-export --> + <div id="impexp-divider"><!-- --></div> + <div id="impexp-disabled-clickcatcher"><!-- --></div> + <a id="impexp-close" href="javascript:void(0)">Hide</a> + </div><!-- /importexport --> + </div> + </div> + </div> + <div id="savedrevs-wrapper" class="dbpanel-wrapper"> + <div id="savedrevs-panel" class="dbpanel-panel"> + <div class="dbpanel-leftedge"><!-- --></div> + <div class="dbpanel-rightedge"><!-- --></div> + <div class="dbpanel-botleftcorner"><!-- --></div> + <div class="dbpanel-botrightcorner"><!-- --></div> + <div class="dbpanel-middle"> + <div class="dbpanel-inner"> + <div class="dbpanel-top"><!-- --></div> + </div> + <div class="dbpanel-bottom"><!-- --></div> + </div> + <div id="savedrevisions"> + <a href="javascript:void(0)" id="savedrevs-savenow"> + Save Now + </a> + <div id="savedrevs-scrolly"> + <div id="savedrevs-scrollleft" class="disabledscrollleft"><!-- --></div> + <div id="savedrevs-scrollright" class="disabledscrollright"><!-- --></div> + <div id="savedrevs-scrollouter"> + <div id="savedrevs-scrollinner"> + <!-- --> + </div> + </div> + </div> + <a id="savedrevs-close" href="javascript:void(0)">Hide</a> + </div><!-- /savedrevs close --> + </div> + </div><!-- /savedrevs-wrapper --> + <div id="revision-notifier"><span class="label">Saved:</span> <span class="name">Revision 1</span></div> + <div id="options-wrapper" class="dbpanel-wrapper"> + <div id="options-panel" class="dbpanel-panel"> + <div class="dbpanel-leftedge"><!-- --></div> + <div class="dbpanel-rightedge"><!-- --></div> + <div class="dbpanel-botleftcorner"><!-- --></div> + <div class="dbpanel-botrightcorner"><!-- --></div> + <div class="dbpanel-middle"> + <div class="dbpanel-inner"> + <div class="dbpanel-top"><!-- --></div> + </div> + <div class="dbpanel-bottom"><!-- --></div> + </div> + <div id="padoptions"> + <div id="options-viewhead">Shared view options:</div> + <input type="checkbox" id="options-colorscheck" /> + <label for="options-colorscheck" id="options-colorslabel">Authorship colors</label> + <input type="checkbox" id="options-linenoscheck" /> + <label for="options-linenoscheck" id="options-linenoslabel">Line numbers</label> + <div id="options-fontlabel">Display font:</div> + <select id="viewfontmenu"><option value="normal">Normal</option><option value="monospace">Monospaced</option></select> + <div id="options-viewexplain">These options affect everyone's view of the pad.</div> + <a id="options-close" href="javascript:void(0)">Hide</a> + </div> + </div> + </div><!-- /options-wrapper --> +<% if (isProAccountHolder) { %> + <div id="security-wrapper" class="dbpanel-wrapper"> + <div id="security-panel" class="dbpanel-panel"> + <div class="dbpanel-leftedge"><!-- --></div> + <div class="dbpanel-rightedge"><!-- --></div> + <div class="dbpanel-botleftcorner"><!-- --></div> + <div class="dbpanel-botrightcorner"><!-- --></div> + <div class="dbpanel-middle"> + <div class="dbpanel-inner"> + <div class="dbpanel-top"><!-- --></div> + </div> + <div class="dbpanel-bottom"><!-- --></div> + </div> + <div id="padsecurity"> + <div id="security-access"> + <div id="security-accesshead">Pad Access:</div> + <input type="radio" name="padaccess" id="access-private" value="deny"/> + <label for="access-private" id="access-private-label"><strong>Private</strong> (Team account-holders only)</label> + <input type="radio" name="padaccess" id="access-public" value="allow"/> + <label for="access-public" id="access-public-label"><strong>Public</strong> (Allow Internet guests)</label> + </div> + <div id="security-password"> + <div id="security-passhead">Password:</div> + <div id="security-passbody"> + <div class="nopassword" id="password-nonedit"> + <div id="password-display">None</div> + <a href="javascript:void(0)" id="password-setlink">Set...</a> + <a href="javascript:void(0)" id="password-clearlink">Clear</a> + </div> + <div id="password-inedit"> + <a href="javascript:void(0)" id="password-savelink">Save</a> + <a href="javascript:void(0)" id="password-cancellink">Cancel</a> + <input type="text" id="security-passwordedit" maxlength="31" /> + </div> + </div> + </div> + <a id="security-close" href="javascript:void(0)">Hide</a> + </div> + </div> + </div><!-- /security-wrapper --> +<% } /* isProAccountHolder */ %> + </div><!-- /docbar --> +</div> + +<div id="padmain"> + <div id="padsidebar"> + <div id="padusers"> + <div id="connectionbox" class="cboxconnecting"> + <div id="connectionboxinner"> + <div class="connecting"> + Connecting... + </div> + <div class="reconnecting"> + Reestablishing connection... + </div> + <div class="disconnected"> + <h2 class="h2_disconnect">Disconnected.</h2> + <h2 class="h2_userdup">Opened in another window.</h2> + <h2 class="h2_unauth">No Authorization.</h2> + <div id="disconnected_looping"> + <p><b>We're having trouble talking to the EtherPad synchronization server.</b> + You may be connecting through an incompatible firewall or proxy server.</p> + </div> + <div id="disconnected_initsocketfail"> + <p><b>We were unable to connect to the EtherPad synchronization server.</b> + This may be due to an incompatibility with your web + browser or internet connection.</p> + </div> + <div id="disconnected_userdup"> + <p><b>You seem to have opened this pad in another browser window.</b> + If you'd like to use this window instead, you can reconnect.</p> + </div> + <div id="disconnected_unknown"> + <p><b>Lost connection with the EtherPad synchronization + server.</b> This may be due to a loss of network connectivity.</p> + </div> + <div id="disconnected_slowcommit"> + <p><b>Server not responding.</b> This may be due to network connectivity issues or high load on the server.</p> + </div> + <div id="disconnected_unauth"> + <p>Your browser's credentials or permissions have changed while viewing this pad. Try reconnecting.</p> + </div> + <div id="reconnect_advise"> + <p>If this continues to happen, please <a target="_blank" href="/ep/support">let us know</a> + (opens in new window).</p> + </div> + <div id="reconnect_form"> + <button id="forcereconnect">Reconnect Now</button> + </div> + </div> + </div> + </div> + + <div id="connectionstatus"> + <!-- --> + </div> + + <div id="myuser"> + <div id="mycolorpicker"> + <div class="pickerswatchouter n1"><div class="pickerswatch"><!-- --></div></div> + <div class="pickerswatchouter n2"><div class="pickerswatch"><!-- --></div></div> + <div class="pickerswatchouter n3"><div class="pickerswatch"><!-- --></div></div> + <div class="pickerswatchouter n4"><div class="pickerswatch"><!-- --></div></div> + <div class="pickerswatchouter n5"><div class="pickerswatch"><!-- --></div></div> + <div class="pickerswatchouter n6"><div class="pickerswatch"><!-- --></div></div> + <div class="pickerswatchouter n7"><div class="pickerswatch"><!-- --></div></div> + <div class="pickerswatchouter n8"><div class="pickerswatch"><!-- --></div></div> + <div id="mycolorpickersave">Save</div> + <div id="mycolorpickercancel">Cancel</div> + </div> + <div id="myswatchbox"><div id="myswatch"><!-- --></div></div> + <div id="myusernameform"><input type="text" id="myusernameedit" disabled="disabled" /></div> + <div id="mystatusform"><input type="text" id="mystatusedit" disabled="disabled" /></div> + </div> + <div id="otherusers"> + <div id="guestprompts"><!-- --></div> + <table id="otheruserstable" cellspacing="0" cellpadding="0" border="0"> + <tr><td></td></tr> + </table> + <div id="nootherusers"><a href="javascript:void(0)">Invite</a> other users and they will show up here.</div> + </div> + <div id="userlistbuttonarea"> + <a href="javascript:void(0)" id="sharebutton">Share</a> + </div> + </div> <!-- /padusers --> + + <div id="hdraggie"><!-- --></div> + + <div id="padchat"> +<!-- <div id="chattop"><a href="#">View chat logs...</a></div> --> + <div id="chatlines"> + <a href="javascript:void(0)" id="chatloadmore">Load more history...</a> + <div id="chatloadingmore">Loading history...</div> + </div> + <div id="chatbottom"> + <div id="chatprompt">Chat:</div> + <div id="chatentryform"><input type="text" id="chatentrybox"/></div> + </div> + </div> + </div> <!-- /padsidebar --> + + <div id="padeditor"> + <div id="editbar" class="disabledtoolbar"> + <% /* floated left */ %> + <div id="editbarleft"><!-- --></div> + <% /* floated right */ %> + <div id="editbarright"><!-- --></div> + <% /* non-floated */ %> + <div id="editbarinner"> + <a href="javascript:void (window.pad&&pad.editbarClick('bold'));" class="editbarbutton bold" title="Bold (ctrl-B)"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('italic'));" class="editbarbutton italic" title="Italics (ctrl-I)"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('underline'));" class="editbarbutton underline" title="Underline (ctrl-U)"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('strikethrough'));" class="editbarbutton strikethrough" title="Strikethrough"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('h1'));" class="editbarbutton h1" title="H1"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('h2'));" class="editbarbutton h2" title="H2"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('h3'));" class="editbarbutton h3" title="H3"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('h4'));" class="editbarbutton h4" title="H4"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('h5'));" class="editbarbutton h5" title="H5"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('h6'));" class="editbarbutton h6" title="H6"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('clearauthorship'));" class="editbarbutton clearauthorship" title="Clear Authorship Colors"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('undo'));" class="editbarbutton undo" title="Undo (ctrl-Z)"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('redo'));" class="editbarbutton redo" title="Redo (ctrl-Y)"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('insertunorderedlist'));" class="editbarbutton insertunorderedlist" title="Toggle Bullet List"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('indent'));" class="editbarbutton indent" title="Indent List"> </a> + <a href="javascript:void (window.pad&&pad.editbarClick('outdent'));" class="editbarbutton outdent" title="Unindent List"> </a> + <div id="syncstatussyncing" title="Syncing..."><!-- --></div> + <div id="syncstatusdone" title="Synced."><!-- --></div> + <a href="javascript:void (window.pad&&pad.editbarClick('save'));" class="editbarbutton save" title="Save Revision"> </a> + </div> + </div> + <div id="editorcontainerbox"> + <div id="editorloadingbox">Loading...</div> + <div id="editorcontainer"><!-- --></div> + </div> + </div><!-- /padeditor --> + + <div id="bottomarea"> + <div id="viewbarcontents"> + <div id="viewzoomtitle">Zoom:</div> + <select id="viewzoommenu"><option value="z85">85%</option><option value="z100">100%</option><option value="z115">115%</option><option value="z150">150%</option><option value="z200">200%</option><option value="z300">300%</option></select> + </div> + + <div id="widthprefcheck" + class="<%= (prefs.isFullWidth?'widthprefchecked':'widthprefunchecked') %>" + ><!-- --></div> + <div id="sidebarcheck" + class="<%= (prefs.hideSidebar?'sidebarunchecked':'sidebarchecked') %>" + ><!-- --></div> + </div> + +</div><!-- /padmain --> + +</div><!-- /padpage --> + +<div id="modaloverlay"><div id="modaloverlay-inner"><!-- --></div></div> +<div id="mainmodals"> + <div id="sharebox"> + <div id="sharebox-inner"> + <a href="javascript:void(0)" id="sharebox-hide"><!-- --></a> + <div id="sharebox-stripe" class="sharebox-stripe-private"> + <div class="public"> + <strong>Public Pad:</strong> This pad is accessible to anyone who + visits its URL. To make it private, <a href="javascript:void(0)" class="setsecurity">change security settings</a>. + </div> + <div class="private"> + <strong>Private Pad:</strong> This pad is only accessible to team account-holders. To allow anyone to access it, <a href="javascript:void(0)" class="setsecurity">change security settings</a>. + </div> + </div> + <div id="sharebox-forms"> + <div id="sharebox-pastelink">Paste link over email or IM:</div> + <div id="sharebox-orsend">or send an email invitation...</div> + <a href="javascript:void(0)" id="sharebox-send"><!-- --></a> + <input id="sharebox-url" type="text" readonly="readonly" value="<%=padUrlAttrValue%>"/> + <input type="text" id="sharebox-to" class="modalfield" /> + <input type="text" id="sharebox-subject" class="modalfield" /> + <textarea id="sharebox-message" rows="6" cols="40" class="modalfield"></textarea> + <div id="sharebox-fieldname-to">To</div> + <div id="sharebox-fieldname-subject">Subject</div> + <div id="sharebox-fieldname-message">Message</div> + <div id="sharebox-dislink"><!-- --></div> + </div> + <div id="sharebox-shownwhenexpanded"> + <div id="sharebox-response"><!-- --></div> + </div> + </div> + </div> +</div> + +<% if (request.params.djs) { %> + <div id="djs"><!-- --></div> +<% } %> + +<form id="reconnectform" + method="post" + action="/ep/pad/reconnect" + accept-charset="UTF-8" + style="display: none;"> + <input type="hidden" class="padId" name="padId" /> + <input type="hidden" class="diagnosticInfo" + name="diagnosticInfo" /> + <input type="hidden" class="missedChanges" name="missedChanges" /> +</form> diff --git a/trunk/etherpad/src/templates/pad/pad_content.ejs b/trunk/etherpad/src/templates/pad/pad_content.ejs new file mode 100644 index 0000000..4e25c7f --- /dev/null +++ b/trunk/etherpad/src/templates/pad/pad_content.ejs @@ -0,0 +1,297 @@ +<% /* Copyright 2009 Google Inc. + +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. */ %><% + function checkboxPref(name, label) { + var r = ['<div class="prefcheckbox" id="checkpref', name, '">']; + r.push('<table cellspacing="0" cellpadding="0" border="0">'); + r.push('<tr>'); + r.push('<td class="checkboxcell" valign="middle"><input type="checkbox" /></td>'); + r.push('<td class="labelcell" valign="middle">', label, '</td>'); + r.push('</tr>'); + r.push('</table>'); + r.push('</div>'); + return r.join(''); + } + + function exportOption(type, label, requiresOffice, url, title) { + url = url || '/ep/pad/export/'+padId+'/latest?format='+type; + var classes = [ "exportlink", "exporthref"+type ]; + if (requiresOffice && !hasOffice) { + classes.push("disabledexport"); + } else if (requiresOffice) { + classes.push("requiresoffice"); + } + var aStartArr = ['<a ']; + if (classes.length > 0) { + aStartArr.push(' class="'+classes.join(' ')+'"'); + } + aStartArr.push(' target="_blank" href="', url, '">'); + var aStart = aStartArr.join(''); + var r = ['<div class="exportlink" id="export', type, '"']; + if (title) { + r.push(' title="'+title+'"'); + } + r.push('>'); + r.push('<table cellspacing="0" cellpadding="0" border="0">'); + r.push('<tr>'); + r.push('<td class="exportpic" valign="middle">'); + r.push(aStart, '<img alt="" src="/static/img/may09/'+type+'.gif" />', '</a>'); + r.push('</td>'); + r.push('<td class="labelcell" valign="middle">'); + r.push(aStart, label, '</a>'); + if (title) { + r.push('<sup>?</sup>') + } + r.push('</td>'); + if (requiresOffice) { + r.push('<td class="exportspinner" '); + r.push('id="exportspinner', type, '"'); + r.push(' valign="middle"><img alt="" src="/static/img/misc/status-ball.gif" /></td>'); + } + r.push('</tr>'); + r.push('</table>'); + r.push('</div>'); + return r.join(''); + } +%> + +<div id="servermsg" class="topmsg hidden"> + <p><b>Server Notice (<span id="servermsgdate"></span>)</b></p> + <br/> + <a id="hidetopmsg" href="javascript: void pad.hideTopMsg('server')">hide</a> + <p id="servermsgtext"></p> +</div> + +<div id="bigtoperror_wrap" class="topmsg hidden"> + + <div class="bigtoperror" id="disconnected_looping"> + <p><b>We're having trouble establishing a connection with an + EtherPad synchronization server.</b> You may be connecting through an incompatible firewall or + proxy server.</p> + </div> + + <div class="bigtoperror" id="disconnected_userdup"> + <p><b>You seem to have opened this pad in another browser + window.</b> If you'd like to use this window + instead, you can reconnect.</p> + </div> + + <div class="bigtoperror" id="disconnected_slowcommit"> + <p><b>We're having difficulties talking to the EtherPad + synchronization server.</b> This may be due to network connectivity issues or high load on the server.</p> + </div> + + <div class="bigtoperror" id="disconnected_initsocketfail"> + <p><b>We were unable to establish the initial connection with + the EtherPad synchronization server.</b> This may be due to an incompatibility with your web + browser or internet connection.</p> + </div> + + <div class="bigtoperror" id="disconnected_unknown"> + <p><b>Lost connection with the EtherPad synchronization + server.</b> This may be due to a loss of network connectivity.</p> + </div> + + <div class="bigtoperror" id="reconnect_advise"> + <p>If this continues to happen, please <a target="_blank" href="/ep/support">let us know</a> + (opens in new window).</p> + </div> + + <div id="reconnect_form"> + <p><button class="forcereconnect">Reconnect + Now</button></p> + </div> + +</div> + +<div id="padtablediv"> +<table id="padtable" + border="0" cellspacing="0" cellpadding="0"> + <tr> + <td id="topbar"> + <div id="connectionstatus" + class="connecting">Connecting...</div> + <div id="topbarmsg"> </div> + <a class="showhide" id="showsidebar" href="javascript:void pad.showSideBar();"> + « show side bar + </a> + </td> + <td id="sidebartop"> + <a class="showhide" id="hidesidebar" href="javascript:void pad.hideSideBar();"> + hide » + </a> + </td> + </tr> + + <tr id="sizedcontent"> + <td id="editorcell" class="editorcell_loading" width="100%" valign="top"> + <div id="editorcellinner"> + <div id="loadingbox"> + Loading... + </div> + <div id="toptoolbar" class="disabledtoolbar"> + <a href="javascript:void pad.toolbarClick('bold');" class="toptoolbarbutton bold" title="Bold (ctrl-B)"> </a> + <a href="javascript:void pad.toolbarClick('italic');" class="toptoolbarbutton italic" title="Italics (ctrl-I)"> </a> + <a href="javascript:void pad.toolbarClick('underline');" class="toptoolbarbutton underline" title="Underline (ctrl-U)"> </a> + <a href="javascript:void pad.toolbarClick('undo');" class="toptoolbarbutton undo" title="Undo (ctrl-Z)"> </a> + <a href="javascript:void pad.toolbarClick('redo');" class="toptoolbarbutton redo" title="Redo (ctrl-Y)"> </a> + <form id="padtitle" action="/"><input type="text" id="padtitleedit"/><span class="padtitlepad">Pad:</span> <span id="padtitletitle"> </span> <span class="editlink">(<a href="javascript:void pad.editTitle();">rename</a>)</span><span class="oklink"><a href="javascript:void pad.submitTitle(true);">OK</a></span></form> + <a href="javascript:void pad.passwordClick();" id="passwordlock" title="" class="passwordhidden"> </a> + </div> + <div id="editorcontainer"><!-- --></div> + <div id="bottoolbar" class="disabledtoolbar"> + <div id="viewzoom">View Zoom: <select id="viewzoommenu"><option value="z85">85%</option><option value="z100">100%</option><option value="z115">115%</option><option value="z150">150%</option><option value="z200">200%</option><option value="z300">300%</option></select></div> + <div id="viewfont">View Font: <select id="viewfontmenu"><option value="normal">Normal</option><option value="code">Code</option></select></div> + </div> + </div> + </td> + <td id="sidebarcell" valign="top"> + <div id="sidebar" class="sidebar_loading"> + <div id="headuserlistwrap" class="sideheadwrap sh_uncollapsed"><p class="sidehead">Connected Users</p></div> + <div id="userlistwrap" class="sidebox"> + <div id="userlist"><!-- setbyjs --></div> + <div id="invitemore"> + <a class="small_link" id="invitemorelink" href="javascript:void pad.invitemoreShow();">invite more people...</a> + <div id="inviteinstructions" style="display:none;"> + <p>To invite someone to this pad, just copy and paste them the URL to this page.</p> + <p id="emailinviteleadin">Or we can send them an invitation for you:</p> + <p> + Email: <input id="invite_email" type="text" name="email" value="" /> + <input type="submit" id="invite_email_submit" value="Send" /> + </p> + <p id="invite_email_status"><!-- --></p> + <p id="hideinstructions"><a class="small_link" href="javascript:void pad.invitemoreHide();">hide</a></p> + </div> + </div> + </div> + <div id="headchatbox" class="sideheadwrap sh_collapsed"><p id="chatheadname" class="sidehead">Chat</p></div> + <div class="sidebox hidden" id="chatbox"> + <div id="chatmessages"><!-- --></div> + <div> + <table id="chatsaytable" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td width="5" valign="middle">Say:</td> + <td><input type="text" id="chatinput" /></td> + </tr> + </table> + </div> + </div> + <div id="headimportexport" class="sideheadwrap sh_collapsed"><p class="sidehead">Import/Export</p></div> + <div class="sidebox hidden" id="importexport"> + <div id="exportsection"> + <p id="headexport"><strong>Download</strong> as:</p> + <table> + <tr> + <td class="firsttd"><%= exportOption('html', 'HTML', false) %></td> + </tr> + <tr> + <td class="firsttd"><%= exportOption('txt', 'Plain text', false) %></td> + </tr> + <tr> + <td class="firsttd"><%= exportOption('link', 'Bookmark file', false, + '/ep/pad/linkfile?padId='+padId, + 'This will save a file that, when opened, takes you to this pad.') %></td> + </tr> + </table> + <div id="exportmessage"></div> + </div> + <div id="importsection"> + <p id="headimport"><strong>Import</strong> text from file:</p> + <form id="importform" method="post" action="/ep/pad/impexp/import" target="importiframe" enctype="multipart/form-data"> + <div class="importformdiv" id="importformfilediv"> + <input type="file" name="file" size="20" id="importfileinput" /> + <div class="importmessage" id="importmessagefail"></div> + </div> + <div class="importmessage" id="importmessagesuccess"></div> + <div class="importformdiv" id="importformsubmitdiv"> + <input type="hidden" name="padId" value="<%= encodeURIComponent(padId) %>" /> + <span class="nowrap"> + <input type="submit" name="submit" value="Import Now" disabled="disabled" id="importsubmitinput" /> + <img alt="" id="importstatusball" src="/static/img/misc/status-ball.gif" align="bottom" /> + <img alt="" id="importarrow" src="/static/img/may09/leftarrow.gif" align="bottom" /> + </span> + </div> + </form> + </div> + </div> + <div id="headrevisions" class="sideheadwrap sh_collapsed"><p class="sidehead">Saved Revisions</p></div> + <div class="sidebox hidden" id="revisions"> + <div id="nosaveprivs"> + Sorry, you have exceeded the maximum allowable + number of saved revisions. + </div> + <input id="savenow" type="submit" value="Save Now" /> + <div id="revisionlist"> + </div> + </div> + <div id="headprefs" class="sideheadwrap sh_collapsed"><p class="sidehead">Options</p></div> + <div class="sidebox hidden" id="prefs"> + <%= checkboxPref("showcolors", "Highlight who typed what.") %> + <%= checkboxPref("wrap", "Wrap long lines.") %> + <%= checkboxPref("linenums", "Show line numbers.") %> + <%= checkboxPref("fullwidth", "Use full window width.") %> + <%= checkboxPref("jshighlight", "Highlight JavaScript syntax.") %> + </div> + <div id="headfeedback" class="sideheadwrap sh_collapsed"><p class="sidehead">Feedback</p></div> + <div class="sidebox hidden sidebox_last" id="feedback"> + <div id="feedbackbox"> + <p style="text-align: center;">Tell us what you + think of EtherPad!<br/>(Include your email if you want a response)</p> + <div id="formbox"> + <textarea rows="5" cols="10" id="feedbackarea" name="feedbackarea"></textarea> + <input id="feedbacksubmit" type="submit" + value="Send to EtherPad Team" /> + </div> + </div> + <div id="feedbackresult"> + <p>Thanks for the feedback! Keep it coming.</p> + <p>You can also send feedback by email to + <span id="feedbackemail" + style="white-space: nowrap;">feedback@e***rp**d.com</span> to receive a personal + response.</p> + </div> + </div> + </div> + </td> + </tr> +</table> +</div><!-- #padtablediv --> + +<div style="clear: both;"><!-- --></div> + +<% if (request.params.djs) { %> + <div id="djs"> </div> +<% } %> + +<div id="appjetfooter"> + Powered by <a target="_blank" href="/ep/about/appjet">AppJet</a> + <img id="plane" src="/static/img/tinyplane.gif" alt="AppJet" /> +</div><!-- /appjetfooter --> + +<form id="reconnect" + method="post" + action="/ep/pad/reconnect" + accept-charset="UTF-8" + style="display: none;"> + <input type="hidden" id="padId" name="padId" /> + <input type="hidden" id="diagnosticInfo" + name="diagnosticInfo" /> + <input type="hidden" id="missedChanges" name="missedChanges" /> +</form> + +<form id="newpad" + name="newpad" + action="/ep/pad/newpad" + target="_blank" + style="display: none;"> +</form> diff --git a/etherpad/src/themes/default/templates/pro-help/pro-help-template.ejs b/trunk/etherpad/src/templates/pad/padfull_body.ejs index 9cc8205..5f85b4e 100644 --- a/etherpad/src/themes/default/templates/pro-help/pro-help-template.ejs +++ b/trunk/etherpad/src/templates/pad/padfull_body.ejs @@ -10,15 +10,23 @@ 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. */ %><% helpers.includeJQuery() %> -<% helpers.includeJs("etherpad.js") %> -<% helpers.includeCss("pro-help.css") %> - -<div class="fpcontent"> - <div class="pro-help"> - <%= renderContent() %> - </div> +limitations under the License. */ %><div id="padfullpage" class="fpcontent"> + +<h1>Pad is Full!</h1> + +<div id="msg"> + +<div id="padurlwrap"> +<p><tt id="padurl">http://<%= request.host %>/<%= padId %></tt></p> </div> +<p>Sorry, only <%= maxUsersPerPad %> people are allowed to edit a +single pad at the same time in the free version of EtherPad.</p> +<p>Please see our <a href="http://pad.spline.inf.fu-berlin.de/ep/about/pricing">pricing plans</a> for +information about having more than <%= maxUsersPerPad %> +collaborators.</p> +</div> + +</div> diff --git a/trunk/etherpad/src/templates/pro/admin/pne-license-manager.ejs b/trunk/etherpad/src/templates/pro/admin/pne-license-manager.ejs new file mode 100644 index 0000000..42594b8 --- /dev/null +++ b/trunk/etherpad/src/templates/pro/admin/pne-license-manager.ejs @@ -0,0 +1,132 @@ +<% /* Copyright 2009 Google Inc. + +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. */ %><% helpers.setHtmlTitle("EtherPad PNE License Manager"); %> +<% helpers.includeJQuery() %> +<% helpers.includeJs("etherpad.js") %> + +<div id="lm"> + + <% if (isExpired) { %> + + <div class="lm-error-msg"> + <p>Your evaluation license has expired!</p> + <p>Please contact <%= helpers.oemail("sales") %> or visit the <a + href="http://pad.spline.inf.fu-berlin.de/ep/about/pricing-eepnet">pricing page on pad.spline.inf.fu-berlin.de</a> + to purchase a license key.</p> + </div> + + <% } %> + + <% if (isTooOld) { %> + + <div class="lm-notice-msg"> + <p>The version of EtherPad you are running (<%= runningVersionString %>) is too old. + Please update to version <%= licenseVersionString %> or newer by <a + href="http://pad.spline.inf.fu-berlin.de/ep/store/eepnet-download">downloading the latest version on + pad.spline.inf.fu-berlin.de</a>.</p> + </div> + + <% } %> + + <% if (errorMessage) { %> + <div class="lm-error-msg"> + <p><%= errorMessage %></p> + </div> + <% } %> + + <% if (licenseInfo && !edit) { %> + + <h3 class="top">License Info:</h3> + + <div id="lm-status"> + <table> + <tr> + <td width="1%" align="right">Licensed To: </td> + <td width="99%"><b><%= licenseInfo.personName %></b></td> + </tr> + + <tr> + <td align="right">Organization: </td> + <td><b><%= licenseInfo.organizationName %></b></td> + </tr> + + <tr> + <td align="right">Software Edition: </td> + <td><b><%= licenseInfo.editionName %></b></td> + </tr> + + <tr> + <td align="right">Maximum Users: </td> + <td><b><%= licenseInfo.userQuota %></b></td> + </tr> +<!-- + <tr> + <td align="right">Licensed PNE Version: </td> + <td><b><%= licenseVersionString %>+</b></td> + </tr> +--> + <tr> + <td align="right">Expires: </td> + <td><b><%= licenseInfo.expiresDate ? licenseInfo.expiresDate.toString() : "never" %></b></td> + </tr> + </table> + + </div> + + <div id="lm-edit-button-wrap"> + <form action="<%= request.path %>edit" method="get"> + <input type="submit" name="btn" value="Edit License Info" /> + </form> + </div> + + <% } %> + + <% if (isExpired || !licenseInfo || edit) { %> + + <h3 class="top">Enter New License Info:</h3> + + <% if (isUnlicensed) { %> + <p>Before you can use this copy of EtherPad Private Network Edition, you must first + enter a valid license. Free trial licenses can be obtained <a + target="_blank" + href="https://pad.spline.inf.fu-berlin.de/ep/store/eepnet-eval-signup">obtained here</a>. + </p> + <% } %> + + <form action="<%= request.path %>" method="post"> + <div id="lm-edit"> + + <p><b>Name:</b></p> + <input style="width: 100%;" type="text" name="personName" + value="<%= toHTML(oldData.personName || "") %>" /> + + <p><b>Organization:</b></p> + <input style="width: 100%;" type="text" name="orgName" + value="<%= toHTML(oldData.orgName || "") %>" /> + + <p><b>License Key:</b></p> + <textarea style="width: 100%; height: 60px;" + name="licenseString"><%= toHTML(oldData.licenseString || "") %></textarea> + + </div> + + <div id="lm-edit-submit-wrap"> + <input type="submit" name="submit" value="Submit" /> + <input type="submit" name="cancel" value="Cancel" /> + </div> + </form> + + <% } %> + +</div><!-- /lm --> + |