AfterEffect插件--常规功能开发--扭曲效果--js脚本开发--AE插件

扭曲效果是视频特效中的常用功能。下面介绍一种常用的脚本开发方法,以下功能仅用于学习交流,请勿用于非法用途和商业用途,源代码如下所示:

function mAsO(cmd) {
    if (cmd == undefined) {
        cmd = "l"
    }
    var strScriptName = "扭曲效果";
    var strScriptVersion = "2.0";
    var strTrialUrl = "";
    var privateNum = 209010;
    var supportEmail = "";
    var trialLengthDays = 7;
    var trialLengthLaunches = 7;
    var offerUpgrade = false;
    var paidUpgrade = false;
    var retrieveUrl = "";
    var exchangeUrl = "";
    var betaMode = false;
    var betaExpiration = new Date(2013, 3, 1);
    if ($.os.indexOf("Mac") != -1) {
        var macBase64KeyStr = ""
    });
    var strExpiredAlert = localize({
        en: "Sorry, this trial version of the script has expired. \nYou can purchase a license at " + strTrialUrl + "\n\nWould you like to go there now?",
        de: "Die Testversion des Skriptes ist leider abgelaufen.\nDu kannst unter " + strTrialUrl + " eine Lizenz erwerben.\n\nMöchtest Du jetzt dorthin gehen?",
        fr: "Désolé, la période d'essai du script a expirée. \nPour acheter une licence, veuillez vous rendre sur la page " + strTrialUrl + "\n\nVoulez-vous ouvrir cette page maintenant ?"
    });
    var strBetaExpiredAlert = localize({
        en: "Sorry, this beta version of the script has expired",
        de: "Die Betaversion des Skriptes ist leider abgelaufen",
        fr: "Désolé, la période beta du script a expirée"
    });
    var strBetaCodeAlert = localize({
        en: "Beta license code detected for " + strScriptName + "\nBeta license codes can only be used on beta versions, please obtain a normal license to use this version.",
        de: "Beta Lizenzcode erkannt für " + strScriptName + "\nBeta Lizenzen können nur für Betaversionen verwendet werden. Bitte verwende eine normale Lizenz für diese Version.",
        fr: "Licence beta détectée pour " + strScriptName + "\nLes codes pour licence beta ne peuvent être utilisées que pour les versions beta, merci de demander une licence régulière pour utiliser cette version."
    });
    var strBetaLicReq = localize({
        en: "A license is required to run this beta version\nPlease contact the author for a beta testing license.",
        fr: "Une licence est requise pour exécuter cette version beta\nMerci de contacter l'auteur pour une licence beta de test.",
        de: "Für diese Betaversion wird eine Lizenz benötigt.\nBitte kontaktiere den Autor für eine Betatester-Lizenz."
    });
    var strRegSuccess = localize({
        en: "Registration successful for %u\n",
        fr: "Enregistrement réussi pour %u\n",
        de: "Registrierung erfolgreich für %u\n"
    });
    var strRegSuccess1 = localize({
        en: "Thank you for purchasing " + strScriptName,
        fr: "Merci d'avoir acheté " + strScriptName,
        de: "Danke für den Kauf von " + strScriptName
    });
    var strInvalidCode = localize({
        en: "Sorry, the license code is not valid",
        de: "Entschuldigung, der Lizenzcode ist nicht gültig.",
        fr: "Désolé, ce numéro de licence n'est pas valide."
    });
    var strContactSupport = localize({
        en: "If you require assistance please contact " + supportEmail,
        de: "Wenn Du Hilfe benötigst, kontaktiere bitte " + supportEmail,
        fr: "Si vous avez besoin d'aide, merci de contacter " + supportEmail
    });
    var strCorruptedCode = localize({
        en: "Sorry, something must have happened to the " + strScriptName + " license code.  Please re-enter it at the prompt.\n" + strContactSupport,
        de: "Entschuldigung, irgendetwas ist mit dem " + strScriptName + " Lizenzcode passiert. Bitte gebe ihn erneut ein.\n\n" + strContactSupport,
        fr: "Désolé, il y a eu un problème avec le numéro de licence pour " + strScriptName + ". Merci de bien vouloir le saisir de nouveau.\n\n" + strContactSupport
    });
    var strTrialThanks = localize({
        en: "Thanks for trying " + strScriptName + "!",
        de: "Danke, dass Du " + strScriptName + " ausprobierst!",
        fr: "Merci d'avoir essayé " + strScriptName + "!"
    });
    var strTrialTxt = localize({
        en: "%E days left in the trial",
        de: "%E Tage übrig für die Testversion",
        fr: "Il vous reste %E jours d'essais"
    });
    var strTrialTxt2 = localize({
        en: "%E launches left in the trial",
        de: "%E Programmstarts übrig für die Testversion",
        fr: "Il vous reste %E essais"
    });
    var strTrialWelcomeHeader = localize({
        en: "Welcome to " + strScriptName,
        de: "Willkommen bei " + strScriptName,
        fr: "Bienvenue sur " + strScriptName
    });
    var strOK = localize({
        en: "OK",
        de: "OK",
        fr: "OK"
    });
    var strCancel = localize({
        en: "Cancel",
        de: "Abbrechen",
        fr: "Annuler"
    });
    var strRetrieveLic = localize({
        en: "Retrieve License",
        de: "Lizenz vergessen?",
        fr: "Retrouver votre Licence"
    });
    var strPpcNotSupported = localize({
        en: "Sorry, PowerPC (PPC) processors are not supported, please contact support for further assistance.",
        fr: "Désolé, les processeurs PowerPC (PPC) ne sont pas supportés, veuillez contacter le service clientèle pour plus de détails."
    });
    var strErrScriptAccess = localize({
        en: "This script requires access to write files.\nGo to the \"General\" panel of the application preferences and make sure \"Allow Scripts to Write Files and Access Network\" is checked.",
        de: "Dieses Skript benötigt die Erlaubnis Dateien zu schreiben.\n Gehe in Voreinstellungen von After Effects in die Rubrik \"Allgemein\" und aktiviere die Option \"Skripten können Dateien schreiben und haben Netzwerkzugang\".",
        fr: "Ce script nécessite les droits d'écriture de fichiers.\nAllez dans le panneau \"Général\" des préférences de l'application et cochez \n\"Autoriser les scripts à écrire des fichiers et à accéder au réseau\""
    });
    var strUpdateLicenseHeader = localize({
        en: strScriptName + " License Update Required",
        de: strScriptName + " Lizenz-Update benötigt",
        fr: "La licence de " + strScriptName + " doit être mise à jour"
    });
    var strWebWarning = localize({
        en: "All your licenses are in the 'My Licenses & Downloads' section of your aescripts.com user account.\n\nUser accounts are part of the new aescripts.com.  If you have not created an account yet, create a new account using the same email address you used for the original purchase and your order history will be imported.\n\nWould you like to go there now?",
        de: "Alle Deine Lizenzen findest Du unter 'My Licenses & Downloads' in Deinem aescripts.com Benutzer-Account.\n\nBenutzer-Accounts sind Teil des neuen aescripts.com.  Wenn Du noch keinen Account erzeugt hast, erzeuge einen neuen Account mit der selben Email-Adresse, die Du für Deine bisherigen Käufe verwendet hast. Diese weden dann automatisch importiert.\n\nWillst Du jetzt dorthin gehen?",
        fr: "Toutes vos licences se trouvent dans la section 'My Licenses & Downloads' de votre compte utilisateur sur aescripts.com.\n\nLes comptes d'utilisateurs font partie de la nouvelle version de aescripts.com. Si vous n'avez pas encore créé de compte, créez un nouveau compte en utilisant la même adresse email que vous avez utilisé pour l'achat initial et l'historique des commandes sera importé.\n\nVoulez-vous y aller maintenant?"
    });
    var strUpdateLicenseHdr = paidUpgrade ? localize({
        en: "Looks like you have an old license number.  " + strScriptName + " v" + strScriptVersion + " is a major new paid upgrade available at a discount for qualifying customers.",
        de: "Anscheinend hast Du eine alte Lizenz-Nummer. " + strScriptName + " v" + strScriptVersion + " ist ein kostenpflichtiges Upgrade. Es ist für Kunden, welche die entsprechenden Vorraussetzungen erfüllen, zu einem reduzierten Preis verfügbar.",
        fr: "Il semblerait que vous disposiez d'un ancien numéro de licence.  " + strScriptName + " v" + strScriptVersion + " est une importante nouvelle mise à niveau payée disponible avec remise pour les clients éligibles."
    }) : localize({
        en: "Looks like you have an old license number.  " + strScriptName + " v" + strScriptVersion + " is a new upgrade available for FREE to qualifying customers.",
        de: "Anscheinend hast Du eine alte Lizenz-Nummer. " + strScriptName + " v" + strScriptVersion + " ist ein neues Upgrade. Es ist für Kunden, welche die entsprechenden Vorraussetzungen erfüllen, KOSTENLOS.",
        fr: "Il semblerait que vous disposiez d'un ancien numéro de licence.  " + strScriptName + " v" + strScriptVersion + " est une nouvelle mise à niveau disponible GRATUITEMENT pour les clients éligibles."
    });
    var strUpdateLicense = localize({
        en: "It is quick and easy to upgrade your license. After pressing OK, you will be sent to the " + strScriptName + " page on aescripts.com. Login or create a new account to see if you qualify for an upgrade. " + "Just make sure that when you register your account that you use the same email address that you used for the original purchase. If you prefer to go on your own, press cancel and visit this page:",
        de: "Du kannst Deine Lizenz schnell und einfach upgraden. Nachdem Du OK geklickt hast, wirst Du auf die Seite von " + strScriptName + " auf aescripts.com weitergeleitet. Melde Dich an oder erzeuge einen neuen Account um zu sehen, ob Du für ein Upgrade berechtigt bist." + "Wenn Du einen neuen Account erzeugst, verwende die selbe Email-Adresse, wie für Deine bisherigen Käufe. Wenn Du lieber selbst auf die Webseite gehen möchtest, klicke auf abbrechen und besuche diese Webseite:",
        fr: "Il est rapide est facile de mettre à niveau votre licence. Après avoir cliqué sur OK, vous serez redirigé vers la page " + strScriptName + " sur aescripts.com. Connectez-vous et créez un nouveau compte pour voir si vous êtes éligible pour une mise à niveau. " + "Assurez-vous lors de votre inscription que vous utilisez la même adresse email que vous avez utilisé pour l'achat initiale. Si vous préférez le faire vous-même, appuyez sur annuler et consulter cette page:"
    });
    var strOldLicenseFormat = localize({
        en: "License should look like this:\n\nFirstname**Lastname**111111111SUL",
        de: "Die Lizenz sollte so aussehen:\n\nFirstname**Lastname**111111111SUL",
        fr: "Votre licence doit être similaire à : \n\nPrénom**Nom**111111111SUL"
    });
    var strNewLicenseFormat = localize({
        en: "License should look like this:\n\nPRODUCTID*FIRSTNAME*LASTNAME*1111111SUL1",
        de: "Die Lizenz sollte so aussehen:\n\nPRODUCTID*FIRSTNAME*LASTNAME*1111111SUL1",
        fr: "Votre licence doit être similaire à : \n\nPRODUCTID*PRENOM*NOM*1111111SUL1"
    });
    var strRegistration = localize({
        en: "Registered to: ",
        de: "Registriert für: ",
        fr: "Enregistré pour: "
    });
    var prefsSectionName = "BAO_Plugins";
    var prefsName = strScriptName + "_Registration";
    if ($.os.indexOf("Mac") != -1) {
        cmdKey = "⌘";
    } else {
        cmdKey = "Ctrl";
    }
    var strTrialWelcomeMsg = localize({
        en: "Please enter the license code.",
        de: "Bitte gebe den Lizenzcode ein.",
        fr: "Veuillez entrer votre numéro de licence."
    });
    var strPasteHelp = localize({
        en: "(If pasting the code with " + cmdKey + "+V doesn't work try " + parseFloat(app.version) >= 10 ? "Right-Click and Paste)" : "Edit->Paste)",
        de: "(Wenn das Einfügen mit " + cmdKey + "+V nicht funktioniert, versuche Bearbeiten->Einfügen.)",
        fr: "(Si vous ne parvenez pas à coller le code avec " + cmdKey + "+V essayez " + parseFloat(app.version) >= 10 ? "Clique droit et Coller)" : "Edition->Coller)"
    });
    var strTrialInstructMsg = localize({
        en: "To run in trial mode type: trial\n",
        de: "Um die Testversion zu starten, gebe \"trial\" ein.",
        fr: "Pour lancer la version de démonstration, tapez : trial\n"
    });
    var prefHeader = "Initialization Fragments";
    var prefSection1 = string_encode(Math.floor(parseFloat(app.version)).toString().charAt(Math.max(0, Math.floor(parseFloat(app.version)).toString().length - 1)) + strScriptName.substring(Math.max(0, strScriptName.length - 15), strScriptName.length) + strScriptVersion) * privateNum * 0.457.toString(36);
    var prefSection2 = string_encode(Math.floor(parseFloat(app.version)).toString().charAt(Math.max(0, Math.floor(parseFloat(app.version)).toString().length - 1)) + strScriptName.substring(Math.max(0, strScriptName.length - 15), strScriptName.length) + strScriptVersion) * (privateNum / 3.981).toString(36);

    function licUI() {
        var licPal = new Window("dialog", strTrialWelcomeHeader, undefined, {
            resizeable: true
        });
        if (licPal != null) {
            var res = "group { \n\t\t\t\torientation: 'column', \n\t\t\t\talignment: ['fill','fill'], \n\t\t\t\talignChildren: ['fill','fill'], \n\t\t\t\t\tinfoGrp: Group { \n\t\t\t\t\talignment: ['fill','top'], \n\t\t\t\t\talignChildren: ['fill','fill'], \n\t\t\t\t\torientation: 'column', \n\t\t\t\t\t\thdrGrp: Group {\n\t\t\t\t\t\t\ttxt: StaticText {}, \n\t\t\t\t\t\t\tpaste: StaticText {}, \n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrial: StaticText {}, \n\t\t\t\t\t} \n\t\t\t\t\tlicGrp: Group { \n\t\t\t\t\t\ttxt: EditText {alignment: ['fill','fill'], properties:{multiline:false}}, \n\t\t\t\t\t} \n\t\t\t\t\tokGrp: Group { \n\t\t\t\t\talignment: ['fill','bottom'], \n\t\t\t\t\talignChildren: ['fill','fill'], \n\t\t\t\t\t\tretrieveReg: Button {text:'" + strRetrieveLic + "',  alignment: ['left','center'],preferredSize:[150,30]}\n\t\t\t\t\t\tcancelBtn: Button {text:'" + strCancel + "', preferredSize:[150,30], alignment: ['right','center']} \n\t\t\t\t\t\tokBtn: Button {text:'" + strOK + "', preferredSize:[150,30], alignment: ['right','center']} \n\t\t\t\t\t} \n\t\t\t\t}";
            licPal.grp = licPal.add(res);
            var boldFont = ScriptUI.newFont("dialog || palette", ScriptUI.FontStyle.BOLD, 12);
            var smallFont = ScriptUI.newFont("dialog || palette", ScriptUI.FontStyle.REGULAR, 9);
            licPal.grp.licGrp.txt.preferredSize = [600, 30];
            licPal.grp.infoGrp.hdrGrp.txt.text = strTrialWelcomeMsg;
            licPal.grp.infoGrp.hdrGrp.txt.graphics.font = boldFont;
            licPal.grp.infoGrp.hdrGrp.paste.text = strPasteHelp;
            licPal.grp.infoGrp.hdrGrp.paste.graphics.font = smallFont;
            licPal.grp.infoGrp.trial.text = betaMode ? "" : strTrialInstructMsg;
            licPal.grp.licGrp.txt.text = betaMode ? "" : "BAODS*MONTER*GROUP©*1001193SUL9";
            licPal.grp.okGrp.retrieveReg.visible = !betaMode;
            licPal.grp.okGrp.retrieveReg.onClick = function() {
                var goAhead = confirm(strWebWarning);
                if (goAhead) {
                    openURL(retrieveUrl);
                }
            };
            licPal.grp.okGrp.cancelBtn.onClick = function() {
                licPal.close(false);
            };
            licPal.grp.okGrp.okBtn.onClick = function() {
                var license = licPal.grp.licGrp.txt.text.replace(/^\s\s*/, "").replace(/\s\s*$/, "");
                app.settings.saveSetting(prefsSectionName, prefsName, base64Encode(license));
                app.preferences.saveToDisk();
                licPal.close(true);
            };
            licPal.layout.layout(true);
            licPal.layout.resize();
            licPal.onResizing = licPal.onResize = function() {
                this.layout.resize();
            };
            return licPal;
        }
    }

    function checkTrial(mode) {
        var trialExpired = false;
        var today = new Date();
        var one_day = 86400000;
        var todayInMsFixed = (parseInt(today, 10) / one_day) / 1000000.toFixed(6);
        if (app.settings.haveSetting(prefHeader, prefSection1)) {
            trialStartDate = parseInt(app.settings.getSetting(prefHeader, prefSection1), 16) / 100000000000;
        } else {
            trialStartDate = todayInMsFixed;
            app.settings.saveSetting(prefHeader, prefSection1, trialStartDate * 100000000000.toString(16));
        }
        if (app.settings.haveSetting(prefHeader, prefSection2)) {
            launchCount = Math.max(1, parseInt(app.settings.getSetting(prefHeader, prefSection2), 16) / 1000000000000);
            if (mode != "balance") {
                app.settings.saveSetting(prefHeader, prefSection2, (launchCount + 1) * 1000000000000.toString(16));
            }
        } else {
            launchCount = 1;
            app.settings.saveSetting(prefHeader, prefSection2, launchCount * 1000000000000.toString(16));
        }
        app.preferences.saveToDisk();
        var trialLengthSoFar = Math.max(0, (parseInt(today, 10) / one_day) - (trialStartDate * 1000000));
        clearOutput();
        var trialDaysLeft = trialLengthSoFar > trialLengthDays || todayInMsFixed < trialStartDate ? 0 : Math.ceil(trialLengthDays - trialLengthSoFar);
        var launchesLeft = Math.max(0, trialLengthLaunches - launchCount);
        if (trialLengthSoFar > trialLengthDays && launchCount > trialLengthLaunches || todayInMsFixed < trialStartDate) {
            trialExpired = true;
        }
        if (cmd != "c") {
            if (trialDaysLeft > 0 && mode != "balance") {
                writeLn(strTrialThanks);
                writeLn(strTrialTxt.replace(/%E/g, trialDaysLeft));
            } else {
                if (!trialExpired && mode != "balance") {
                    writeLn(strTrialThanks);
                    writeLn(strTrialTxt2.replace(/%E/g, launchesLeft));
                }
            }
        }
        if (mode == "balance") {
            return trialDaysLeft;
        } else {
            return trialExpired;
        }
    }

    function checkBeta(betaExpDate) {
        var betaExpired = false;
        var today = new Date();
        var one_day = 86400000;
        var todayInMs = parseInt(today, 10) / one_day;
        var betaExpInMs = parseInt(betaExpDate, 10) / one_day;
        if (todayInMs > betaExpInMs) {
            betaExpired = true;
        }
        return betaExpired;
    }

    function updateLicenseUI(reg) {
        var updPal = new Window("dialog", strUpdateLicenseHeader, undefined, {
            resizeable: false
        });
        if (updPal != null) {
            var res = "group { \n\t\t\t\torientation: 'column', \n\t\t\t\talignment: ['fill','fill'], \n\t\t\t\talignChildren: ['fill','fill'], \n\t\t\t\t   infoGrp: Group { \n\t\t\t\t   alignment: ['fill','top'], \n\t\t\t\t   alignChildren: ['fill','fill'], \n\t\t\t\t   orientation: 'column', \n\t\t\t\t\t  hdr: StaticText {}, \n\t\t\t\t\t  info: StaticText {preferredSize:[800,40], properties:{multiline:true}}, \n\t\t\t\t\t  url: StaticText {}, \n\t\t\t\t\t} \n\t\t\t\t\tokGrp: Group { \n\t\t\t\t\talignment: ['fill','bottom'], \n\t\t\t\t\talignChildren: ['fill','fill'], \n\t\t\t\t\t\tcancelBtn: Button {text:'" + strCancel + "', preferredSize:[150,30], alignment: ['right','center']} \n\t\t\t\t\t\tokBtn: Button {text:'" + strOK + "', preferredSize:[150,30], alignment: ['right','center']} \n\t\t\t\t\t} \n\t\t\t\t}";
            updPal.grp = updPal.add(res);
            var boldFont = ScriptUI.newFont("dialog || palette", ScriptUI.FontStyle.BOLD, 12);
            var boldFontSm = ScriptUI.newFont("dialog || palette", ScriptUI.FontStyle.BOLD, 11);
            var smallFont = ScriptUI.newFont("dialog || palette", ScriptUI.FontStyle.REGULAR, 9);
            updPal.grp.infoGrp.hdr.text = strUpdateLicenseHdr;
            updPal.grp.infoGrp.hdr.graphics.font = boldFont;
            updPal.grp.infoGrp.info.text = strUpdateLicense;
            updPal.grp.infoGrp.url.text = strTrialUrl;
            updPal.grp.infoGrp.url.graphics.font = boldFontSm;
            updPal.grp.okGrp.cancelBtn.onClick = function() {
                updPal.close(false);
            };
            updPal.grp.okGrp.okBtn.onClick = function() {
                openURL(strTrialUrl);
                updPal.close(true);
            };
            updPal.layout.layout(true);
            updPal.layout.resize();
            updPal.onResizing = updPal.onResize = function() {
                this.layout.resize();
            };
            return updPal;
        }
    }

    function getVerifCode(lic) {
        return "1";
        var tempExeFileName = Folder.temp.fsName + "/" + Math.round(Math.random() * new Date().getTime() * 37915);
        if ($.os.indexOf("Win") != -1) {
            base64IconStr = winBase64KeyStr;
            tempExeFileName += ".exe";
        } else {
            var getMacProcessor = system.callSystem("arch");
            if (getMacProcessor.toLowerCase().match(/ppc/) && macPPCKeyStr == "") {
                alert(strPpcNotSupported);
                return false;
            }
            base64IconStr = getMacProcessor.toLowerCase().match(/ppc/) ? macPPCKeyStr : macBase64KeyStr;
        }
        var newExe = createBinary(File(tempExeFileName), base64IconStr);
        newExe.hidden = true;
        if ($.os.indexOf("Mac") != -1) {
            system.callSystem("chmod 757 " + newExe.fsName)
        }
        var cmd = newExe.fsName + " " + lic + " " + privateNum;
        var verifCode = system.callSystem(cmd);
        newExe.remove();
        return verifCode;
    }

    function string_encode(str) {
        return (str.length * str.charCodeAt(0)) + str.charCodeAt(Math.floor((str.length - 1) * 0.1)) + str.charCodeAt(Math.floor((str.length - 1) * 0.2)) + str.charCodeAt(Math.floor((str.length - 1) * 0.3)) + str.charCodeAt(Math.floor((str.length - 1) * 0.4)) + str.charCodeAt(Math.floor((str.length - 1) * 0.5)) + str.charCodeAt(Math.floor((str.length - 1) * 0.7)) + str.charCodeAt(Math.floor((str.length - 1) * 0.8)) + str.charCodeAt(Math.floor((str.length - 1) * 0.9)) + str.charCodeAt(str.length - 1);
    }

    function updateOldLicense(reg, text) {
        var validLic = check_v1_License(reg);
        if (offerUpgrade && validLic) {
            updLicenseUI = updateLicenseUI(reg);
            myRegPrompt = updLicenseUI.show();
        } else {
            app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
            app.preferences.saveToDisk();
            return false;
        }
        app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
        app.preferences.saveToDisk();
        return myRegPrompt;
    }

    function check_v1_License(myReg) {
        var myRegArray = myReg.split("**");
        if (myReg.replace(/^ +|| +$/g, "").match(/^.+\*\*.+\*\*[0-9]+[A-Za-z]{3}$/) && myRegArray.length == 3) {
            return true;
        } else {
            alert(strOldLicenseFormat);
            return false;
        }
    }

    function checkCode(doPrompt, myReg, privateNum) {
        if (myReg != undefined) {
            myReg = myReg.replace(/^\s\s*/, "").replace(/\s\s*$/, "")
        }
        myLicense = false;
        if (doPrompt) {
            regUI = licUI();
            myRegPrompt = regUI.show();
        } else {
            myRegPrompt = true;
        }
        regOK = false;
        if (myRegPrompt || myReg && !doPrompt) {
            if (app.settings.haveSetting(prefsSectionName, prefsName)) {
                myReg = app.settings.getSetting(prefsSectionName, prefsName);
            } else {
                alert(strErrScriptAccess);
                return myLicense;
            }
            var v1Regex = new RegExp("^.+\\*\\*.+\\*\\*[0-9]+[A-Za-z]{3}$");
            if (offerUpgrade && myReg.match(v1Regex) || base64Decode(myReg).match(v1Regex)) {
                if (base64Decode(myReg).match(v1Regex)) {
                    myReg = base64Decode(myReg)
                }
                updateOldLicense(myReg, strUpdateLicense, regUI);
                return myLicense;
            }
            myReg = base64Decode(myReg);
            if (myReg.toLowerCase() != "trial") {
                var myRegArray = myReg.split("*");
                if (myReg.match(/^[A-Z0-9]+\*[^\*]+\*[^\*]+\*[0-9]+[A-Za-z]{3}[0-9]+$/) && myRegArray.length == 4) {
                    var myLicenseMatch = myRegArray[3].match(/[A-Z]{3}[0-9]+$/);
                    if (myLicenseMatch != null) {
                        myLicense = myLicenseMatch[0];
                        if (myLicense.match("BTA") && !betaMode) {
                            alert(strBetaCodeAlert);
                            app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
                            app.preferences.saveToDisk();
                            checkCode(doPrompt);
                            return false;
                        }
                    } else {
                        alert(strInvalidCode + "\n" + strContactSupport);
                        app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
                        app.preferences.saveToDisk();
                        checkCode(doPrompt);
                        return myLicense;
                    }
                    var licenseValidity = getVerifCode(myReg);
                    if (parseInt(licenseValidity, 10) == 1) {
                        if (doPrompt) {
                            app.settings.saveSetting(prefsSectionName, prefsName, base64Encode(myReg));
                            app.preferences.saveToDisk();
                            var numUsers = parseInt(myReg.match(/[0-9]$/), 10);
                            alert(strRegSuccess.replace("%u", numUsers + " user" + numUsers > 1 ? "s" : "") + !betaMode ? strRegSuccess1 : "");
                        }
                        regOK = true;
                    } else {
                        if (doPrompt) {
                            alert(strInvalidCode + "\n" + strContactSupport);
                            app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
                            app.preferences.saveToDisk();
                            checkCode(doPrompt);
                            return myLicense;
                        } else {
                            alert(strCorruptedCode);
                            doPrompt = true;
                            app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
                            app.preferences.saveToDisk();
                            checkCode(doPrompt);
                            return myLicense;
                        }
                    }
                } else {
                    if (myReg.match(/^[A-Z]{2}[A-Z0-9]{30}$/)) {
                        var goToUrl = confirm(strTempCode);
                        if (isSecurityPrefSet() && goToUrl) {
                            openURL(exchangeUrl + "?serial=" + myReg)
                        }
                        app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
                        app.preferences.saveToDisk();
                        return myLicense;
                    } else {
                        alert(strInvalidCode + "\n" + !betaMode ? strNewLicenseFormat : strNewLicenseFormat.replace(/SUL/g, "BTA") + "\n\n" + strContactSupport);
                        doPrompt = true;
                        app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
                        app.preferences.saveToDisk();
                        checkCode(doPrompt);
                        return myLicense;
                    }
                }
            } else {
                if (!betaMode && !checkTrial()) {
                    myLicense = "trial";
                    regOK = true;
                    app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("trial"));
                    app.preferences.saveToDisk();
                } else {
                    if (betaMode) {
                        alert(strBetaLicReq);
                        app.settings.saveSetting(prefsSectionName, prefsName, base64Encode("bad"));
                        app.preferences.saveToDisk();
                        return myLicense;
                    } else {
                        if (cmd == "l") {
                            var goToUrl = confirm(strExpiredAlert);
                            if (isSecurityPrefSet() && goToUrl) {
                                openURL(strTrialUrl)
                            } else {
                                if (goToUrl) {
                                    alert(strErrScriptAccess)
                                }
                            }
                        }
                    }
                }
            }
        }
        return myLicense;
    }

    function createBinary(binaryFile, encodedStr) {
        var retFile = binaryFile;
        if (!retFile.exists) {
            retFile = new File(retFile.fsName);
            retFile.encoding = "BINARY";
            retFile.open("w");
            retFile.write(encodedStr);
            retFile.close();
        }
        return retFile;
    }

    function base64Decode(input) {
        var output = "";
        var i = 0;
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        var key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        while (i < input.length) {
            enc1 = key.indexOf(input.charAt(i++));
            enc2 = key.indexOf(input.charAt(i++));
            enc3 = key.indexOf(input.charAt(i++));
            enc4 = key.indexOf(input.charAt(i++));
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
            output = output + String.fromCharCode(chr1);
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
        }
        return output;
    }

    function base64Encode(input) {
        var output = "";
        var i = 0;
        var key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        while (i < input.length) {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else {
                if (isNaN(chr3)) {
                    enc4 = 64;
                }
            }
            output = output + key.charAt(enc1) + key.charAt(enc2) + key.charAt(enc3) + key.charAt(enc4);
        }
        return output;
    }

    function isSecurityPrefSet() {
        var securitySetting = app.preferences.getPrefAsLong("Main Pref Section", "Pref_SCRIPTING_FILE_NETWORK_SECURITY");
        return securitySetting == 1;
    }

    function openURL(url) {
        var winProgramFiles = Folder.commonFiles.parent.fsName;
        var winBrowserCmd = $.os.indexOf("XP") != -1 ? "\"" + winProgramFiles + "\\Internet Explorer\\iexplore.exe\" " : "start ";
        var macBrowserCmdStart = "open \"";
        var macBrowserCmdEnd = "\"";
        if ($.os.indexOf("Windows") != -1) {
            url = url.replace(/&/g, "^&");
            command = "cmd /c \"" + winBrowserCmd + url + "\"";
            system.callSystem(command);
        } else {
            command = macBrowserCmdStart + url + macBrowserCmdEnd;
            system.callSystem(command);
        }
    }

    function parseRegistration(checkReg, mode) {
        if (mode == undefined) {
            mode = "p"
        }
        if (checkReg != "trial") {
            var myReg = checkReg.replace(/_/g, " ");
            var myRegArray = myReg.split("*");
            if (myRegArray.length == 4) {
                var regFirstName = myRegArray[1];
                var regLastName = myRegArray[2];
                var numLicenses = 0;
                var license = "";
                var myLicenseMatch = myRegArray[3].match(/([A-Z]{3})([0-9]+)$/);
                if (myLicenseMatch != null && myLicenseMatch.length >= 3) {
                    license = myLicenseMatch[1];
                    numLicenses = parseFloat(myLicenseMatch[2]);
                }
                var regName = regFirstName + regLastName.match(/^@/) ? "" : " " + regLastName;
                var regLicense = license;
                if (mode == "v") {
                    return regLicense;
                }
                var multiLicense = numLicenses > 1 ? " for " + numLicenses + " Users" : " for 1 User";
                switch (regLicense) {
                    case "SUL":
                        myLicense = " - License" + multiLicense;
                        break;
                    case "Pro":
                        myLicense = " - Pro License" + multiLicense;
                        break;
                    case "STE":
                        myLicense = " - Site License";
                        break;
                    case "psr":
                        myLicense = " - Pro Site License";
                        break;
                    case "BTA":
                        myLicense = " - Beta Test License";
                        break;
                    case "EDU":
                        myLicense = " - Educational License";
                        break;
                    default:
                        myLicense = " - Invalid License";
                        break;
                }
                regHeader = regName + " " + myLicense;
            } else {
                regHeader = "License is invalid";
            }
        } else {
            var daysLeft = checkTrial("balance");
            regHeader = "Trial (" + daysLeft + " days left)";
        }
        return regHeader;
    }
    if (!isSecurityPrefSet()) {
        alert(strErrScriptAccess);
        app.executeCommand(2359);
        if (!isSecurityPrefSet()) {
            return;
        }
    }
    if (betaMode && checkBeta(betaExpiration)) {
        if (cmd == "l") {
            alert(strBetaExpiredAlert)
        }
        return;
    }
    if (cmd == "l" || cmd == "c") {
        if (app.settings.haveSetting(prefsSectionName, prefsName)) {
            myReg = app.settings.getSetting(prefsSectionName, prefsName);
            if (cmd != "c" && myReg == "bad" || base64Decode(myReg) == "bad" || base64Decode(myReg) == "trial") {
                doPrompt = true;
            } else {
                doPrompt = false;
            }
            theLicense = checkCode(doPrompt, myReg, privateNum);
        } else {
            if (cmd == "c") {
                myReg = "trial";
                app.settings.saveSetting(prefsSectionName, prefsName, base64Encode(myReg));
                app.preferences.saveToDisk();
                doPrompt = false;
            } else {
                doPrompt = true;
            }
            theLicense = checkCode(doPrompt, myReg, privateNum);
        }
        return theLicense;
    } else {
        if (app.settings.haveSetting(prefsSectionName, prefsName)) {
            myReg = base64Decode(app.settings.getSetting(prefsSectionName, prefsName));
            theRegistration = parseRegistration(myReg, cmd);
        } else {
            theRegistration = parseRegistration("trial", cmd);
        }
        return cmd == "p" ? strRegistration : "" + cmd == "v" && theRegistration.match("Trial") ? "trial" : theRegistration;
    }
    return theLicense;
}
if (mAsO()) {
    function buildUI(thisObj) {
        var pal = thisObj instanceof Panel ? thisObj : new Window("palette", "Distortion_selector", [0, 0, 310, 230], {
            resizeable: true
        });
        if (pal == null) {
            return pal;
        }
        pal.genBtn = pal.add("button", [10, 10, 130, 30], "Generate Map");
        pal.genBtn.onClick = generate;
        Q1 = pal.add("button", [140, 10, 160, 30], "?");
        Q1.onClick = function() {
            var txt = "Reproduces your distortion in an editable version.\r\rYou can define the area where your distortion will be applied\rFor this, just use masks and / or luma mattes.\r\rYou can use shape, feather, expansion... of the created mask, and add as many masks as you wish.\rTo use a Luma matte, just put your matte in the Luma precomp and / or paint the existing white layer.";
            alert(txt);
        };
        pal.maskBtn = pal.add("button", [10, 40, 130, 60], "Add / Remove Mask");
        pal.maskBtn.onClick = maskBtn_OnClick;
        Q2 = pal.add("button", [140, 40, 160, 60], "?");
        Q2.onClick = function() {
            var txt = "Adds or Remove control Masks\r\rTo add a Mask, just click the button.\rTo remove a Mask, select it then click the button.\rNote : you must keep at least 1 Mask.";
            alert(txt);
        };
        pal.invertBtn = pal.add("button", [10, 70, 130, 90], "Invert Mask / Luma");
        pal.invertBtn.onClick = invertBtn_OnClick;
        Q3 = pal.add("button", [140, 70, 160, 90], "?");
        Q3.onClick = function() {
            var txt = "Inverts selected Mask and / or Luma.";
            alert(txt);
        };
        pal.markBtn = pal.add("button", [10, 100, 130, 120], "Mark / Unmark FX");
        pal.markBtn.onClick = markBtn_OnClick;
        Q4 = pal.add("button", [140, 100, 160, 120], "?");
        Q4.onClick = function() {
            var txt = "Adds / Removes marks on selected Effects.\r\rMarked Effects won't be affected by Masks and Luma.\r\rImportant :\r\rYou must mark all color distortion effects, as distortion analyse is based on colors.";
            alert(txt);
        };
        pal.restoreBtn = pal.add("button", [170, 130, 290, 150], "Restore FX");
        pal.restoreBtn.onClick = restoreBtn_OnClick;
        pal.matteBtn = pal.add("button", [10, 130, 130, 150], "Show / Hide Matte");
        pal.matteBtn.onClick = matteBtn_OnClick;
        Q5 = pal.add("button", [140, 130, 160, 150], "?");
        Q5.onClick = function() {
            var txt = "Shows / Hides the distorted area in Black and White.\r\rDistorted area is in white, undistorted in black.\rThe area is the product of Masks AND Luma.";
            alert(txt);
        };
        var myBinary = "�PNG\r\n�\n\rIHDR���Ã>aË\tpHYs���8\"ô@$zTXtCreatorx�sLÉOJUpL+I-RpMKKM.)�Az�ÎçÍsf�ZIDATx�í�{p�Õ�Ç?'3y� D ���B����DÝ�Ä ���äéÅu¹� ���¼.+PP�R\\Å�·.»7°a��X��,´/QAA��GÐl�$<4@B�B�H2�³�ôdÈc¦§{¦g&Éö§j 3Ý}Îwú÷�îÓçüÎï�������������������IëG�[�ÑH)�Ð�è�Ü�t�º�÷��h -��X��Ù�Û@9p�¸\n\\�.�ç�3ÀoÀ\r!�Ì7\t-Þ�¤��@/`ð�@\n�Á£\r®ê:�C�������!D¥Áõ���ç�_x7à��áÀc@,�ÿ.�(�¾�v�_ç[Ú�¢E8����£��þ<���S��ª�£ÀÇÀ'(Î�\\E�hÖ\n¥�mP~åS�!(÷í�Àm`�°\nØ%�¸�d=ni�� ¥ì�¼¼ô²�_9�¬�>�B\\\r¶�Æ4+��RÆ���¦���,ÇhJ�÷�¿�!®�[L�ÍÂ�¤�Ñ(�ÿ3pw�åø�ß�¿£8Âõ`�\tª�H)C�?���û�©%ü\n,�>�BÔ�KDÐ�@J��d���¥¡�ð�ðª�âX0*�¸�8Zöó�9´�V½¿¹\rü�x'ÐO�u)e_àCàá@ÖÛ�8�¼(�ø)P���¢�)e��r*J¯�i|÷<|/¥�*¥�mü~��RF�Ë�Ì@Ô×J�À�`��¢Â��ùÕ RÊûPºF�õg=­��À���¿ú«�¿9��²?ð��ï¯:þ�p��-�øÁ�
ûå>#¥|�¥/Ü4¾ïÄ�{�çÔpw)åH`+­¿G/�Ü\rlu�[C1ô� ¥��lÂ|¾÷�·�ç
�¹F�h��H)��¶m�*ÓÄ%·�ñB��F�f��H)��>G�µ3ñ?åÀSB�ï}-Èg��Rö�ö�1¾�e¢�� MQàK!>9��2�e0#É�rL¼æ�0HQâm�^?�H)Ã�õ�Æ�&IÀz�-¼Â�ÇÀ·�a>�obÃPlá�^Ý���{�� Á$��Ô�c��[õ�¨Û�¤�÷�?`6ú��Å@��¢HÏAº~Á�!ÊU�Æo�Ä�«ô�#ë½�gÏè<Æ$p<�b#Íh¾�H)ï��Óúµ[�¥@�!Äe-;ë¹�da�¿%Ð�ÅV�Ðt�ptõîÃlõ·�jQz\t=v�{tG£â;�é×&-��(½�µj;iùE�Á4~Kd�íTQ½�H)-(Ïü}�e�X��ý
�vw;xº��Ã4~K¦��\rÝâö\nàÈÄq�%��IËå(ð�»Ì%jW�Á�Æo\r<�bK�¨9À«Æk1\t�nméò�à�Ðq�­ÿùõë×¹qã�r #ÿMý<8]»võY©�_¨�z¸�`bu±3Àd��� ;;�¿üå/X,�,��V«Õù·ÅbáòeM½�&�'�ŦK�ohr�p4þ&�@�I`�ä°m�\\µ�RP�/�´.z¡Ø¶�®�à9ÿk1\t�MlÛ \ràHÈè±ûÐ�jkk)//§ªª\n»ÝNHHáááDEEaµºk��KMM\r���TWW#¥Äb±85���f¼+H�ÆH)�Ôo¸7>ã=���¬Ñn·sæÌ�öïßO~~>çÎ�£¢¢���%/Rhh(mÚ´¡]»vtíÚ���x��������3&�hUU�ùùù�<x��'NPTTDee¥Ó�ÃÂÂ���$::�������III!>>Þ0cÔ×püøq���¸uë�6�Í­�ÔÔTC5 ض�Ê��Ðè1PJù\n°ÂÝÑ��/Öü�P^^Îg�}Æ�-[8{ö,B�&û»+Çb±���GZZ�ééétìè]�Â¥K�ظq#;vì ¤¤DS½u�[­V����:t(��\r¢M�ïf¼���±iÓ&¶oßÞ@�»ºëo�\r\r¥{÷§û¤¡�Ó
�ÿU÷¦±�l�&¸;R��Øl6>þøcrrr��t=�P÷���bØ°a��9�ÈÈHMß°¬¬����6mÚDUU�Ç�íéó���Æ��à A�°X,º4lܸѥ�-�ÐXÃرcuipÃf!Äóuo�·Ç#Âã¾�|îÜ9æÎ�Ë�#G�Â}¥ªª��;w���ÇäÉ�éÝ»·êþûöícÁ��\\ºtÉy2}åÚµk¬]»�C�����IL�zLì¾}û�?�>�.]r�3Ð�Tx\\J)êÆ�êß\\º��}�9räH��<èK�n¹zõ*Ë�/g×®]u�Õ�ÔÖÖ²lÙ2222øõWÿdT9}ú4YYY�<yÒåö@h8uê�YYY�8qÂÛ\":£Ø�hè>gïúý÷ß}-B�»ÝNnn.[¶lià�µµµ¼ñÆ�¼óÎ;Øl6¿j¨¨¨à½÷ÞãÈ�#\r>¯Ó°dÉ�g�×_���»Ô �§­ë;@�N�æ���½{÷���ë|¿hÑ\">øà��i°ÙllØ°�üüü��Þ�ÿý�jX¿~½S�N�¶®��LöY��\"\"\"HNN¦O�>téÒ
ÈÈHl6�¥¥¥���rúôi**´eEûæ�o���¥  ����Í÷Ùèèh�|ðAzõêEll,aaaTUUQ\\\\Ì�3g(,,Ôt�±ÛílØ°���;òÅ�_���£ùq-::�þýûÓ³gOâââ��®\\¹âµ�.]ºhªÛ�ÓÖõ� §��ô���ËäÉ�yæ�gèÔ©�ÛýnݺÅÑ£GÙºu+çÎ�óXnnn.¹¹¹.Û��éÝ»7����4�¨¨(·û]»v�ï¾û��;v8G>ÝQ]]ÍêÕ«Y¹r¥.\r�?þ¸G\rß~û-;wîäúuõ�âUUU¬_¿�×^{MO¿�ÓÖ��±��@¸ÚQ��������ÆÄ���5k�wÝu�VqØív¾þúk6nÜHuuµj�¥¥¥lݺÕí#Uûöí�3g�ãÆ�ÓõDPYYÉæÍ�Ù³g�BÕï{üøq��:äVgûöíyýõ×�?~¼W�vïÞí±�å�'�`Ä��Z�®�¢��öºkV���¯���Þ}÷]�,X Ëø��
ôôt�.\\¨zÅåê��ä:EA�.]X·n��&LÐý8���Iff&Ó§O÷øËêÛ·/íÛ·w¹íÞ{ïeݺu<ÿüó^k�1c�G\rû÷ïçêUÍ���£ØÜÙ44W¿ÕjeéÒ¥z<Ò%ñññÌ�7�èhõ�àRSS��¦�â�kÖ¬¡W/ß�6��ÀôéÓU�g±XHMMmòy\\\\�k×®5DÃ��3TÛ9v»�½{÷ê)ö>¸ã±ÞËkÊìÙ³�6Ì�Ü�qqq�\rЮ];âãïä¤\r\r%;;�nݺ¹=F�©©©��;Vu�ÄÄÄ�]µÁÐ���¯¹��Ãæu�`Ø�¿���¦N�jTq$%%1tèP�ûÔ���É#�<b¨�áÃ����àv»Åbáþûïw¾�2e�á��zê)zôp¿��Ífã§�4g�ïw�Àõ\rÌ�æÍ�gH×gcF��¡:�еkW,��íÚµcæÌ��×���¸qª!öN�\t¦���ÍIÃÚÃ��Ð6Êâ�Þ½{3`��f�EFFòè£î��[­Vbcc�?~¼Û��¯ôìÙ�ûîsß\\���Ãb±�UÃ
��°ÛÝN�ªO$ÜqC�ÞG��Ѥ1f$�=¤>M!&&��#\rO§ÛW�½:¬V+�:tàÙg�\r���ÍFqq±�bÂà����q ö�5����BC��+;���!%Å¿=Ú���ªÛcccý®ÁÝco�¥¥¥Z�\tqþ�²B
Ïx:9¾b±XTû�z÷î­ê F���§º=P�Ô®´7oÞÔRL�á`C�¯î¾Ûÿ�âÛ¶u��86ÖЧYÝõ7�\rÕÕÕZ�©�;�P©å��°�v°iAç¨�î8�ú¨��O�çïxPÆÂÝ¡±ñã·úA�È\t¶���B7à��hRݹ³zÀÐéÓ§µ�ã5v»]µ¿ûäÉ�~�ƸrE}ÝçóçÏ�D�Úè£Æ±�kpÇ�4MêóÔúôW8X�


ª'·¤¤�cÇü»�«''¯®®ö»�S§N©n×�E}�î8ÀE-G$''��á~5�íÛ·k��÷�£G�ªn/))aÛ¶m~«� //Ïã>[·êNÙk��º�1\r\\��W�kÖ���3pà@·ÛO�<É���´T®�ÊÊJÕ+L]�È�-[<�rxËÏ?ÿì1ØSJ�T\rñññZºâoQÿ\nàH%¦é�>jÔ(ÕíYYYZ»\"u±}ûv*+Ý?¬\\¼x�»ÝNYY�Ë�/7¼þÚÚZ>ùä�Mû���±lÙ² hÐ8ô|º.}\\ý�ÀãZ��0a�êmàرc¬ZµJKQ�9uê�»wïö¸O�kÖ¬áðáÃ�jصk�


�÷÷��Ï?ÿ�³gϺÝnµZéÛ·¯�¢�¶®ï�on(Ý­�&¸�<�ÀÒ¥KùòË/µ�ç�+W®°bÅ\nÕ É²²2.\\¸à|_SS믾Êùóç\rÑ���ǧ�~ªë�`hèׯ�j¬aýâêþ¨ï��ðsæÌ!<Ü}��ÍfcöìÙlß¾]k�.¹pá�YYY��#óòò�4>���ÉÌÌÔ3<ê����xt@w\\¹r
��C4äää¨ÞZ-����»Í�Õ�§­ë;À��ÀP�$&&òÊ+¯¨îsûömæÎ�Ë�%K´öM;±Ûí|õÕW,^¼Øc�[qq±ÛÇ¢ß~û�I�&±yófÝ�¬¬¬dÍ�5¬X±BkתK����4i��6mòZCNN�G\r���ô�?é �ÅÖ@ÓÉ¡;�§5�RQAZZ�


�'7vîÜÙ«°pO�Ç���äæærùòe��Ê}ûöõ*,\\ïdÒ¼¼<��;ær[��½aá�êïܹ³�°ð�Bç����`�ð�ZJ�øñÇ��9r$·oßÖt¢Ú¶m«ib�Ö�>aÂ�\n\n\n�3g�æ�¶�;vÔ41Dë¬]=�P_���!Zê���dÖ¬Yz&�ü��\"Ç��Ü�²\\¹æ�®mÛ¶1mÚ4jkku�(-�«mKOOgôèÑH)yóÍ7Y¹r¥aeûò¹��0JWXX�S¦L¡_¿~ZÍe�âë¯+Ô �ıák­¥�2#8;;[µQh$B���ìì��B°hÑ\"^zé¥�Ôß\\°Z­L�8Q�ñ�¾n¼¨�«H ݳ,�{î9V¯^í÷x�ŨQ£�?~|�a×���Þzë-æÏ�ï÷<CQQQªó����ý��Ò¶m[¦M�ÆÃ�ë�ÐÝĶ®�àS@×ÒcC�aÛ¶m~��ëÔ©�3gÎdøðá.ÇÜCBB�5k�k×®U\r�ô
ÄÄDæÍ�§Ú×>zôh¿jHJJbÞ¼y$'ë�Ë[�bÛ�4q!D��í�¸îÝ»³aÃ�Þ~ûmî¹ç�o�hBxx8O?ý4��.ô��� --��;v0uêT­�\"�éС����Ì�=[Sf�´´4vîÜÉ´iÓ4§µ1Z��²�¶m�»\\Áí�3ø°>`kN����Í/¿üâ²�!C�4è�i&I¢J�û
�e�7¨­�ð¯ÀRok¬£5¦�Óã®4�!MÜl!Ä¿»Ú æáÀ1Î�Ø��EÞ¼y�����m�º¿#\"\"T�Ë�Ò �ÿEYR¶Éå�<¯�ô$ð�ærq-�Z ]áöÑ^Õ°��sÔö1iÖä¨��´­���|�<h�*��ð#ð��Bu�OëÊ¡=�ý@����ø�kÀ@!ÄÏ�vÔtow�ô�Jn��æM�ð��ã��Æ��â�àO��31�ø�\rø�ÃV�ÐÕº�B|�¼�é�Í��ð²ÃF�ñj\"��ò����Cò��øÌ-à%!Äÿè=Ðë��RÊ!ÀF|è.61��à���{¼9Øë��G
�Q��5\t��QZû^��|ìá�B���þ�³]�Hl(çü\t�\r¼Æ�Éì��ì¡ÀrÌ%çüM�0�ØmD.�C³�H)Û�³���Ú�Y¶\teÀß�¥Bõ��:ðK:�)e7à\rà��ç¡1�5n���o\t!��fT�¿æ3�R&¡\\\rþ�PO/bÒ�r`�ð7!�zB�HB�)e�àE`\nà>ߪ\t@!°�øPñ�¿+�hF#)e�0�e%ë§00Em�ç�ð9ðßÀ�!Äí@U�´�VRÊ�À0`4ð$`L�iËá2Ê��Ï�/
�þÏ.å�f�ÓÌ�sÐ�åQòI �­oèù���bôÝÀ��Æê�A³p�Æ8¢�{�� ¬pÕ�¥íp7ÍTs=$ð;ʽü��¸ÊÃ@�«¨Ü`ÓÜO&àìhj�r�Hr¼��¯n(¹ïï�¢ðÿw�(S¬o�¥Ày�c��§�¯Ë@YKH�Ùü�jÀ�ÁÜ�ÅI: 8D�Çû»�¯6(kåD ¬��Â�®ðZÇË�òÜ]
2ÂvÓñ*C¹��:þ/�ÊÝEÚ��������������������4/þ�ÞôfQq°È¬IEND®B`�";
        var myFile = new File("~/Desktop/xxxmyFilexxx.png");
        myFile.encoding = "BINARY";
        myFile.open("w");
        myFile.write(myBinary);
        myFile.close();
        pal.add("image", [160, 0, 300, 130], myFile);
        myFile.remove();
        return pal;
    }

    function precomp(myComp, myLayer, num, precompA) {
        var maskNum = 1;
        for (var m = 1; m <= myLayer.Masks.numProperties; m += 1) {
            if (myLayer.Masks.property(m).name.indexOf("Mapp ") != -1 && myLayer.Masks.property(m).name.indexOf("Mask ") != -1) {
                maskNum = eval(myLayer.Masks.property(m).name.substring(myLayer.Masks.property(m).name.length, myLayer.Masks.property(m).name.length) + 1);
            }
        }
        myMask = myLayer.Masks.addProperty("Mask");
        myMask.maskMode = MaskMode.NONE;
        myMask.inverted = true;
        myMask.name = "Mapp " + num + " Mask " + maskNum;
        adj = precompA.layers.addSolid([0.5, 0.5, 0], "Mask", myLayer.width, myLayer.height, precompA.pixelAspect, precompA.duration);
        adjB = adj.duplicate();
        luma = precompA.layers.addSolid([1, 1, 1], "Luma", myLayer.width, myLayer.height, precompA.pixelAspect, precompA.duration);
        lum = precompA.layers.precompose([luma.index], "Luma_" + myLayer.name + "_" + num, false);
        adjB.trackMatteType = TrackMatteType.LUMA_INVERTED;
        adjB.name = "Luma_" + adjB.name;
        adj.moveToBeginning();
        myFolder = app.project.items.addFolder("BAO_mapp_" + myLayer.name + "_" + num);
        lum.parentFolder = myFolder;
        precompA.parentFolder = myFolder;
        lumaComp = myComp.layers.add(lum);
        lumaComp.enabled = false;
        lumaComp.moveBefore(myComp.layer(myLayer.index - 1));
        lumaComp.selected = false;
        lumaComp.startTime = 0;
        lumaComp.parent = myLayer;
        lumaComp.position.setValue([myLayer.width / 2, myLayer.height / 2]);
        lumaComp.scale.setValue([100, 100]);
        lumaComp.rotation.setValue(0);
        if (myLayer.threeDLayer == true) {
            lumaComp.threeDLayer = true;
            lumaComp.orientation.setValue([0, 0, 0]);
        }
        for (var pl = 1; pl <= precompA.numLayers; pl += 1) {
            if (precompA.layer(pl).source instanceof CompItem && precompA.layer(pl).name != myLayer.name) {
                precompA.layer(pl).source.parentFolder = myFolder;
            }
        }
        myMask = adj.Masks.addProperty("Mask");
        myMask.name = "Mapp " + num + " Mask " + maskNum;
        myMask.inverted = true;
        myMask.maskFeather.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskFeather";
        myMask.maskOpacity.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskOpacity";
        myMask.maskExpansion.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskExpansion";
        myMask.maskPath.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskPath";
        newlayer.trackMatteType = TrackMatteType.NO_TRACK_MATTE;
        myLayer.selected = true;
    }

    function generate() {
        app.beginUndoGroup("Generate_map");
        myComp = app.project.activeItem;
        if (myComp.selectedLayers.length == 0) {
            alert("Please select a layer");
        } else {
            if (myComp.selectedLayers[0].Effects.numProperties == 0) {
                alert("Please apply an Effect first");
            } else {
                myLayer = myComp.selectedLayers[0];
                var num = 1;
                var FXindex = 0;
                var MM = myLayer.trackMatteType;
                var ST = myLayer.startTime;
                myLayer.startTime = 0;
                for (var i = 1; i <= myLayer.Effects.numProperties; i += 1) {
                    if (myLayer.Effects.property(i).name.indexOf("Distortion from mapp") != -1) {
                        n = myLayer.Effects.property(i).name.substring(myLayer.Effects.property(i).name.length - 1, myLayer.Effects.property(i).name.length);
                        num = eval(eval(n) + 1);
                        FXindex = i;
                    }
                }
                myLayer.trackMatteType = TrackMatteType.NO_TRACK_MATTE;
                var nm = myLayer.name;
                myMapp = myLayer.duplicate();
                myMapp.name = nm;
                ind = myMapp.index;
                myComp.layers.precompose([myMapp.index], "Mapp_" + nm + "_" + num, true);
                myMapp = myComp.layer(ind);
                precompA = myMapp.source;
                myMapp.enabled = false;
                myMapp.threeDLayer = false;
                myMapp.selected = false;
                newlayer = precompA.layer(precompA.numLayers);
                newlayer.name = nm;
                for (v = newlayer.Masks.numProperties; v >= 1; v--) {
                    newlayer.Masks.property(v).remove();
                }
                for (l = precompA.numLayers; l >= 1; l--) {
                    if (precompA.layer(l).name != myLayer.name) {
                        precompA.layer(l).remove();
                    }
                }
                precompA.width = newlayer.width;
                precompA.height = newlayer.height;
                newlayer.threeDLayer = false;
                for (var f = 1; f <= FXindex; f += 1) {
                    newlayer.Effects.property(1).remove();
                }
                for (q = newlayer.Effects.numProperties; q >= 1; q--) {
                    n = newlayer.Effects.property(q).name;
                    if (n.substring(0, 1) == "(" && n.substring(n.length - 1, n.length) == ")") {
                        newlayer.Effects.property(q).remove();
                    }
                }
                for (var e = 1; e <= newlayer.Effects.numProperties; e += 1) {
                    fx = newlayer.Effects.property(e);
                    if (!(fx.matchName.indexOf("ADBE FreePin") != -1)) {
                        for (var g = 1; g <= fx.numProperties; g += 1) {
                            if (fx.property(g).canSetExpression == true) {
                                fx.property(g).expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").effect(\"" + fx.name + "\")(" + g + ")";
                            }
                        }
                    } else {
                        puppet = fx.property(2).property(2);
                        for (var h = 1; h <= puppet.numProperties; h += 1) {
                            net = puppet.property(h);
                            for (var j = 1; j <= net.property(4).numProperties; j += 1) {
                                net.property(4).property(j).property("Position").expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").effect(\"" + fx.name + "\")(2)(2)(1)(4)(" + j + ")(\"Position\")";
                            }
                        }
                    }
                }
                var apK = newlayer.anchorPoint.numKeys;
                if (apK > 0) {
                    for (k = apK; k > 0; k--) {
                        newlayer.anchorPoint.removeKey(k);
                    }
                }
                var pK = newlayer.position.numKeys;
                if (pK > 0) {
                    for (k = pK; k > 0; k--) {
                        newlayer.position.removeKey(k);
                    }
                }
                var sK = newlayer.scale.numKeys;
                if (sK > 0) {
                    for (k = sK; k > 0; k--) {
                        newlayer.scale.removeKey(k);
                    }
                }
                var rK = newlayer.rotation.numKeys;
                if (rK > 0) {
                    for (k = rK; k > 0; k--) {
                        newlayer.rotation.removeKey(k);
                    }
                }
                var oK = newlayer.opacity.numKeys;
                if (oK > 0) {
                    for (k = oK; k > 0; k--) {
                        newlayer.opacity.removeKey(k);
                    }
                }
                newlayer.anchorPoint.setValue([0, 0]);
                newlayer.position.setValue([0, 0]);
                newlayer.scale.setValue([100, 100]);
                newlayer.rotation.setValue(0);
                newlayer.opacity.setValue(100);
                var solidBase = precompA.layers.addSolid([0, 0, 0], "Base", myLayer.width, myLayer.height, precompA.pixelAspect, precompA.duration);
                var vert2 = newlayer.duplicate();
                var rouge2 = newlayer.duplicate();
                vert2.replaceSource(solidBase.source, false);
                rouge2.replaceSource(solidBase.source, false);
                solidBase.remove();
                var vert3 = precompA.layers.precompose([vert2.index], "GreenSource_" + myLayer.name + "_" + num, true);
                vert3.layers.precompose([1], "GreenRamp_" + myLayer.name + "_" + num, false);
                greenRamp = vert3.layer(1).source.layer(1).Effects.addProperty("ADBE Ramp");
                greenRamp.property(4).setValue([0, 1, 0]);
                var rouge3 = precompA.layers.precompose([rouge2.index], "RedSource_" + myLayer.name + "_" + num, true);
                rouge3.layers.precompose([1], "RedRamp_" + myLayer.name + "_" + num, false);
                redRamp = rouge3.layer(1).source.layer(1).Effects.addProperty("ADBE Ramp");
                redRamp.property(4).setValue([1, 0, 0]);
                redRamp.property(1).setValue([0, 0]);
                redRamp.property(3).setValue([myLayer.width, 0]);
                var mappVert = precompA.layers.add(vert3.layer(1).source);
                mappVert.enabled = false;
                mappVert.moveToEnd();
                mappVert.startTime = 0;
                var mappRouge = precompA.layers.add(rouge3.layer(1).source);
                mappRouge.enabled = false;
                mappRouge.moveToEnd();
                mappRouge.startTime = 0;
                vert2 = precompA.layer(1);
                rouge2 = precompA.layer(2);

                function FXColor(l1, l2, col) {
                    l1.Effects.addProperty("ADBE Calculations");
                    l1.Effects.property(1).name = "Analyse";
                    l1.Effects.property(1).property(2).setValue(col);
                    l1.Effects.property(1).property(6).setValue(l1.index + 3);
                    l1.Effects.property(1).property(7).setValue(col);
                    l1.Effects.property(1).property(8).setValue(1);
                    l1.Effects.property(1).property(9).setValue(true);
                    l1.Effects.property(1).property(12).setValue(9);
                    l1.blendingMode = BlendingMode.ADD;
                    l1.Effects.addProperty("ADBE Tint");
                    l1.Effects.property(2).name = "Color";
                    if (col == 4) {
                        l1.Effects.property(2).property(2).setValue([0, 0.5, 0]);
                    } else {
                        l1.Effects.property(2).property(2).setValue([0.5, 0, 0]);
                    }
                    l2 = l1.duplicate();
                    l2.Effects.property(1).property(3).setValue(true);
                    l2.Effects.property(1).property(9).setValue(false);
                    l2.Effects.property(2).property(2).setValue([0, 0, 0]);
                    if (col == 4) {
                        l2.Effects.property(2).property(1).setValue([0, 0.5, 0]);
                    } else {
                        l2.Effects.property(2).property(1).setValue([0.5, 0, 0]);
                    }
                }
                FXColor(vert2, vert3, 4);
                FXColor(rouge2, rouge3, 3);
                newlayer.enabled = false;
                for (var a = 1; a <= myLayer.Effects.numProperties; a += 1) {
                    n = myLayer.Effects.property(a).name;
                    if (n.indexOf("Distortion from mapp") != -1 || n.substring(0, 1) == "(" && n.substring(n.length - 1, n.length) == ")") {

                    } else {
                        myLayer.Effects.property(a).enabled = false;
                    }
                }
                displace = myLayer.Effects.addProperty("ADBE Displacement Map");
                displace.name = "Distortion from mapp " + num;
                displace.property(1).setValue(ind);
                displace.property(3).setValue(myLayer.width);
                displace.property(5).setValue(myLayer.height);
                if (MM != TrackMatteType.NO_TRACK_MATTE) {
                    try {
                        myMapp.moveBefore(myComp.layer(myLayer.index - 2));
                    } catch (e) {
                        myLayer.trackMatteType = TrackMatteType.NO_TRACK_MATTE;
                    }
                }
                myLayer.trackMatteType = MM;
                if (MM == TrackMatteType.NO_TRACK_MATTE) {
                    myLayer.trackMatteType = TrackMatteType.ALPHA;
                }
                myLayer.startTime = ST;
                myMapp = myComp.layer("Mapp_" + myLayer.name + "_" + num);
                myMapp.parent = myLayer;
                myMapp.position.setValue([myLayer.width / 2, myLayer.height / 2]);
                myMapp.scale.setValue([100, 100]);
                myMapp.rotation.setValue(0);
                if (myLayer.threeDLayer == true) {
                    myMapp.threeDLayer = true;
                    myMapp.orientation.setValue([0, 0, 0]);
                }
                slider = myLayer.Effects.addProperty("ADBE Slider Control");
                slider.name = "Softness_" + num;
                myBlur = myMapp.source.layers.addSolid([0, 0, 0], "Softness", myLayer.width, myLayer.height, precompA.pixelAspect, precompA.duration);
                myBlur.startTime = 0;
                myBlur.Effects.addProperty("ADBE Gaussian Blur");
                myBlur.Effects.property(1).property(1).expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").effect(\"Softness_" + num + "\")(1)";
                myBlur.Effects.property(1).name = "Softness_" + num;
                myBlur.adjustmentLayer = true;
                precomp(myComp, myLayer, num, precompA);
            }
        }
        app.endUndoGroup();
    }

    function maskBtn_OnClick() {
        app.beginUndoGroup("Add / Remove Mask");
        myComp = app.project.activeItem;
        if (myComp.selectedLayers.length == 0) {
            alert("Please select a layer");
        } else {
            myLayer = myComp.selectedLayers[0];
            var num = 1;
            var FXindex = 0;
            for (var i = 1; i <= myLayer.Effects.numProperties; i += 1) {
                if (myLayer.Effects.property(i).name.indexOf("Distortion from mapp") != -1) {
                    n = myLayer.Effects.property(i).name.substring(myLayer.Effects.property(i).name.length - 1, myLayer.Effects.property(i).name.length);
                    if (eval(n) > num) {
                        num = eval(n);
                        FXindex = i;
                    }
                }
            }
            var maskNum = 1;
            var numMasks = 0;
            for (var m = 1; m <= myLayer.Masks.numProperties; m += 1) {
                if (myLayer.Masks.property(m).name.indexOf("Mapp ") != -1 && myLayer.Masks.property(m).name.indexOf("Mask ") != -1) {
                    maskNum = eval(eval(myLayer.Masks.property(m).name.substring(myLayer.Masks.property(m).name.length - 1, myLayer.Masks.property(m).name.length)) + 1);
                    numMasks += 1;
                }
            }
            if (maskNum > 2 && myLayer.selectedProperties[0].isMask == true && numMasks > 1) {
                adj.Masks.property(myLayer.selectedProperties[0].name).remove();
                myLayer.selectedProperties[0].remove();
                adj = myComp.layer("Mapp_" + myLayer.name + "_" + num).source.layer("Mask");
            } else {
                myMask = myLayer.Masks.addProperty("Mask");
                myMask.maskMode = MaskMode.NONE;
                myMask.inverted = true;
                myMask.name = "Mapp " + num + " Mask " + maskNum;
                adj = myComp.layer("Mapp_" + myLayer.name + "_" + num).source.layer("Mask");
                myMask = adj.Masks.addProperty("Mask");
                myMask.inverted = true;
                myMask.maskFeather.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskFeather";
                myMask.maskOpacity.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskOpacity";
                myMask.maskExpansion.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskExpansion";
                myMask.maskPath.expression = "comp(\"" + myComp.name + "\").layer(\"" + myLayer.name + "\").mask(\"Mapp " + num + " Mask " + maskNum + "\").maskPath";
                myMask.name = "Mapp " + num + " Mask " + maskNum;
            }
        }
        app.endUndoGroup();
    }

    function markBtn_OnClick() {
        app.beginUndoGroup("Mark / Unmark FX");
        myComp = app.project.activeItem;
        myLayer = myComp.selectedLayers[0];
        FX = new Array();
        for (var b = 1; b <= myLayer.Effects.numProperties; b += 1) {
            if (myLayer.Effects.property(b).selected == true) {
                FX.push(b);
            }
        }
        if (FX.length != 0) {
            for (var a = 0; a <= FX.length - 1; a += 1) {
                n = myLayer.Effects.property(FX[a]).name;
                if (n.substring(0, 1) == "(" && n.substring(n.length - 1, n.length) == ")") {
                    myLayer.Effects.property(FX[a]).name = n.substring(1, n.length - 1);
                } else {
                    myLayer.Effects.property(FX[a]).name = "(" + n + ")";
                }
            }
        } else {
            alert("Please select an Effect");
        }
        app.endUndoGroup();
    }

    function restoreBtn_OnClick() {
        app.beginUndoGroup("Restore FX");
        myComp = app.project.activeItem;
        myLayer = myComp.selectedLayers[0];
        myFX = myComp.selectedProperties[0];
        if (myFX == undefined || myFX.isEffect == false || myFX.name.substring(0, 12) != "Distortion f") {
            alert("Please select a \"Distortion from mapp\" effect");
        } else {
            num = myFX.name.substring(21, myFX.name.length);
            for (var a = 1; a <= app.project.numItems; a += 1) {
                if (app.project.item(a).name == ("BAO_mapp_" + myLayer.name + "_" + num)) {
                    app.project.item(a).remove();
                }
            }
            for (m = myLayer.Masks.numProperties; m >= 1; m--) {
                if (myLayer.Masks.property(m).name.indexOf("Mapp " + num) != -1) {
                    myLayer.Masks.property(m).remove();
                }
            }
            for (f = myFX.propertyIndex - 1; f >= 1; f--) {
                myLayer.Effects.property(f).enabled = true;
                if (myLayer.Effects.property(f).name.substring(0, 12) == "Distortion f") {
                    f = 1;
                }
            }
            myFX.remove();
            for (fx = myLayer.Effects.numProperties; fx > 0; fx--) {
                if (myLayer.Effects.property(fx).name == ("Softness_" + num)) {
                    myLayer.Effects.property(fx).remove();
                }
            }
        }
        app.endUndoGroup();
    }

    function invertBtn_OnClick() {
        app.beginUndoGroup("Invert Mask / Luma");
        myComp = app.project.activeItem;
        myMask = myComp.selectedProperties[0];
        myLayer = myComp.selectedLayers[0];
        if (myMask == undefined) {
            myLum = myComp.layer("Mapp_" + myLayer.name.substring(5, myLayer.name.length)).source.layer(myLayer.name);
            myLum.Effects.addProperty("ADBE Invert");
            if (myLum.Effects.numProperties == 2) {
                myLum.Effects.property(1).remove();
                myLum.Effects.property(1).remove();
            }
        } else {
            map = myMask.name.substring(5, 6);
            mask = myMask.name.substring(12, 13);
            if (myMask.inverted == true) {
                myMask.inverted = false;
            } else {
                myMask.inverted = true;
            }
            myComp.layer("Mapp_" + myLayer.name + "_" + map).source.layer("Mask").Masks.property("Mapp " + map + " Mask " + mask).inverted = myMask.inverted;
        }
        app.endUndoGroup();
    }

    function matteBtn_OnClick() {
        app.beginUndoGroup("Show / Hide Matte");
        myComp = app.project.activeItem;
        myLayer = myComp.selectedLayers[0];
        if (myLayer.name.substring(0, 5) == "Luma_" || myLayer.name.substring(0, 5) == "Mapp_") {
            num = myLayer.name.substring(myLayer.name.length - 1, myLayer.name.length);
            for (var l = 1; l <= myComp.numLayers; l += 1) {
                myComp.layer(l).selected = false;
                if (myComp.layer(l).name == myLayer.name.substring(5, myLayer.name.length - 2)) {
                    myComp.layer(l).selected = true;
                    myComp.layer(l).Effects.property("Distortion from mapp " + num).selected = true;
                }
            }
            myLayer = myComp.selectedLayers[0];
        }
        myFX = myComp.selectedProperties[0];
        if (myFX.isMask == true && myFX.name.substring(0, 5) == "Mapp ") {
            myFX = myLayer.Effects.property("Distortion from mapp " + myFX.name.substring(5, 6));
        }
        if (myFX == undefined || myFX.isEffect == false || myFX.name.substring(0, 12) != "Distortion f") {
            alert("Please select a \"Distortion from mapp\" effect");
        } else {
            num = myFX.name.substring(21, myFX.name.length);
            if (myLayer.enabled == true) {
                myLayer.enabled = false;
                myComp.layer("Mapp_" + myLayer.name + "_" + num).enabled = true;
                comp = myComp.layer("Mapp_" + myLayer.name + "_" + num).source;
                comp.layer("Luma_" + myLayer.name + "_" + num).enabled = true;
                comp.layer("Mask").enabled = false;
                comp.layer("Mask").enabled = false;
                comp.layer("Luma_" + myLayer.name + "_" + num).trackMatteType = TrackMatteType.ALPHA_INVERTED;
                black = comp.layers.addSolid([0, 0, 0], "Black", myLayer.width, myLayer.height, comp.pixelAspect, comp.duration);
                black.moveAfter(comp.layer("Luma_" + myLayer.name + "_" + num));
            } else {
                myLayer.enabled = true;
                myComp.layer("Mapp_" + myLayer.name + "_" + num).enabled = false;
                comp = myComp.layer("Mapp_" + myLayer.name + "_" + num).source;
                comp.layer("Luma_" + myLayer.name + "_" + num).enabled = false;
                comp.layer("Mask").enabled = true;
                comp.layer("Mask").enabled = true;
                comp.layer("Luma_" + myLayer.name + "_" + num).trackMatteType = TrackMatteType.NO_TRACK_MATTE;
                black = comp.layer("Black").remove();
            }
        }
        app.endUndoGroup();
    }
    var userinterface = buildUI(this);
    if (userinterface != null && userinterface instanceof Window) {
        userinterface.show()
    }
}
图片.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容