{"version":3,"sources":["src/material/material-button-toggle-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","buttonToggle","testing","cdk","coercion","this","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","pop","length","push","__read","o","m","r","i","ar","error","__spread","arguments","concat","MatButtonToggleHarness","_super","_this","_label","locatorFor","_button","with","options","HarnessPredicate","addOption","text","harness","stringMatches","getText","name","getName","checked","_a","isChecked","_b","getAttribute","coerceBooleanProperty","isDisabled","disabled","getAriaLabel","getAriaLabelledby","getAppearance","host","hasClass","focus","blur","isFocused","toggle","click","check","uncheck","ComponentHarness","hostSelector","MatButtonToggleGroupHarness","getToggles","filter","locatorForAll","isVertical","defineProperty"],"mappings":"CAAC,SAAUA,EAAQC,GACI,iBAAZC,SAA0C,oBAAXC,OAAyBF,EAAQC,QAASE,QAAQ,wBAAyBA,QAAQ,0BACvG,mBAAXC,QAAyBA,OAAOC,IAAMD,OAAO,0CAA2C,CAAC,UAAW,uBAAwB,yBAA0BJ,GACnIA,IAAzBD,EAASA,GAAUO,MAAsBC,GAAKR,EAAOQ,IAAM,GAAIR,EAAOQ,GAAGC,SAAWT,EAAOQ,GAAGC,UAAY,GAAIT,EAAOQ,GAAGC,SAASC,aAAeV,EAAOQ,GAAGC,SAASC,cAAgB,GAAIV,EAAOQ,GAAGC,SAASC,aAAaC,QAAU,IAAKX,EAAOQ,GAAGI,IAAID,QAASX,EAAOQ,GAAGI,IAAIC,UAHhR,CAIEC,MAAM,SAAWZ,EAASS,EAASE,GAAY;;;;;;;;;;;;;;oFAiB7C,IAAIE,EAAgB,SAAUC,EAAGC,GAM7B,OALAF,EAAgBG,OAAOC,gBAClB,CAAEC,UAAW,cAAgBC,OAAS,SAAUL,EAAGC,GAAKD,EAAEI,UAAYH,IACvE,SAAUD,EAAGC,GAAK,IAAK,IAAIK,KAAKL,EACxBC,OAAOK,UAAUC,eAAeC,KAAKR,EAAGK,KACxCN,EAAEM,GAAKL,EAAEK,MACAN,EAAGC,IAE5B,SAASS,EAAUV,EAAGC,GAClB,GAAiB,mBAANA,GAA0B,OAANA,EAC3B,MAAM,IAAIU,UAAU,uBAAyBC,OAAOX,GAAK,iCAE7D,SAASY,IAAOf,KAAKgB,YAAcd,EADnCD,EAAcC,EAAGC,GAEjBD,EAAEO,UAAkB,OAANN,EAAaC,OAAOa,OAAOd,IAAMY,EAAGN,UAAYN,EAAEM,UAAW,IAAIM,GA2CnF,SAASG,EAAUC,EAASC,EAAYC,EAAGC,GAEvC,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IACxBC,EAAKN,EAAUO,KAAKF,IAExB,MAAOG,GACHL,EAAOK,IAEX,SAASC,EAASJ,GAAS,IACvBC,EAAKN,EAAiB,MAAEK,IAE5B,MAAOG,GACHL,EAAOK,IAEX,SAASF,EAAKI,GAAUA,EAAOC,KAAOT,EAAQQ,EAAOL,OAdzD,SAASO,EAAMP,GAAS,OAAOA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,MAc7BO,CAAMF,EAAOL,OAAOQ,KAAKT,EAAWK,GAClGH,GAAMN,EAAYA,EAAUc,MAAMjB,EAASC,GAAc,KAAKS,WAGtE,SAASQ,EAAYlB,EAASmB,GAC1B,IACyDC,EAAGC,EAAGC,EAAGC,EAD9DC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAc,GAAW,EAAPJ,EAAE,GACtC,MAAMA,EAAE,GAAI,OAAOA,EAAE,IAAOK,KAAM,GAAIC,IAAK,IACnD,OAAOL,EAAI,CAAEb,KAAMmB,EAAK,GAAIC,MAASD,EAAK,GAAIE,OAAUF,EAAK,IAAwB,mBAAXG,SAA0BT,EAAES,OAAOC,UAAY,WAAc,OAAOpD,OAAU0C,EACxJ,SAASM,EAAKK,GAAK,OAAO,SAAUC,GAAK,OACzC,SAAS1B,EAAK2B,GACV,GAAIhB,EACA,MAAM,IAAI1B,UAAU,mCACxB,KAAO8B,GACH,IACI,GAAIJ,EAAI,EAAGC,IAAMC,EAAY,EAARc,EAAG,GAASf,EAAU,OAAIe,EAAG,GAAKf,EAAS,SAAOC,EAAID,EAAU,SAAMC,EAAE9B,KAAK6B,GAAI,GAAKA,EAAEX,SAAWY,EAAIA,EAAE9B,KAAK6B,EAAGe,EAAG,KAAKtB,KAC1I,OAAOQ,EAGX,OAFID,EAAI,EAAGC,IACPc,EAAK,CAAS,EAARA,EAAG,GAAQd,EAAEd,QACf4B,EAAG,IACP,KAAK,EACL,KAAK,EACDd,EAAIc,EACJ,MACJ,KAAK,EAED,OADAZ,EAAEC,QACK,CAAEjB,MAAO4B,EAAG,GAAItB,MAAM,GACjC,KAAK,EACDU,EAAEC,QACFJ,EAAIe,EAAG,GACPA,EAAK,CAAC,GACN,SACJ,KAAK,EACDA,EAAKZ,EAAEI,IAAIS,MACXb,EAAEG,KAAKU,MACP,SACJ,QACI,MAAkBf,GAAZA,EAAIE,EAAEG,MAAYW,OAAS,GAAKhB,EAAEA,EAAEgB,OAAS,KAAkB,IAAVF,EAAG,IAAsB,IAAVA,EAAG,IAAW,CACpFZ,EAAI,EACJ,SAEJ,GAAc,IAAVY,EAAG,MAAcd,GAAMc,EAAG,GAAKd,EAAE,IAAMc,EAAG,GAAKd,EAAE,IAAM,CACvDE,EAAEC,MAAQW,EAAG,GACb,MAEJ,GAAc,IAAVA,EAAG,IAAYZ,EAAEC,MAAQH,EAAE,GAAI,CAC/BE,EAAEC,MAAQH,EAAE,GACZA,EAAIc,EACJ,MAEJ,GAAId,GAAKE,EAAEC,MAAQH,EAAE,GAAI,CACrBE,EAAEC,MAAQH,EAAE,GACZE,EAAEI,IAAIW,KAAKH,GACX,MAEAd,EAAE,IACFE,EAAEI,IAAIS,MACVb,EAAEG,KAAKU,MACP,SAERD,EAAKjB,EAAK3B,KAAKQ,EAASwB,GAE5B,MAAOb,GACHyB,EAAK,CAAC,EAAGzB,GACTU,EAAI,EAER,QACID,EAAIE,EAAI,EAEhB,GAAY,EAARc,EAAG,GACH,MAAMA,EAAG,GACb,MAAO,CAAE5B,MAAO4B,EAAG,GAAKA,EAAG,QAAK,EAAQtB,MAAM,GA9DFL,CAAK,CAACyB,EAAGC,MA6F7D,SAASK,EAAOC,EAAGP,GACf,IAAIQ,EAAsB,mBAAXV,QAAyBS,EAAET,OAAOC,UACjD,IAAKS,EACD,OAAOD,EACX,IAAmBE,EAAYhC,EAA3BiC,EAAIF,EAAElD,KAAKiD,GAAOI,EAAK,GAC3B,IACI,WAAc,IAANX,GAAgBA,KAAM,MAAQS,EAAIC,EAAElC,QAAQI,MAChD+B,EAAGN,KAAKI,EAAEnC,OAElB,MAAOsC,GACHnC,EAAI,CAAEmC,MAAOA,GAEjB,QACI,IACQH,IAAMA,EAAE7B,OAAS4B,EAAIE,EAAU,SAC/BF,EAAElD,KAAKoD,GAEf,QACI,GAAIjC,EACA,MAAMA,EAAEmC,OAGpB,OAAOD,EAGX,SAASE,IACL,IAAK,IAAIF,EAAK,GAAID,EAAI,EAAGA,EAAII,UAAUV,OAAQM,IAC3CC,EAAKA,EAAGI,OAAOT,EAAOQ,UAAUJ,KACpC,OAAOC,EA+FX,IAAIK,EAAwC,SAAUC,GAElD,SAASD,IACL,IAAIE,EAAQD,EAAOlC,MAAMpC,KAAMkE,EAASC,aAAenE,KAGvD,OAFAuE,EAAMC,OAASD,EAAME,WAAW,oCAChCF,EAAMG,QAAUH,EAAME,WAAW,6BAC1BF,EAqMX,OA1MA3D,EAAUyD,EAAwBC,GAalCD,EAAuBM,KAAO,SAAUC,GACpC,IAAIL,EAAQvE,KAEZ,YADgB,IAAZ4E,IAAsBA,EAAU,IAC7B,IAAI/E,EAAQgF,iBAAiBR,EAAwBO,GACvDE,UAAU,OAAQF,EAAQG,MAAM,SAAUC,EAASD,GAAQ,OAAOlF,EAAQgF,iBAAiBI,cAAcD,EAAQE,UAAWH,MAC5HD,UAAU,OAAQF,EAAQO,MAAM,SAAUH,EAASG,GAAQ,OAAOtF,EAAQgF,iBAAiBI,cAAcD,EAAQI,UAAWD,MAC5HL,UAAU,UAAWF,EAAQS,SAAS,SAAUL,EAASK,GAAW,OAAOnE,EAAUqD,OAAO,OAAQ,GAAQ,WAAc,OAAOlC,EAAYrC,MAAM,SAAUsF,GAC9J,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAaoC,EAAQO,aACrC,KAAK,EAAG,MAAO,CAAC,EAAeD,EAAGzC,SAAYwC,cAK1DhB,EAAuB5D,UAAU8E,UAAY,WACzC,OAAOrE,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,IAAIqF,EAASC,EACb,OAAOjD,EAAYrC,MAAM,SAAUwF,GAC/B,OAAQA,EAAG5C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAGD,OAFAW,EAAWG,EAAG3C,OAAQ4C,aAAa,gBACnCH,EAAKvF,EAAS2F,sBACP,CAAC,EAAaL,GACzB,KAAK,EAAG,MAAO,CAAC,EAAcC,EAAGlD,WAAM,EAAQ,CAACoD,EAAG3C,kBAMnEwB,EAAuB5D,UAAUkF,WAAa,WAC1C,OAAOzE,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,IAAI4F,EAAUN,EACd,OAAOjD,EAAYrC,MAAM,SAAUwF,GAC/B,OAAQA,EAAG5C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAGD,OAFAkB,EAAYJ,EAAG3C,OAAQ4C,aAAa,YACpCH,EAAKvF,EAAS2F,sBACP,CAAC,EAAaE,GACzB,KAAK,EAAG,MAAO,CAAC,EAAcN,EAAGlD,WAAM,EAAQ,CAACoD,EAAG3C,kBAMnEwB,EAAuB5D,UAAU2E,QAAU,WACvC,OAAOlE,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAAG,MAAO,CAAC,EAAeY,EAAGzC,OAAQ4C,aAAa,iBAMvEpB,EAAuB5D,UAAUoF,aAAe,WAC5C,OAAO3E,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAAG,MAAO,CAAC,EAAeY,EAAGzC,OAAQ4C,aAAa,uBAMvEpB,EAAuB5D,UAAUqF,kBAAoB,WACjD,OAAO5E,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAAG,MAAO,CAAC,EAAeY,EAAGzC,OAAQ4C,aAAa,4BAMvEpB,EAAuB5D,UAAUyE,QAAU,WACvC,OAAOhE,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAKwE,UAClC,KAAK,EAAG,MAAO,CAAC,EAAec,EAAGzC,OAAQkC,gBAM1DV,EAAuB5D,UAAUsF,cAAgB,WAC7C,OAAO7E,EAAUlB,UAAM,OAAQ,GAAQ,WAEnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAKgG,QAClC,KAAK,EAGD,MAAO,CAAC,EAFDV,EAAGzC,OAEgBoD,SADd,0CAEhB,KAAK,EAAG,MAAO,CAAC,EAAeX,EAAGzC,OAAU,WAAa,kBAMzEwB,EAAuB5D,UAAUyF,MAAQ,WACrC,OAAOhF,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAAG,MAAO,CAAC,EAAeY,EAAGzC,OAAQqD,iBAM1D7B,EAAuB5D,UAAU0F,KAAO,WACpC,OAAOjF,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAAG,MAAO,CAAC,EAAeY,EAAGzC,OAAQsD,gBAM1D9B,EAAuB5D,UAAU2F,UAAY,WACzC,OAAOlF,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAAG,MAAO,CAAC,EAAeY,EAAGzC,OAAQuD,qBAM1D/B,EAAuB5D,UAAU4F,OAAS,WACtC,OAAOnF,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAK0E,WAClC,KAAK,EAAG,MAAO,CAAC,EAAeY,EAAGzC,OAAQyD,iBAS1DjC,EAAuB5D,UAAU8F,MAAQ,WACrC,OAAOrF,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAKuF,aAClC,KAAK,EACD,OAAOD,EAAGzC,OAAgB,CAAC,EAAa,GACjC,CAAC,EAAa7C,KAAKqG,UAC9B,KAAK,EACDf,EAAGzC,OACHyC,EAAG1C,MAAQ,EACf,KAAK,EAAG,MAAO,CAAC,WAShCyB,EAAuB5D,UAAU+F,QAAU,WACvC,OAAOtF,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAKuF,aAClC,KAAK,EACD,OAAKD,EAAGzC,OACD,CAAC,EAAa7C,KAAKqG,UADH,CAAC,EAAa,GAEzC,KAAK,EACDf,EAAGzC,OACHyC,EAAG1C,MAAQ,EACf,KAAK,EAAG,MAAO,CAAC,WAKzByB,EA3MgC,CA4MzCxE,EAAQ4G,kBAEVpC,EAAuBqC,aAAe,qBAGtC,IAAIC,EAA6C,SAAUrC,GAEvD,SAASqC,IACL,OAAkB,OAAXrC,GAAmBA,EAAOlC,MAAMpC,KAAMmE,YAAcnE,KA+D/D,OAjEAY,EAAU+F,EAA6BrC,GAUvCqC,EAA4BhC,KAAO,SAAUC,GAEzC,YADgB,IAAZA,IAAsBA,EAAU,IAC7B,IAAI/E,EAAQgF,iBAAiB8B,EAA6B/B,IAMrE+B,EAA4BlG,UAAUmG,WAAa,SAAUC,GAEzD,YADe,IAAXA,IAAqBA,EAAS,IAC3B3F,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,MAAO,CAAC,EAActF,KAAK8G,cAAczC,EAAuBM,KAAKkC,GAA/C7G,WAKlC2G,EAA4BlG,UAAUkF,WAAa,WAC/C,OAAOzE,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAKgG,QAClC,KAAK,EAAG,MAAO,CAAC,EAAcV,EAAGzC,OAAQ4C,aAAa,kBACtD,KAAK,EAAG,MAAO,CAAC,EAA8B,SAAfH,EAAGzC,gBAMlD8D,EAA4BlG,UAAUsG,WAAa,WAC/C,OAAO7F,EAAUlB,UAAM,OAAQ,GAAQ,WACnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAKgG,QAClC,KAAK,EAAG,MAAO,CAAC,EAAeV,EAAGzC,OAAQoD,SAAS,uCAMnEU,EAA4BlG,UAAUsF,cAAgB,WAClD,OAAO7E,EAAUlB,UAAM,OAAQ,GAAQ,WAEnC,OAAOqC,EAAYrC,MAAM,SAAUsF,GAC/B,OAAQA,EAAG1C,OACP,KAAK,EAAG,MAAO,CAAC,EAAa5C,KAAKgG,QAClC,KAAK,EAGD,MAAO,CAAC,EAFDV,EAAGzC,OAEgBoD,SADd,gDAEhB,KAAK,EAAG,MAAO,CAAC,EAAeX,EAAGzC,OAAU,WAAa,kBAKlE8D,EAlEqC,CAmE9C9G,EAAQ4G,kBAEVE,EAA4BD,aAAe;;;;;;;;;;;;;;;AAkB3CtH,EAAQuH,4BAA8BA,EACtCvH,EAAQiF,uBAAyBA,EAEjCjE,OAAO4G,eAAe5H,EAAS,aAAc,CAAEuC,OAAO","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/testing'), require('@angular/cdk/coercion')) :\n    typeof define === 'function' && define.amd ? define('@angular/material/button-toggle/testing', ['exports', '@angular/cdk/testing', '@angular/cdk/coercion'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.buttonToggle = global.ng.material.buttonToggle || {}, global.ng.material.buttonToggle.testing = {}), global.ng.cdk.testing, global.ng.cdk.coercion));\n}(this, (function (exports, testing, coercion) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (Object.prototype.hasOwnProperty.call(b, p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, o) {\n        for (var p in m)\n            if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p))\n                __createBinding(o, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    /** @deprecated */\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    /** @deprecated */\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    function __spreadArray(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n            to[j] = from[i];\n        return to;\n    }\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    /** Harness for interacting with a standard mat-button-toggle in tests. */\n    var MatButtonToggleHarness = /** @class */ (function (_super) {\n        __extends(MatButtonToggleHarness, _super);\n        function MatButtonToggleHarness() {\n            var _this = _super.apply(this, __spread(arguments)) || this;\n            _this._label = _this.locatorFor('.mat-button-toggle-label-content');\n            _this._button = _this.locatorFor('.mat-button-toggle-button');\n            return _this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatButtonToggleHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which button toggle instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatButtonToggleHarness.with = function (options) {\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatButtonToggleHarness, options)\n                .addOption('text', options.text, function (harness, text) { return testing.HarnessPredicate.stringMatches(harness.getText(), text); })\n                .addOption('name', options.name, function (harness, name) { return testing.HarnessPredicate.stringMatches(harness.getName(), name); })\n                .addOption('checked', options.checked, function (harness, checked) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {\n                switch (_a.label) {\n                    case 0: return [4 /*yield*/, harness.isChecked()];\n                    case 1: return [2 /*return*/, (_a.sent()) === checked];\n                }\n            }); }); });\n        };\n        /** Gets a boolean promise indicating if the button toggle is checked. */\n        MatButtonToggleHarness.prototype.isChecked = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var checked, _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1:\n                            checked = (_b.sent()).getAttribute('aria-pressed');\n                            _a = coercion.coerceBooleanProperty;\n                            return [4 /*yield*/, checked];\n                        case 2: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        /** Gets a boolean promise indicating if the button toggle is disabled. */\n        MatButtonToggleHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var disabled, _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1:\n                            disabled = (_b.sent()).getAttribute('disabled');\n                            _a = coercion.coerceBooleanProperty;\n                            return [4 /*yield*/, disabled];\n                        case 2: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        /** Gets a promise for the button toggle's name. */\n        MatButtonToggleHarness.prototype.getName = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1: return [2 /*return*/, (_a.sent()).getAttribute('name')];\n                    }\n                });\n            });\n        };\n        /** Gets a promise for the button toggle's aria-label. */\n        MatButtonToggleHarness.prototype.getAriaLabel = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1: return [2 /*return*/, (_a.sent()).getAttribute('aria-label')];\n                    }\n                });\n            });\n        };\n        /** Gets a promise for the button toggles's aria-labelledby. */\n        MatButtonToggleHarness.prototype.getAriaLabelledby = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1: return [2 /*return*/, (_a.sent()).getAttribute('aria-labelledby')];\n                    }\n                });\n            });\n        };\n        /** Gets a promise for the button toggle's text. */\n        MatButtonToggleHarness.prototype.getText = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._label()];\n                        case 1: return [2 /*return*/, (_a.sent()).text()];\n                    }\n                });\n            });\n        };\n        /** Gets the appearance that the button toggle is using. */\n        MatButtonToggleHarness.prototype.getAppearance = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var host, className;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            host = _a.sent();\n                            className = 'mat-button-toggle-appearance-standard';\n                            return [4 /*yield*/, host.hasClass(className)];\n                        case 2: return [2 /*return*/, (_a.sent()) ? 'standard' : 'legacy'];\n                    }\n                });\n            });\n        };\n        /** Focuses the toggle. */\n        MatButtonToggleHarness.prototype.focus = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1: return [2 /*return*/, (_a.sent()).focus()];\n                    }\n                });\n            });\n        };\n        /** Blurs the toggle. */\n        MatButtonToggleHarness.prototype.blur = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1: return [2 /*return*/, (_a.sent()).blur()];\n                    }\n                });\n            });\n        };\n        /** Whether the toggle is focused. */\n        MatButtonToggleHarness.prototype.isFocused = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1: return [2 /*return*/, (_a.sent()).isFocused()];\n                    }\n                });\n            });\n        };\n        /** Toggle the checked state of the buttons toggle. */\n        MatButtonToggleHarness.prototype.toggle = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._button()];\n                        case 1: return [2 /*return*/, (_a.sent()).click()];\n                    }\n                });\n            });\n        };\n        /**\n         * Puts the button toggle in a checked state by toggling it if it's\n         * currently unchecked, or doing nothing if it is already checked.\n         */\n        MatButtonToggleHarness.prototype.check = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.isChecked()];\n                        case 1:\n                            if (!!(_a.sent())) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this.toggle()];\n                        case 2:\n                            _a.sent();\n                            _a.label = 3;\n                        case 3: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /**\n         * Puts the button toggle in an unchecked state by toggling it if it's\n         * currently checked, or doing nothing if it's already unchecked.\n         */\n        MatButtonToggleHarness.prototype.uncheck = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.isChecked()];\n                        case 1:\n                            if (!_a.sent()) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this.toggle()];\n                        case 2:\n                            _a.sent();\n                            _a.label = 3;\n                        case 3: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return MatButtonToggleHarness;\n    }(testing.ComponentHarness));\n    /** The selector for the host element of a `MatButton` instance. */\n    MatButtonToggleHarness.hostSelector = '.mat-button-toggle';\n\n    /** Harness for interacting with a standard mat-button-toggle in tests. */\n    var MatButtonToggleGroupHarness = /** @class */ (function (_super) {\n        __extends(MatButtonToggleGroupHarness, _super);\n        function MatButtonToggleGroupHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatButtonToggleGroupHarness`\n         * that meets certain criteria.\n         * @param options Options for filtering which button toggle instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatButtonToggleGroupHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatButtonToggleGroupHarness, options);\n        };\n        /**\n         * Gets the button toggles that are inside the group.\n         * @param filter Optionally filters which toggles are included.\n         */\n        MatButtonToggleGroupHarness.prototype.getToggles = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, this.locatorForAll(MatButtonToggleHarness.with(filter))()];\n                });\n            });\n        };\n        /** Gets whether the button toggle group is disabled. */\n        MatButtonToggleGroupHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getAttribute('aria-disabled')];\n                        case 2: return [2 /*return*/, (_a.sent()) === 'true'];\n                    }\n                });\n            });\n        };\n        /** Gets whether the button toggle group is laid out vertically. */\n        MatButtonToggleGroupHarness.prototype.isVertical = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).hasClass('mat-button-toggle-vertical')];\n                    }\n                });\n            });\n        };\n        /** Gets the appearance that the group is using. */\n        MatButtonToggleGroupHarness.prototype.getAppearance = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var host, className;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            host = _a.sent();\n                            className = 'mat-button-toggle-group-appearance-standard';\n                            return [4 /*yield*/, host.hasClass(className)];\n                        case 2: return [2 /*return*/, (_a.sent()) ? 'standard' : 'legacy'];\n                    }\n                });\n            });\n        };\n        return MatButtonToggleGroupHarness;\n    }(testing.ComponentHarness));\n    /** The selector for the host element of a `MatButton` instance. */\n    MatButtonToggleGroupHarness.hostSelector = '.mat-button-toggle-group';\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    exports.MatButtonToggleGroupHarness = MatButtonToggleGroupHarness;\n    exports.MatButtonToggleHarness = MatButtonToggleHarness;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-button-toggle-testing.umd.js.map\n"]}