"use strict";var __spreadArrays=this&&this.__spreadArrays||function(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var i=arguments[t],a=0,s=i.length;a<s;a++,o++)r[o]=i[a];return r};
/**
 * @license Angular v12.0.0-next.0
 * (c) 2010-2020 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function(e){var t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function r(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");var o=e.__Zone_symbol_prefix||"__zone_symbol__";function i(e){return o+e}var a=!0===e[i("forceDuplicateZoneCheck")];if(e.Zone){if(a||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var s=function(){function t(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new l(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==C.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(t,"root",{get:function(){for(var e=t.current;e.parent;)e=e.parent;return e},enumerable:!1,configurable:!0}),Object.defineProperty(t,"current",{get:function(){return j.zone},enumerable:!1,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return A},enumerable:!1,configurable:!0}),t.__load_patch=function(o,i,s){if(void 0===s&&(s=!1),C.hasOwnProperty(o)){if(!s&&a)throw Error("Already loaded patch: "+o)}else if(!e["__Zone_disable_"+o]){var c="Zone:"+o;n(c),C[o]=i(e,t,D),r(c,c)}},Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},t.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},t.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},t.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},t.prototype.run=function(e,t,n,r){j={parent:j,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{j=j.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),j={parent:j,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{j=j.parent}},t.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");if(e.state!==k||e.type!==O&&e.type!==Z){var r=e.state!=E;r&&e._transitionTo(E,b),e.runCount++;var o=A;A=e,j={parent:j,zone:this};try{e.type==Z&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{e.state!==k&&e.state!==w&&(e.type==O||e.data&&e.data.isPeriodic?r&&e._transitionTo(b,E):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(k,E,k))),j=j.parent,A=o}}},t.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(T,k);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(w,T,k),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==T&&e._transitionTo(b,T),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new h(P,e,t,n,r,void 0))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new h(Z,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new h(O,e,t,n,r,o))},t.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");e._transitionTo(S,b,E);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(w,S),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(k,S),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},t}();s.__symbol__=i;var c,u={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,i){return e.invokeTask(n,r,o,i)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},l=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this.zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask;(r||t&&t._hasTaskZS)&&(this._hasTaskZS=r?n:u,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=u,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=u,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=u,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}return e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new s(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),(n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t))||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=P)throw new Error("Task is missing scheduleFn.");_(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(o<0)throw new Error("More tasks executed then were scheduled.");0!=r&&0!=o||this.hasTask(this.zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})},e}(),h=function(){function t(n,r,o,i,a,s){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=i,this.scheduleFn=a,this.cancelFn=s,!o)throw new Error("callback is not defined");this.callback=o;var c=this;this.invoke=n===O&&i&&i.useG?t.invokeTask:function(){return t.invokeTask.call(e,c,this,arguments)}}return t.invokeTask=function(e,t,n){e||(e=this),I++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==I&&m(),I--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!1,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(k,T)},t.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(this.type+" '"+this.source+"': can not transition to '"+e+"', expecting state '"+t+"'"+(n?" or '"+n+"'":"")+", was '"+this._state+"'.");this._state=e,e==k&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},t}(),p=i("setTimeout"),f=i("Promise"),d=i("then"),y=[],v=!1;function _(t){if(0===I&&0===y.length)if(c||e[f]&&(c=e[f].resolve(0)),c){var n=c[d];n||(n=c.then),n.call(c,m)}else e[p](m,0);t&&y.push(t)}function m(){if(!v){for(v=!0;y.length;){var e=y;y=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(e){D.onUnhandledError(e)}}}D.microtaskDrainDone(),v=!1}}var g={name:"NO ZONE"},k="notScheduled",T="scheduling",b="scheduled",E="running",S="canceling",w="unknown",P="microTask",Z="macroTask",O="eventTask",C={},D={symbol:i,currentZoneFrame:function(){return j},onUnhandledError:M,microtaskDrainDone:M,scheduleMicroTask:_,showUncaughtError:function(){return!s[i("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:M,patchMethod:function(){return M},bindArguments:function(){return[]},patchThen:function(){return M},patchMacroTask:function(){return M},patchEventPrototype:function(){return M},isIEOrEdge:function(){return!1},getGlobalObjects:function(){},ObjectDefineProperty:function(){return M},ObjectGetOwnPropertyDescriptor:function(){},ObjectCreate:function(){},ArraySlice:function(){return[]},patchClass:function(){return M},wrapWithCurrentZone:function(){return M},filterProperties:function(){return[]},attachOriginToPatched:function(){return M},_redefineProperty:function(){return M},patchCallbacks:function(){return M}},j={parent:null,zone:new s(null,null)},A=null,I=0;function M(){}r("Zone","Zone"),e.Zone=s}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var e=Object.getOwnPropertyDescriptor,t=Object.defineProperty,n=Object.getPrototypeOf,r=Object.create,o=Array.prototype.slice,i=Zone.__symbol__("addEventListener"),a=Zone.__symbol__("removeEventListener"),s=Zone.__symbol__("");
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */function c(e,t){return Zone.current.wrap(e,t)}function u(e,t,n,r,o){return Zone.current.scheduleMacroTask(e,t,n,r,o)}var l=Zone.__symbol__,h="undefined"!=typeof window,p=h?window:void 0,f=h&&p||"object"==typeof self&&self||global,d=[null];function y(e,t){for(var n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=c(e[n],t+"_"+n));return e}function v(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}var _="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,m=!("nw"in f)&&void 0!==f.process&&"[object process]"==={}.toString.call(f.process),g=!m&&!_&&!(!h||!p.HTMLElement),k=void 0!==f.process&&"[object process]"==={}.toString.call(f.process)&&!_&&!(!h||!p.HTMLElement),T={},b=function(e){if(e=e||f.event){var t=T[e.type];t||(t=T[e.type]=l("ON_PROPERTY"+e.type));var n,r=this||e.target||f,o=r[t];if(g&&r===p&&"error"===e.type){var i=e;!0===(n=o&&o.call(this,i.message,i.filename,i.lineno,i.colno,i.error))&&e.preventDefault()}else null==(n=o&&o.apply(this,arguments))||n||e.preventDefault();return n}};function E(n,r,o){var i=e(n,r);if(!i&&o&&e(o,r)&&(i={enumerable:!0,configurable:!0}),i&&i.configurable){var a=l("on"+r+"patched");if(!n.hasOwnProperty(a)||!n[a]){delete i.writable,delete i.value;var s=i.get,c=i.set,u=r.substr(2),h=T[u];h||(h=T[u]=l("ON_PROPERTY"+u)),i.set=function(e){var t=this;t||n!==f||(t=f),t&&(t[h]&&t.removeEventListener(u,b),c&&c.apply(t,d),"function"==typeof e?(t[h]=e,t.addEventListener(u,b,!1)):t[h]=null)},i.get=function(){var e=this;if(e||n!==f||(e=f),!e)return null;var t=e[h];if(t)return t;if(s){var o=s&&s.call(this);if(o)return i.set.call(this,o),"function"==typeof e.removeAttribute&&e.removeAttribute(r),o}return null},t(n,r,i),n[a]=!0}}}function S(e,t,n){if(t)for(var r=0;r<t.length;r++)E(e,"on"+t[r],n);else{var o=[];for(var i in e)"on"==i.substr(0,2)&&o.push(i);for(var a=0;a<o.length;a++)E(e,o[a],n)}}var w=l("originalInstance");function P(e){var n=f[e];if(n){f[l(e)]=n,f[e]=function(){var t=y(arguments,e);switch(t.length){case 0:this[w]=new n;break;case 1:this[w]=new n(t[0]);break;case 2:this[w]=new n(t[0],t[1]);break;case 3:this[w]=new n(t[0],t[1],t[2]);break;case 4:this[w]=new n(t[0],t[1],t[2],t[3]);break;default:throw new Error("Arg list too long.")}},C(f[e],n);var r,o=new n((function(){}));for(r in o)"XMLHttpRequest"===e&&"responseBlob"===r||function(n){"function"==typeof o[n]?f[e].prototype[n]=function(){return this[w][n].apply(this[w],arguments)}:t(f[e].prototype,n,{set:function(t){"function"==typeof t?(this[w][n]=c(t,e+"."+n),C(this[w][n],t)):this[w][n]=t},get:function(){return this[w][n]}})}(r);for(r in n)"prototype"!==r&&n.hasOwnProperty(r)&&(f[e][r]=n[r])}}function Z(t,r,o){for(var i=t;i&&!i.hasOwnProperty(r);)i=n(i);!i&&t[r]&&(i=t);var a=l(r),s=null;if(i&&(!(s=i[a])||!i.hasOwnProperty(a))&&(s=i[a]=i[r],v(i&&e(i,r)))){var c=o(s,a,r);i[r]=function(){return c(this,arguments)},C(i[r],s)}return s}function O(e,t,n){var r=null;function o(e){var t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},r.apply(t.target,t.args),e}r=Z(e,t,(function(e){return function(t,r){var i=n(t,r);return i.cbIdx>=0&&"function"==typeof r[i.cbIdx]?u(i.name,r[i.cbIdx],i,o):e.apply(t,r)}}))}function C(e,t){e[l("OriginalDelegate")]=t}var D=!1,j=!1;function A(){if(D)return j;D=!0;try{var e=p.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(j=!0)}catch(e){}return j}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */Zone.__load_patch("ZoneAwarePromise",(function(e,t,n){var r=Object.getOwnPropertyDescriptor,o=Object.defineProperty,i=n.symbol,a=[],s=!0===e[i("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],c=i("Promise"),u=i("then");n.onUnhandledError=function(e){if(n.showUncaughtError()){var t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=function(){for(var e=function(){var e=a.shift();try{e.zone.runGuarded((function(){if(e.throwOriginal)throw e.rejection;throw e}))}catch(e){!function r(e){n.onUnhandledError(e);try{var r=t[l];"function"==typeof r&&r.call(this,e)}catch(e){}}(e)}};a.length;)e()};var l=i("unhandledPromiseRejectionHandler");function h(e){return e&&e.then}function p(e){return e}function f(e){return P.reject(e)}var d=i("state"),y=i("value"),v=i("finally"),_=i("parentPromiseValue"),m=i("parentPromiseState");function g(e,t){return function(n){try{T(e,t,n)}catch(t){T(e,!1,t)}}}var k=i("currentTaskTrace");function T(e,r,i){var c,u=(c=!1,function e(t){return function(){c||(c=!0,t.apply(null,arguments))}});if(e===i)throw new TypeError("Promise resolved with itself");if(null===e[d]){var l=null;try{"object"!=typeof i&&"function"!=typeof i||(l=i&&i.then)}catch(t){return u((function(){T(e,!1,t)}))(),e}if(!1!==r&&i instanceof P&&i.hasOwnProperty(d)&&i.hasOwnProperty(y)&&null!==i[d])E(i),T(e,i[d],i[y]);else if(!1!==r&&"function"==typeof l)try{l.call(i,u(g(e,r)),u(g(e,!1)))}catch(t){u((function(){T(e,!1,t)}))()}else{e[d]=r;var h=e[y];if(e[y]=i,e[v]===v&&!0===r&&(e[d]=e[m],e[y]=e[_]),!1===r&&i instanceof Error){var p=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;p&&o(i,k,{configurable:!0,enumerable:!1,writable:!0,value:p})}for(var f=0;f<h.length;)S(e,h[f++],h[f++],h[f++],h[f++]);if(0==h.length&&0==r){e[d]=0;var b=i;try{throw new Error("Uncaught (in promise): "+function w(e){return e&&e.toString===Object.prototype.toString?(e.constructor&&e.constructor.name||"")+": "+JSON.stringify(e):e?e.toString():Object.prototype.toString.call(e)}(i)+(i&&i.stack?"\n"+i.stack:""))}catch(e){b=e}s&&(b.throwOriginal=!0),b.rejection=i,b.promise=e,b.zone=t.current,b.task=t.currentTask,a.push(b),n.scheduleMicroTask()}}}return e}var b=i("rejectionHandledHandler");function E(e){if(0===e[d]){try{var n=t[b];n&&"function"==typeof n&&n.call(this,{rejection:e[y],promise:e})}catch(e){}e[d]=!1;for(var r=0;r<a.length;r++)e===a[r].promise&&a.splice(r,1)}}function S(e,t,n,r,o){E(e);var i=e[d],a=i?"function"==typeof r?r:p:"function"==typeof o?o:f;t.scheduleMicroTask("Promise.then",(function(){try{var r=e[y],o=!!n&&v===n[v];o&&(n[_]=r,n[m]=i);var s=t.run(a,void 0,o&&a!==f&&a!==p?[]:[r]);T(n,!0,s)}catch(e){T(n,!1,e)}}),n)}var w=function(){},P=function(){function e(t){if(!(this instanceof e))throw new Error("Must be an instanceof Promise.");this[d]=null,this[y]=[];try{t&&t(g(this,!0),g(this,!1))}catch(e){T(this,!1,e)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(e){return T(new this(null),!0,e)},e.reject=function(e){return T(new this(null),!1,e)},e.race=function(e){var t,n,r=new this((function(e,r){t=e,n=r}));function o(e){t(e)}function i(e){n(e)}for(var a=0,s=e;a<s.length;a++){var c=s[a];h(c)||(c=this.resolve(c)),c.then(o,i)}return r},e.all=function(t){return e.allWithCallback(t)},e.allSettled=function(t){return(this&&this.prototype instanceof e?this:e).allWithCallback(t,{thenCallback:function(e){return{status:"fulfilled",value:e}},errorCallback:function(e){return{status:"rejected",reason:e}}})},e.allWithCallback=function(e,t){for(var n,r,o=new this((function(e,t){n=e,r=t})),i=2,a=0,s=[],c=function(e){h(e)||(e=u.resolve(e));var o=a;try{e.then((function(e){s[o]=t?t.thenCallback(e):e,0==--i&&n(s)}),(function(e){t?(s[o]=t.errorCallback(e),0==--i&&n(s)):r(e)}))}catch(e){r(e)}i++,a++},u=this,l=0,p=e;l<p.length;l++)c(p[l]);return 0==(i-=2)&&n(s),o},Object.defineProperty(e.prototype,Symbol.toStringTag,{get:function(){return"Promise"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,Symbol.species,{get:function(){return e},enumerable:!1,configurable:!0}),e.prototype.then=function(n,r){var o=this.constructor[Symbol.species];o&&"function"==typeof o||(o=this.constructor||e);var i=new o(w),a=t.current;return null==this[d]?this[y].push(a,i,n,r):S(this,a,i,n,r),i},e.prototype.catch=function(e){return this.then(null,e)},e.prototype.finally=function(n){var r=this.constructor[Symbol.species];r&&"function"==typeof r||(r=e);var o=new r(w);o[v]=v;var i=t.current;return null==this[d]?this[y].push(i,o,n,n):S(this,i,o,n,n),o},e}();P.resolve=P.resolve,P.reject=P.reject,P.race=P.race,P.all=P.all;var O=e[c]=e.Promise;e.Promise=P;var C=i("thenPatched");function D(e){var t=e.prototype,n=r(t,"then");if(!n||!1!==n.writable&&n.configurable){var o=t.then;t[u]=o,e.prototype.then=function(e,t){var n=this;return new P((function(e,t){o.call(n,e,t)})).then(e,t)},e[C]=!0}}return n.patchThen=D,O&&(D(O),Z(e,"fetch",(function(e){return function t(e){return function(t,n){var r=e.apply(t,n);if(r instanceof P)return r;var o=r.constructor;return o[C]||D(o),r}}(e)}))),Promise[t.__symbol__("uncaughtPromiseErrors")]=a,P})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("toString",(function(e){var t=Function.prototype.toString,n=l("OriginalDelegate"),r=l("Promise"),o=l("Error"),i=function i(){if("function"==typeof this){var a=this[n];if(a)return"function"==typeof a?t.call(a):Object.prototype.toString.call(a);if(this===Promise){var s=e[r];if(s)return t.call(s)}if(this===Error){var c=e[o];if(c)return t.call(c)}}return t.call(this)};i[n]=t,Function.prototype.toString=i;var a=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":a.call(this)}}));
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var I=!1;if("undefined"!=typeof window)try{var M=Object.defineProperty({},"passive",{get:function(){I=!0}});window.addEventListener("test",M,M),window.removeEventListener("test",M,M)}catch(e){I=!1}var F={useG:!0},R={},x={},z=new RegExp("^"+s+"(\\w+)(true|false)$"),L=l("propagationStopped");function N(e,t){var n=(t?t(e):e)+"false",r=(t?t(e):e)+"true",o=s+n,i=s+r;R[e]={},R[e].false=o,R[e].true=i}function H(e,t,r){var o=r&&r.add||"addEventListener",i=r&&r.rm||"removeEventListener",a=r&&r.listeners||"eventListeners",c=r&&r.rmAll||"removeAllListeners",u=l(o),h="."+o+":",p=function(e,t,n){if(!e.isRemoved){var r=e.callback;"object"==typeof r&&r.handleEvent&&(e.callback=function(e){return r.handleEvent(e)},e.originalDelegate=r),e.invoke(e,t,[n]);var o=e.options;o&&"object"==typeof o&&o.once&&t[i].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,o)}},f=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[R[t.type].false];if(r)if(1===r.length)p(r[0],n,t);else for(var o=r.slice(),i=0;i<o.length&&(!t||!0!==t[L]);i++)p(o[i],n,t)}},d=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[R[t.type].true];if(r)if(1===r.length)p(r[0],n,t);else for(var o=r.slice(),i=0;i<o.length&&(!t||!0!==t[L]);i++)p(o[i],n,t)}};function y(t,r){if(!t)return!1;var p=!0;r&&void 0!==r.useG&&(p=r.useG);var y=r&&r.vh,v=!0;r&&void 0!==r.chkDup&&(v=r.chkDup);var _=!1;r&&void 0!==r.rt&&(_=r.rt);for(var g=t;g&&!g.hasOwnProperty(o);)g=n(g);if(!g&&t[o]&&(g=t),!g)return!1;if(g[u])return!1;var k,T=r&&r.eventNameToString,b={},E=g[u]=g[o],S=g[l(i)]=g[i],w=g[l(a)]=g[a],P=g[l(c)]=g[c];function Z(e,t){return!I&&"object"==typeof e&&e?!!e.capture:I&&t?"boolean"==typeof e?{capture:e,passive:!0}:e?"object"==typeof e&&!1!==e.passive?Object.assign(Object.assign({},e),{passive:!0}):e:{passive:!0}:e}r&&r.prepend&&(k=g[l(r.prepend)]=g[r.prepend]);var O=p?function(e){if(!b.isExisting)return E.call(b.target,b.eventName,b.capture?d:f,b.options)}:function(e){return E.call(b.target,b.eventName,e.invoke,b.options)},D=p?function(e){if(!e.isRemoved){var t=R[e.eventName],n=void 0;t&&(n=t[e.capture?"true":"false"]);var r=n&&e.target[n];if(r)for(var o=0;o<r.length;o++)if(r[o]===e){r.splice(o,1),e.isRemoved=!0,0===r.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return S.call(e.target,e.eventName,e.capture?d:f,e.options)}:function(e){return S.call(e.target,e.eventName,e.invoke,e.options)},j=r&&r.diff?r.diff:function(e,t){var n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},A=Zone[l("UNPATCHED_EVENTS")],M=e[l("PASSIVE_EVENTS")],L=function(t,n,o,i,a,s){return void 0===a&&(a=!1),void 0===s&&(s=!1),function(){var c=this||e,u=arguments[0];r&&r.transferEventName&&(u=r.transferEventName(u));var l=arguments[1];if(!l)return t.apply(this,arguments);if(m&&"uncaughtException"===u)return t.apply(this,arguments);var h=!1;if("function"!=typeof l){if(!l.handleEvent)return t.apply(this,arguments);h=!0}if(!y||y(t,l,c,arguments)){var f=I&&!!M&&-1!==M.indexOf(u),d=Z(arguments[2],f);if(A)for(var _=0;_<A.length;_++)if(u===A[_])return f?t.call(c,u,l,d):t.apply(this,arguments);var g=!!d&&("boolean"==typeof d||d.capture),k=!(!d||"object"!=typeof d)&&d.once,E=Zone.current,S=R[u];S||(N(u,T),S=R[u]);var w,P=S[g?"true":"false"],O=c[P],C=!1;if(O){if(C=!0,v)for(_=0;_<O.length;_++)if(j(O[_],l))return}else O=c[P]=[];var D=c.constructor.name,z=x[D];z&&(w=z[u]),w||(w=D+n+(T?T(u):u)),b.options=d,k&&(b.options.once=!1),b.target=c,b.capture=g,b.eventName=u,b.isExisting=C;var L=p?F:void 0;L&&(L.taskData=b);var H=E.scheduleEventTask(w,l,L,o,i);return b.target=null,L&&(L.taskData=null),k&&(d.once=!0),(I||"boolean"!=typeof H.options)&&(H.options=d),H.target=c,H.capture=g,H.eventName=u,h&&(H.originalDelegate=l),s?O.unshift(H):O.push(H),a?c:void 0}}};return g[o]=L(E,h,O,D,_),k&&(g.prependListener=L(k,".prependListener:",(function(e){return k.call(b.target,b.eventName,e.invoke,b.options)}),D,_,!0)),g[i]=function(){var t=this||e,n=arguments[0];r&&r.transferEventName&&(n=r.transferEventName(n));var o=arguments[2],i=!!o&&("boolean"==typeof o||o.capture),a=arguments[1];if(!a)return S.apply(this,arguments);if(!y||y(S,a,t,arguments)){var c,u=R[n];u&&(c=u[i?"true":"false"]);var l=c&&t[c];if(l)for(var h=0;h<l.length;h++){var p=l[h];if(j(p,a)){if(l.splice(h,1),p.isRemoved=!0,0===l.length&&(p.allRemoved=!0,t[c]=null,"string"==typeof n)){var f=s+"ON_PROPERTY"+n;t[f]=null}return p.zone.cancelTask(p),_?t:void 0}}return S.apply(this,arguments)}},g[a]=function(){var t=this||e,n=arguments[0];r&&r.transferEventName&&(n=r.transferEventName(n));for(var o=[],i=q(t,T?T(n):n),a=0;a<i.length;a++){var s=i[a],c=s.originalDelegate?s.originalDelegate:s.callback;o.push(c)}return o},g[c]=function(){var t=this||e,n=arguments[0];if(n){r&&r.transferEventName&&(n=r.transferEventName(n));var o=R[n];if(o){var a=o.false,s=o.true,u=t[a],l=t[s];if(u){var h=u.slice();for(d=0;d<h.length;d++)this[i].call(this,n,(p=h[d]).originalDelegate?p.originalDelegate:p.callback,p.options)}if(l)for(h=l.slice(),d=0;d<h.length;d++){var p;this[i].call(this,n,(p=h[d]).originalDelegate?p.originalDelegate:p.callback,p.options)}}}else{for(var f=Object.keys(t),d=0;d<f.length;d++){var y=f[d],v=z.exec(y),m=v&&v[1];m&&"removeListener"!==m&&this[c].call(this,m)}this[c].call(this,"removeListener")}if(_)return this},C(g[o],E),C(g[i],S),P&&C(g[c],P),w&&C(g[a],w),!0}for(var v=[],_=0;_<t.length;_++)v[_]=y(t[_],r);return v}function q(e,t){if(!t){var n=[];for(var r in e){var o=z.exec(r),i=o&&o[1];if(i&&(!t||i===t)){var a=e[r];if(a)for(var s=0;s<a.length;s++)n.push(a[s])}}return n}var c=R[t];c||(N(t),c=R[t]);var u=e[c.false],l=e[c.true];return u?l?u.concat(l):u.slice():l?l.slice():[]}function U(e,t){var n=e.Event;n&&n.prototype&&t.patchMethod(n.prototype,"stopImmediatePropagation",(function(e){return function(t,n){t[L]=!0,e&&e.apply(t,n)}}))}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */function G(e,t,n,r,o){var i=Zone.__symbol__(r);if(!t[i]){var a=t[i]=t[r];t[r]=function(i,s,c){return s&&s.prototype&&o.forEach((function(t){var o=n+"."+r+"::"+t,i=s.prototype;if(i.hasOwnProperty(t)){var a=e.ObjectGetOwnPropertyDescriptor(i,t);a&&a.value?(a.value=e.wrapWithCurrentZone(a.value,o),e._redefineProperty(s.prototype,t,a)):i[t]&&(i[t]=e.wrapWithCurrentZone(i[t],o))}else i[t]&&(i[t]=e.wrapWithCurrentZone(i[t],o))})),a.call(t,i,s,c)},e.attachOriginToPatched(t[r],a)}}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */var B,W,Q,V,X,K=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplayconnected","vrdisplaydisconnected","vrdisplaypresentchange"],Y=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],J=["load"],$=["blur","error","focus","load","resize","scroll","messageerror"],ee=["bounce","finish","start"],te=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],ne=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],re=["close","error","open","message"],oe=["error","message"],ie=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],K,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]);function ae(e,t,n){if(!n||0===n.length)return t;var r=n.filter((function(t){return t.target===e}));if(!r||0===r.length)return t;var o=r[0].ignoreProperties;return t.filter((function(e){return-1===o.indexOf(e)}))}function se(e,t,n,r){e&&S(e,ae(e,t,n),r)}function ce(e,t){if((!m||k)&&!Zone[e.symbol("patchEvents")]){var r="undefined"!=typeof WebSocket,o=t.__Zone_ignore_on_properties;if(g){var i=window,a=function s(){try{var e=p.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch(e){}return!1}()?[{target:i,ignoreProperties:["error"]}]:[];se(i,ie.concat(["messageerror"]),o?o.concat(a):o,n(i)),se(Document.prototype,ie,o),void 0!==i.SVGElement&&se(i.SVGElement.prototype,ie,o),se(Element.prototype,ie,o),se(HTMLElement.prototype,ie,o),se(HTMLMediaElement.prototype,Y,o),se(HTMLFrameSetElement.prototype,K.concat($),o),se(HTMLBodyElement.prototype,K.concat($),o),se(HTMLFrameElement.prototype,J,o),se(HTMLIFrameElement.prototype,J,o);var c=i.HTMLMarqueeElement;c&&se(c.prototype,ee,o);var u=i.Worker;u&&se(u.prototype,oe,o)}var l=t.XMLHttpRequest;l&&se(l.prototype,te,o);var h=t.XMLHttpRequestEventTarget;h&&se(h&&h.prototype,te,o),"undefined"!=typeof IDBIndex&&(se(IDBIndex.prototype,ne,o),se(IDBRequest.prototype,ne,o),se(IDBOpenDBRequest.prototype,ne,o),se(IDBDatabase.prototype,ne,o),se(IDBTransaction.prototype,ne,o),se(IDBCursor.prototype,ne,o)),r&&se(WebSocket.prototype,re,o)}}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */function ue(){B=Zone.__symbol__,W=Object[B("defineProperty")]=Object.defineProperty,Q=Object[B("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,V=Object.create,X=B("unconfigurables"),Object.defineProperty=function(e,t,n){if(he(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);var r=n.configurable;return"prototype"!==t&&(n=pe(e,t,n)),fe(e,t,n,r)},Object.defineProperties=function(e,t){return Object.keys(t).forEach((function(n){Object.defineProperty(e,n,t[n])})),e},Object.create=function(e,t){return"object"!=typeof t||Object.isFrozen(t)||Object.keys(t).forEach((function(n){t[n]=pe(e,n,t[n])})),V(e,t)},Object.getOwnPropertyDescriptor=function(e,t){var n=Q(e,t);return n&&he(e,t)&&(n.configurable=!1),n}}function le(e,t,n){var r=n.configurable;return fe(e,t,n=pe(e,t,n),r)}function he(e,t){return e&&e[X]&&e[X][t]}function pe(e,t,n){return Object.isFrozen(n)||(n.configurable=!0),n.configurable||(e[X]||Object.isFrozen(e)||W(e,X,{writable:!0,value:{}}),e[X]&&(e[X][t]=!0)),n}function fe(e,t,n,r){try{return W(e,t,n)}catch(a){if(!n.configurable)throw a;void 0===r?delete n.configurable:n.configurable=r;try{return W(e,t,n)}catch(r){var o=!1;if("createdCallback"!==t&&"attachedCallback"!==t&&"detachedCallback"!==t&&"attributeChangedCallback"!==t||(o=!0),!o)throw r;var i=null;try{i=JSON.stringify(n)}catch(e){i=n.toString()}console.log("Attempting to configure '"+t+"' with descriptor '"+i+"' on object '"+e+"' and got error, giving up: "+r)}}}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */function de(e,t){var n=t.getGlobalObjects(),r=n.eventNames,o=n.globalSources,i=n.zoneSymbolEventNames,a=n.TRUE_STR,s=n.FALSE_STR,c=n.ZONE_SYMBOL_PREFIX,u="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),l=[],h=e.wtf,p="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video".split(",");h?l=p.map((function(e){return"HTML"+e+"Element"})).concat(u):e.EventTarget?l.push("EventTarget"):l=u;for(var f=e.__Zone_disable_IE_check||!1,d=e.__Zone_enable_cross_context_check||!1,y=t.isIEOrEdge(),v="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",_={MSPointerCancel:"pointercancel",MSPointerDown:"pointerdown",MSPointerEnter:"pointerenter",MSPointerHover:"pointerhover",MSPointerLeave:"pointerleave",MSPointerMove:"pointermove",MSPointerOut:"pointerout",MSPointerOver:"pointerover",MSPointerUp:"pointerup"},m=0;m<r.length;m++){var g=c+((S=r[m])+s),k=c+(S+a);i[S]={},i[S][s]=g,i[S][a]=k}for(m=0;m<p.length;m++)for(var T=p[m],b=o[T]={},E=0;E<r.length;E++){var S;b[S=r[E]]=T+".addEventListener:"+S}var w=[];for(m=0;m<l.length;m++){var P=e[l[m]];w.push(P&&P.prototype)}return t.patchEventTarget(e,w,{vh:function(e,t,n,r){if(!f&&y){if(d)try{var o;if("[object FunctionWrapper]"===(o=t.toString())||o==v)return e.apply(n,r),!1}catch(t){return e.apply(n,r),!1}else if("[object FunctionWrapper]"===(o=t.toString())||o==v)return e.apply(n,r),!1}else if(d)try{t.toString()}catch(t){return e.apply(n,r),!1}return!0},transferEventName:function(e){return _[e]||e}}),Zone[t.symbol("patchEventTarget")]=!!e.EventTarget,!0}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
function ye(e,t){var n=e.getGlobalObjects();if((!n.isNode||n.isMix)&&!function r(e,t){var n=e.getGlobalObjects();if((n.isBrowser||n.isMix)&&!e.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var r=e.ObjectGetOwnPropertyDescriptor(Element.prototype,"onclick");if(r&&!r.configurable)return!1;if(r){e.ObjectDefineProperty(Element.prototype,"onclick",{enumerable:!0,configurable:!0,get:function(){return!0}});var o=!!document.createElement("div").onclick;return e.ObjectDefineProperty(Element.prototype,"onclick",r),o}}var i=t.XMLHttpRequest;if(!i)return!1;var a=i.prototype,s=e.ObjectGetOwnPropertyDescriptor(a,"onreadystatechange");if(s)return e.ObjectDefineProperty(a,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return!0}}),o=!!(u=new i).onreadystatechange,e.ObjectDefineProperty(a,"onreadystatechange",s||{}),o;var c=e.symbol("fake");e.ObjectDefineProperty(a,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return this[c]},set:function(e){this[c]=e}});var u=new i,l=function(){};return u.onreadystatechange=l,o=u[c]===l,u.onreadystatechange=null,o}(e,t)){var o="undefined"!=typeof WebSocket;!function i(e){for(var t=e.getGlobalObjects().eventNames,n=e.symbol("unbound"),r=function(r){var o=t[r],i="on"+o;self.addEventListener(o,(function(t){var r,o,a=t.target;for(o=a?a.constructor.name+"."+i:"unknown."+i;a;)a[i]&&!a[i][n]&&((r=e.wrapWithCurrentZone(a[i],o))[n]=a[i],a[i]=r),a=a.parentElement}),!0)},o=0;o<t.length;o++)r(o)}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */(e),e.patchClass("XMLHttpRequest"),o&&function a(e,t){var n=e.getGlobalObjects(),r=n.ADD_EVENT_LISTENER_STR,o=n.REMOVE_EVENT_LISTENER_STR,i=t.WebSocket;t.EventTarget||e.patchEventTarget(t,[i.prototype]),t.WebSocket=function(t,n){var a,s,c=arguments.length>1?new i(t,n):new i(t),u=e.ObjectGetOwnPropertyDescriptor(c,"onmessage");return u&&!1===u.configurable?(a=e.ObjectCreate(c),s=c,[r,o,"send","close"].forEach((function(t){a[t]=function(){var n=e.ArraySlice.call(arguments);if(t===r||t===o){var i=n.length>0?n[0]:void 0;if(i){var s=Zone.__symbol__("ON_PROPERTY"+i);c[s]=a[s]}}return c[t].apply(c,n)}}))):a=c,e.patchOnProperties(a,["close","error","message","open"],s),a};var a=t.WebSocket;for(var s in i)a[s]=i[s]}(e,t),Zone[e.symbol("patchEvents")]=!0}}Zone.__load_patch("util",(function(n,i,a){a.patchOnProperties=S,a.patchMethod=Z,a.bindArguments=y,a.patchMacroTask=O;var u=i.__symbol__("BLACK_LISTED_EVENTS"),l=i.__symbol__("UNPATCHED_EVENTS");n[l]&&(n[u]=n[l]),n[u]&&(i[u]=i[l]=n[u]),a.patchEventPrototype=U,a.patchEventTarget=H,a.isIEOrEdge=A,a.ObjectDefineProperty=t,a.ObjectGetOwnPropertyDescriptor=e,a.ObjectCreate=r,a.ArraySlice=o,a.patchClass=P,a.wrapWithCurrentZone=c,a.filterProperties=ae,a.attachOriginToPatched=C,a._redefineProperty=Object.defineProperty,a.patchCallbacks=G,a.getGlobalObjects=function(){return{globalSources:x,zoneSymbolEventNames:R,eventNames:ie,isBrowser:g,isMix:k,isNode:m,TRUE_STR:"true",FALSE_STR:"false",ZONE_SYMBOL_PREFIX:s,ADD_EVENT_LISTENER_STR:"addEventListener",REMOVE_EVENT_LISTENER_STR:"removeEventListener"}}})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
function(e){var t=e.__Zone_symbol_prefix||"__zone_symbol__";e[function n(e){return t+e}("legacyPatch")]=function(){var t=e.Zone;t.__load_patch("defineProperty",(function(e,t,n){n._redefineProperty=le,ue()})),t.__load_patch("registerElement",(function(e,t,n){!function r(e,t){var n=t.getGlobalObjects();(n.isBrowser||n.isMix)&&"registerElement"in e.document&&t.patchCallbacks(t,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}(e,n)})),t.__load_patch("EventTargetLegacy",(function(e,t,n){de(e,n),ye(n,e)}))}}("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{});
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var ve=l("zoneTask");function _e(e,t,n,r){var o=null,i=null;n+=r;var a={};function s(t){var n=t.data;return n.args[0]=function(){return t.invoke.apply(this,arguments)},n.handleId=o.apply(e,n.args),t}function c(t){return i.call(e,t.data.handleId)}o=Z(e,t+=r,(function(n){return function(o,i){if("function"==typeof i[0]){var l={isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?i[1]||0:void 0,args:i},h=i[0];i[0]=function e(){try{return h.apply(this,arguments)}finally{l.isPeriodic||("number"==typeof l.handleId?delete a[l.handleId]:l.handleId&&(l.handleId[ve]=null))}};var p=u(t,i[0],l,s,c);if(!p)return p;var f=p.data.handleId;return"number"==typeof f?a[f]=p:f&&(f[ve]=p),f&&f.ref&&f.unref&&"function"==typeof f.ref&&"function"==typeof f.unref&&(p.ref=f.ref.bind(f),p.unref=f.unref.bind(f)),"number"==typeof f||f?f:p}return n.apply(e,i)}})),i=Z(e,n,(function(t){return function(n,r){var o,i=r[0];"number"==typeof i?o=a[i]:(o=i&&i[ve])||(o=i),o&&"string"==typeof o.type?"notScheduled"!==o.state&&(o.cancelFn&&o.data.isPeriodic||0===o.runCount)&&("number"==typeof i?delete a[i]:i&&(i[ve]=null),o.zone.cancelTask(o)):t.apply(e,r)}}))}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
function me(e,t){if(!Zone[t.symbol("patchEventTarget")]){for(var n=t.getGlobalObjects(),r=n.eventNames,o=n.zoneSymbolEventNames,i=n.TRUE_STR,a=n.FALSE_STR,s=n.ZONE_SYMBOL_PREFIX,c=0;c<r.length;c++){var u=r[c],l=s+(u+a),h=s+(u+i);o[u]={},o[u][a]=l,o[u][i]=h}var p=e.EventTarget;if(p&&p.prototype)return t.patchEventTarget(e,[p&&p.prototype]),!0}}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("legacy",(function(e){var t=e[Zone.__symbol__("legacyPatch")];t&&t()})),Zone.__load_patch("queueMicrotask",(function(e,t,n){n.patchMethod(e,"queueMicrotask",(function(e){return function(e,n){t.current.scheduleMicroTask("queueMicrotask",n[0])}}))})),Zone.__load_patch("timers",(function(e){_e(e,"set","clear","Timeout"),_e(e,"set","clear","Interval"),_e(e,"set","clear","Immediate")})),Zone.__load_patch("requestAnimationFrame",(function(e){_e(e,"request","cancel","AnimationFrame"),_e(e,"mozRequest","mozCancel","AnimationFrame"),_e(e,"webkitRequest","webkitCancel","AnimationFrame")})),Zone.__load_patch("blocking",(function(e,t){for(var n=["alert","prompt","confirm"],r=0;r<n.length;r++)Z(e,n[r],(function(n,r,o){return function(r,i){return t.current.run(n,e,i,o)}}))})),Zone.__load_patch("EventTarget",(function(e,t,n){!function r(e,t){t.patchEventPrototype(e,t)}(e,n),me(e,n);var o=e.XMLHttpRequestEventTarget;o&&o.prototype&&n.patchEventTarget(e,[o.prototype])})),Zone.__load_patch("MutationObserver",(function(e,t,n){P("MutationObserver"),P("WebKitMutationObserver")})),Zone.__load_patch("IntersectionObserver",(function(e,t,n){P("IntersectionObserver")})),Zone.__load_patch("FileReader",(function(e,t,n){P("FileReader")})),Zone.__load_patch("on_property",(function(e,t,n){ce(n,e)})),Zone.__load_patch("customElements",(function(e,t,n){!function r(e,t){var n=t.getGlobalObjects();(n.isBrowser||n.isMix)&&e.customElements&&"customElements"in e&&t.patchCallbacks(t,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,n)})),Zone.__load_patch("XHR",(function(e,t){!function n(e){var n=e.XMLHttpRequest;if(n){var f=n.prototype,d=f[i],y=f[a];if(!d){var v=e.XMLHttpRequestEventTarget;if(v){var _=v.prototype;d=_[i],y=_[a]}}var m=Z(f,"open",(function(){return function(e,t){return e[o]=0==t[2],e[h]=t[1],m.apply(e,t)}})),g=l("fetchTaskAborting"),k=l("fetchTaskScheduling"),T=Z(f,"send",(function(){return function(e,n){if(!0===t.current[k])return T.apply(e,n);if(e[o])return T.apply(e,n);var r={target:e,url:e[h],isPeriodic:!1,args:n,aborted:!1},i=u("XMLHttpRequest.send",S,r,E,w);e&&!0===e[p]&&!r.aborted&&"scheduled"===i.state&&i.invoke()}})),b=Z(f,"abort",(function(){return function(e,n){var o=function i(e){return e[r]}(e);if(o&&"string"==typeof o.type){if(null==o.cancelFn||o.data&&o.data.aborted)return;o.zone.cancelTask(o)}else if(!0===t.current[g])return b.apply(e,n)}}))}function E(e){var n=e.data,o=n.target;o[c]=!1,o[p]=!1;var u=o[s];d||(d=o[i],y=o[a]),u&&y.call(o,"readystatechange",u);var l=o[s]=function(){if(o.readyState===o.DONE)if(!n.aborted&&o[c]&&"scheduled"===e.state){var r=o[t.__symbol__("loadfalse")];if(0!==o.status&&r&&r.length>0){var i=e.invoke;e.invoke=function(){for(var r=o[t.__symbol__("loadfalse")],a=0;a<r.length;a++)r[a]===e&&r.splice(a,1);n.aborted||"scheduled"!==e.state||i.call(e)},r.push(e)}else e.invoke()}else n.aborted||!1!==o[c]||(o[p]=!0)};return d.call(o,"readystatechange",l),o[r]||(o[r]=e),T.apply(o,n.args),o[c]=!0,e}function S(){}function w(e){var t=e.data;return t.aborted=!0,b.apply(t.target,t.args)}}(e);var r=l("xhrTask"),o=l("xhrSync"),s=l("xhrListener"),c=l("xhrScheduled"),h=l("xhrURL"),p=l("xhrErrorBeforeScheduled")})),Zone.__load_patch("geolocation",(function(t){t.navigator&&t.navigator.geolocation&&function n(t,r){for(var o=t.constructor.name,i=function(n){var i=r[n],a=t[i];if(a){if(!v(e(t,i)))return"continue";t[i]=function(e){var t=function(){return e.apply(this,y(arguments,o+"."+i))};return C(t,e),t}(a)}},a=0;a<r.length;a++)i(a)}(t.navigator.geolocation,["getCurrentPosition","watchPosition"])})),Zone.__load_patch("PromiseRejectionEvent",(function(e,t){function n(t){return function(n){q(e,t).forEach((function(r){var o=e.PromiseRejectionEvent;if(o){var i=new o(t,{promise:n.promise,reason:n.rejection});r.invoke(i)}}))}}e.PromiseRejectionEvent&&(t[l("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),t[l("rejectionHandledHandler")]=n("rejectionhandled"))}));
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var ge={},ke="__SEP_TAG__@[native]",Te=function Te(){this.error=Pe(),this.timestamp=new Date};function be(){return new Error("STACKTRACE TRACKING")}function Ee(){try{throw be()}catch(e){return e}}var Se=be(),we=Ee(),Pe=Se.stack?be:we.stack?Ee:be;function Ze(e){return e.stack?e.stack.split("\n"):[]}function Oe(e,t){for(var n=Ze(t),r=0;r<n.length;r++)ge.hasOwnProperty(n[r])||e.push(n[r])}function Ce(e,t){var n=[t?t.trim():""];if(e)for(var r=(new Date).getTime(),o=0;o<e.length;o++){var i=e[o],a=i.timestamp,s="____________________Elapsed "+(r-a.getTime())+" ms; At: "+a;s=s.replace(/[^\w\d]/g,"_"),n.push(ke.replace("__SEP_TAG__",s)),Oe(n,i.error),r=a.getTime()}return n.join("\n")}function De(){return Error.stackTraceLimit>0}Zone.longStackTraceZoneSpec={name:"long-stack-trace",longStackTraceLimit:10,getLongStackTrace:function(e){if(e){var t=e[Zone.__symbol__("currentTaskTrace")];return t?Ce(t,e.stack):e.stack}},onScheduleTask:function(e,t,n,r){if(De()){var o=Zone.currentTask,i=o&&o.data&&o.data.__creationTrace__||[];(i=[new Te].concat(i)).length>this.longStackTraceLimit&&(i.length=this.longStackTraceLimit),r.data||(r.data={}),"eventTask"===r.type&&(r.data=Object.assign({},r.data)),r.data.__creationTrace__=i}return e.scheduleTask(n,r)},onHandleError:function(e,t,n,r){if(De()){var o=Zone.currentTask||r.task;if(r instanceof Error&&o){var i=Ce(o.data&&o.data.__creationTrace__,r.stack);try{r.stack=r.longStack=i}catch(e){}}}return e.handleError(n,r)}},function je(){if(De()){var e=[];!function e(t,n){n>0&&(t.push(Ze((new Te).error)),e(t,n-1))}(e,2);for(var t=e[0],n=e[1],r=0;r<t.length;r++)if(-1==(i=t[r]).indexOf("STACKTRACE TRACKING")){var o=i.match(/^\s*at\s+/);if(o){ke=o[0]+"__SEP_TAG__ (http://localhost)";break}}for(r=0;r<t.length;r++){var i;if((i=t[r])!==n[r])break;ge[i]=!0}}}();
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Ae=function(){function e(e){void 0===e&&(e=null),this.defaultSpecDelegate=e,this.name="ProxyZone",this._delegateSpec=null,this.properties={ProxyZoneSpec:this},this.propertyKeys=null,this.lastTaskState=null,this.isNeedToTriggerHasTask=!1,this.tasks=[],this.setDelegate(e)}return e.get=function(){return Zone.current.get("ProxyZoneSpec")},e.isLoaded=function(){return e.get()instanceof e},e.assertPresent=function(){if(!e.isLoaded())throw new Error("Expected to be running in 'ProxyZone', but it was not found.");return e.get()},e.prototype.setDelegate=function(e){var t=this,n=this._delegateSpec!==e;this._delegateSpec=e,this.propertyKeys&&this.propertyKeys.forEach((function(e){return delete t.properties[e]})),this.propertyKeys=null,e&&e.properties&&(this.propertyKeys=Object.keys(e.properties),this.propertyKeys.forEach((function(n){return t.properties[n]=e.properties[n]}))),n&&this.lastTaskState&&(this.lastTaskState.macroTask||this.lastTaskState.microTask)&&(this.isNeedToTriggerHasTask=!0)},e.prototype.getDelegate=function(){return this._delegateSpec},e.prototype.resetDelegate=function(){this.getDelegate(),this.setDelegate(this.defaultSpecDelegate)},e.prototype.tryTriggerHasTask=function(e,t,n){this.isNeedToTriggerHasTask&&this.lastTaskState&&(this.isNeedToTriggerHasTask=!1,this.onHasTask(e,t,n,this.lastTaskState))},e.prototype.removeFromTasks=function(e){if(this.tasks)for(var t=0;t<this.tasks.length;t++)if(this.tasks[t]===e)return void this.tasks.splice(t,1)},e.prototype.getAndClearPendingTasksInfo=function(){if(0===this.tasks.length)return"";var e="--Pending async tasks are: ["+this.tasks.map((function(e){var t=e.data&&Object.keys(e.data).map((function(t){return t+":"+e.data[t]})).join(",");return"type: "+e.type+", source: "+e.source+", args: {"+t+"}"}))+"]";return this.tasks=[],e},e.prototype.onFork=function(e,t,n,r){return this._delegateSpec&&this._delegateSpec.onFork?this._delegateSpec.onFork(e,t,n,r):e.fork(n,r)},e.prototype.onIntercept=function(e,t,n,r,o){return this._delegateSpec&&this._delegateSpec.onIntercept?this._delegateSpec.onIntercept(e,t,n,r,o):e.intercept(n,r,o)},e.prototype.onInvoke=function(e,t,n,r,o,i,a){return this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onInvoke?this._delegateSpec.onInvoke(e,t,n,r,o,i,a):e.invoke(n,r,o,i,a)},e.prototype.onHandleError=function(e,t,n,r){return this._delegateSpec&&this._delegateSpec.onHandleError?this._delegateSpec.onHandleError(e,t,n,r):e.handleError(n,r)},e.prototype.onScheduleTask=function(e,t,n,r){return"eventTask"!==r.type&&this.tasks.push(r),this._delegateSpec&&this._delegateSpec.onScheduleTask?this._delegateSpec.onScheduleTask(e,t,n,r):e.scheduleTask(n,r)},e.prototype.onInvokeTask=function(e,t,n,r,o,i){return"eventTask"!==r.type&&this.removeFromTasks(r),this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onInvokeTask?this._delegateSpec.onInvokeTask(e,t,n,r,o,i):e.invokeTask(n,r,o,i)},e.prototype.onCancelTask=function(e,t,n,r){return"eventTask"!==r.type&&this.removeFromTasks(r),this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onCancelTask?this._delegateSpec.onCancelTask(e,t,n,r):e.cancelTask(n,r)},e.prototype.onHasTask=function(e,t,n,r){this.lastTaskState=r,this._delegateSpec&&this._delegateSpec.onHasTask?this._delegateSpec.onHasTask(e,t,n,r):e.hasTask(n,r)},e}();Zone.ProxyZoneSpec=Ae;
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Ie=function(){function e(e){this.runZone=Zone.current,this.name="syncTestZone for "+e}return e.prototype.onScheduleTask=function(e,t,n,r){switch(r.type){case"microTask":case"macroTask":throw new Error("Cannot call "+r.source+" from within a sync test.");case"eventTask":r=e.scheduleTask(n,r)}return r},e}();Zone.SyncTestZoneSpec=Ie,
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("jasmine",(function(e,t,n){if(!t)throw new Error("Missing: zone.js");if("undefined"==typeof jest&&"undefined"!=typeof jasmine&&!jasmine.__zone_patch__){jasmine.__zone_patch__=!0;var r=t.SyncTestZoneSpec,o=t.ProxyZoneSpec;if(!r)throw new Error("Missing: SyncTestZoneSpec");if(!o)throw new Error("Missing: ProxyZoneSpec");var i=t.current,a=i.fork(new r("jasmine.describe")),s=t.__symbol__,c=!0===e[s("fakeAsyncDisablePatchingClock")],u=!c&&(!0===e[s("fakeAsyncPatchLock")]||!0===e[s("fakeAsyncAutoFakeAsyncWhenClockPatched")]);if(!0!==e[s("ignoreUnhandledRejection")]){var l=jasmine.GlobalErrors;l&&!jasmine[s("GlobalErrors")]&&(jasmine[s("GlobalErrors")]=l,jasmine.GlobalErrors=function(){var e=new l,t=e.install;return t&&!e[s("install")]&&(e[s("install")]=t,e.install=function(){var e=process.listeners("unhandledRejection"),n=t.apply(this,arguments);return process.removeAllListeners("unhandledRejection"),e&&e.forEach((function(e){return process.on("unhandledRejection",e)})),n}),e})}var h=jasmine.getEnv();if(["describe","xdescribe","fdescribe"].forEach((function(e){var t=h[e];h[e]=function(e,n){return t.call(this,e,function r(e){return function(){return a.run(e,this,arguments)}}(n))}})),["it","xit","fit"].forEach((function(e){var t=h[e];h[s(e)]=t,h[e]=function(e,n,r){return arguments[1]=v(n),t.apply(this,arguments)}})),["beforeEach","afterEach","beforeAll","afterAll"].forEach((function(e){var t=h[e];h[s(e)]=t,h[e]=function(e,n){return arguments[0]=v(e),t.apply(this,arguments)}})),!c){var p=jasmine[s("clock")]=jasmine.clock;jasmine.clock=function(){var e=p.apply(this,arguments);if(!e[s("patched")]){e[s("patched")]=s("patched");var n=e[s("tick")]=e.tick;e.tick=function(){var e=t.current.get("FakeAsyncTestZoneSpec");return e?e.tick.apply(e,arguments):n.apply(this,arguments)};var r=e[s("mockDate")]=e.mockDate;e.mockDate=function(){var e=t.current.get("FakeAsyncTestZoneSpec");if(e){var n=arguments.length>0?arguments[0]:new Date;return e.setFakeBaseSystemTime.apply(e,n&&"function"==typeof n.getTime?[n.getTime()]:arguments)}return r.apply(this,arguments)},u&&["install","uninstall"].forEach((function(n){var r=e[s(n)]=e[n];e[n]=function(){var e=t.FakeAsyncTestZoneSpec;if(!e)return r.apply(this,arguments);jasmine[s("clockInstalled")]="install"===n}}))}return e}}if(!jasmine[t.__symbol__("createSpyObj")]){var f=jasmine.createSpyObj;jasmine[t.__symbol__("createSpyObj")]=f,jasmine.createSpyObj=function(){var e,t=Array.prototype.slice.call(arguments),n=t.length>=3?t[2]:null;if(n){var r=Object.defineProperty;Object.defineProperty=function(e,t,n){return r.call(this,e,t,Object.assign(Object.assign({},n),{configurable:!0,enumerable:!0}))};try{e=f.apply(this,t)}finally{Object.defineProperty=r}}else e=f.apply(this,t);return e}}var d=jasmine.QueueRunner;jasmine.QueueRunner=function(n){function r(r){var o,a=this;r.onComplete&&(r.onComplete=(o=r.onComplete,function(){a.testProxyZone=null,a.testProxyZoneSpec=null,i.scheduleMicroTask("jasmine.onComplete",o)}));var s=e[t.__symbol__("setTimeout")],c=e[t.__symbol__("clearTimeout")];s&&(r.timeout={setTimeout:s||e.setTimeout,clearTimeout:c||e.clearTimeout}),jasmine.UserContext?(r.userContext||(r.userContext=new jasmine.UserContext),r.userContext.queueRunner=this):(r.userContext||(r.userContext={}),r.userContext.queueRunner=this);var u=r.onException;r.onException=function(e){if(e&&"Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL."===e.message){var t=this&&this.testProxyZoneSpec;if(t){var n=t.getAndClearPendingTasksInfo();try{e.message+=n}catch(e){}}}u&&u.call(this,e)},n.call(this,r)}return function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);function r(){this.constructor=e}e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}(r,n),r.prototype.execute=function(){for(var e=this,r=t.current,a=!1;r;){if(r===i){a=!0;break}r=r.parent}if(!a)throw new Error("Unexpected Zone: "+t.current.name);this.testProxyZoneSpec=new o,this.testProxyZone=i.fork(this.testProxyZoneSpec),t.currentTask?n.prototype.execute.call(this):t.current.scheduleMicroTask("jasmine.execute().forceTask",(function(){return d.prototype.execute.call(e)}))},r}(d)}function y(e,n,r,o){var i=!!jasmine[s("clockInstalled")],a=r.testProxyZone;if(i&&u){var c=t[t.__symbol__("fakeAsyncTest")];c&&"function"==typeof c.fakeAsync&&(e=c.fakeAsync(e))}return o?a.run(e,n,[o]):a.run(e,n)}function v(e){return e&&(e.length?function(t){return y(e,this,this.queueRunner,t)}:function(){return y(e,this,this.queueRunner)})}})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("jest",(function(e,t,n){if("undefined"!=typeof jest&&!jest.__zone_patch__){jest.__zone_patch__=!0;var r=t.ProxyZoneSpec,o=t.SyncTestZoneSpec;if(!r)throw new Error("Missing ProxyZoneSpec");var i=t.current,a=i.fork(new o("jest.describe")),s=new r,c=i.fork(s);["describe","xdescribe","fdescribe"].forEach((function(n){var r=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=r,e[n]=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1]=u(e[1]),r.apply(this,e)},e[n].each=function o(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=e.apply(this,t);return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1]=u(e[1]),r.apply(this,e)}}}(r.each))})),e.describe.only=e.fdescribe,e.describe.skip=e.xdescribe,["it","xit","fit","test","xtest"].forEach((function(n){var r=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=r,e[n]=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1]=l(e[1],!0),r.apply(this,e)},e[n].each=function o(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];return n[1]=l(n[1]),e.apply(this,t).apply(this,n)}}}(r.each),e[n].todo=r.todo)})),e.it.only=e.fit,e.it.skip=e.xit,e.test.only=e.fit,e.test.skip=e.xit,["beforeEach","afterEach","beforeAll","afterAll"].forEach((function(n){var r=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=r,e[n]=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[0]=l(e[0]),r.apply(this,e)})})),t.patchJestObject=function e(r,o){function i(){return!!t.current.get("FakeAsyncTestZoneSpec")}function a(){var e=t.current.get("ProxyZoneSpec");return e&&e.isTestFunc}void 0===o&&(o=!1),r[n.symbol("fakeTimers")]||(r[n.symbol("fakeTimers")]=!0,n.patchMethod(r,"_checkFakeTimers",(function(e){return function(t,n){return!!i()||e.apply(t,n)}})),n.patchMethod(r,"useFakeTimers",(function(e){return function(r,i){return t[n.symbol("useFakeTimersCalled")]=!0,o||a()?e.apply(r,i):r}})),n.patchMethod(r,"useRealTimers",(function(e){return function(r,i){return t[n.symbol("useFakeTimersCalled")]=!1,o||a()?e.apply(r,i):r}})),n.patchMethod(r,"setSystemTime",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");if(!o||!i())return e.apply(n,r);o.setFakeBaseSystemTime(r[0])}})),n.patchMethod(r,"getRealSystemTime",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");return o&&i()?o.getRealSystemTime():e.apply(n,r)}})),n.patchMethod(r,"runAllTicks",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");if(!o)return e.apply(n,r);o.flushMicrotasks()}})),n.patchMethod(r,"runAllTimers",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");if(!o)return e.apply(n,r);o.flush(100,!0)}})),n.patchMethod(r,"advanceTimersByTime",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");if(!o)return e.apply(n,r);o.tick(r[0])}})),n.patchMethod(r,"runOnlyPendingTimers",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");if(!o)return e.apply(n,r);o.flushOnlyPendingTimers()}})),n.patchMethod(r,"advanceTimersToNextTimer",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");if(!o)return e.apply(n,r);o.tickToNext(r[0])}})),n.patchMethod(r,"clearAllTimers",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");if(!o)return e.apply(n,r);o.removeAllTimers()}})),n.patchMethod(r,"getTimerCount",(function(e){return function(n,r){var o=t.current.get("FakeAsyncTestZoneSpec");return o?o.getTimerCount():e.apply(n,r)}})))}}function u(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return a.run(e,this,t)}}function l(e,r){if(void 0===r&&(r=!1),"function"!=typeof e)return e;var o=function(){if(!0===t[n.symbol("useFakeTimersCalled")]&&e&&!e.isFakeAsync){var o=t[t.__symbol__("fakeAsyncTest")];o&&"function"==typeof o.fakeAsync&&(e=o.fakeAsync(e))}return s.isTestFunc=r,c.run(e,null,arguments)};return Object.defineProperty(o,"length",{configurable:!0,writable:!0,enumerable:!1}),o.length=e.length,o}})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("mocha",(function(e,t){var n=e.Mocha;if(void 0!==n){if(void 0===t)throw new Error("Missing Zone.js");var r=t.ProxyZoneSpec,o=t.SyncTestZoneSpec;if(!r)throw new Error("Missing ProxyZoneSpec");if(n.__zone_patch__)throw new Error('"Mocha" has already been patched with "Zone".');n.__zone_patch__=!0;var i,a,s=t.current,c=s.fork(new o("Mocha.describe")),u=null,l=s.fork(new r),h={after:n.after,afterEach:n.afterEach,before:n.before,beforeEach:n.beforeEach,describe:n.describe,it:n.it};e.describe=e.suite=n.describe=function(){return h.describe.apply(this,f(arguments))},e.xdescribe=e.suite.skip=n.describe.skip=function(){return h.describe.skip.apply(this,f(arguments))},e.describe.only=e.suite.only=n.describe.only=function(){return h.describe.only.apply(this,f(arguments))},e.it=e.specify=e.test=n.it=function(){return h.it.apply(this,d(arguments))},e.xit=e.xspecify=n.it.skip=function(){return h.it.skip.apply(this,d(arguments))},e.it.only=e.test.only=n.it.only=function(){return h.it.only.apply(this,d(arguments))},e.after=e.suiteTeardown=n.after=function(){return h.after.apply(this,y(arguments))},e.afterEach=e.teardown=n.afterEach=function(){return h.afterEach.apply(this,d(arguments))},e.before=e.suiteSetup=n.before=function(){return h.before.apply(this,y(arguments))},e.beforeEach=e.setup=n.beforeEach=function(){return h.beforeEach.apply(this,d(arguments))},i=n.Runner.prototype.runTest,a=n.Runner.prototype.run,n.Runner.prototype.runTest=function(e){var n=this;t.current.scheduleMicroTask("mocha.forceTask",(function(){i.call(n,e)}))},n.Runner.prototype.run=function(e){return this.on("test",(function(e){u=s.fork(new r)})),this.on("fail",(function(e,t){var n=u&&u.get("ProxyZoneSpec");if(n&&t)try{t.message+=n.getAndClearPendingTasksInfo()}catch(e){}})),a.call(this,e)}}function p(e,t,n){for(var r=function(r){var o=e[r];"function"==typeof o&&(e[r]=0===o.length?t(o):n(o),e[r].toString=function(){return o.toString()})},o=0;o<e.length;o++)r(o);return e}function f(e){return p(e,(function(e){return function(){return c.run(e,this,arguments)}}))}function d(e){return p(e,(function(e){return function(){return u.run(e,this)}}),(function(e){return function(t){return u.run(e,this,[t])}}))}function y(e){return p(e,(function(e){return function(){return l.run(e,this)}}),(function(e){return function(t){return l.run(e,this,[t])}}))}})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
function(e){var t=function(){function t(t,n,r){this.finishCallback=t,this.failCallback=n,this._pendingMicroTasks=!1,this._pendingMacroTasks=!1,this._alreadyErrored=!1,this._isSync=!1,this.runZone=Zone.current,this.unresolvedChainedPromiseCount=0,this.supportWaitUnresolvedChainedPromise=!1,this.name="asyncTestZone for "+r,this.properties={AsyncTestZoneSpec:this},this.supportWaitUnresolvedChainedPromise=!0===e[Zone.__symbol__("supportWaitUnResolvedChainedPromise")]}return t.prototype.isUnresolvedChainedPromisePending=function(){return this.unresolvedChainedPromiseCount>0},t.prototype._finishCallbackIfDone=function(){var e=this;this._pendingMicroTasks||this._pendingMacroTasks||this.supportWaitUnresolvedChainedPromise&&this.isUnresolvedChainedPromisePending()||this.runZone.run((function(){setTimeout((function(){e._alreadyErrored||e._pendingMicroTasks||e._pendingMacroTasks||e.finishCallback()}),0)}))},t.prototype.patchPromiseForTest=function(){if(this.supportWaitUnresolvedChainedPromise){var e=Promise[Zone.__symbol__("patchPromiseForTest")];e&&e()}},t.prototype.unPatchPromiseForTest=function(){if(this.supportWaitUnresolvedChainedPromise){var e=Promise[Zone.__symbol__("unPatchPromiseForTest")];e&&e()}},t.prototype.onScheduleTask=function(e,n,r,o){return"eventTask"!==o.type&&(this._isSync=!1),"microTask"===o.type&&o.data&&o.data instanceof Promise&&!0===o.data[t.symbolParentUnresolved]&&this.unresolvedChainedPromiseCount--,e.scheduleTask(r,o)},t.prototype.onInvokeTask=function(e,t,n,r,o,i){return"eventTask"!==r.type&&(this._isSync=!1),e.invokeTask(n,r,o,i)},t.prototype.onCancelTask=function(e,t,n,r){return"eventTask"!==r.type&&(this._isSync=!1),e.cancelTask(n,r)},t.prototype.onInvoke=function(e,t,n,r,o,i,a){try{return this._isSync=!0,e.invoke(n,r,o,i,a)}finally{this._isSync&&this._finishCallbackIfDone()}},t.prototype.onHandleError=function(e,t,n,r){return e.handleError(n,r)&&(this.failCallback(r),this._alreadyErrored=!0),!1},t.prototype.onHasTask=function(e,t,n,r){e.hasTask(n,r),"microTask"==r.change?(this._pendingMicroTasks=r.microTask,this._finishCallbackIfDone()):"macroTask"==r.change&&(this._pendingMacroTasks=r.macroTask,this._finishCallbackIfDone())},t}();t.symbolParentUnresolved=Zone.__symbol__("parentUnresolved"),Zone.AsyncTestZoneSpec=t}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global),Zone.__load_patch("asynctest",(function(e,t,n){function r(e,n,r,o){var i=t.current,a=t.AsyncTestZoneSpec;if(void 0===a)throw new Error("AsyncTestZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/dist/async-test.js");var s=t.ProxyZoneSpec;if(!s)throw new Error("ProxyZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/dist/proxy.js");var c=s.get();s.assertPresent();var u=t.current.getZoneWith("ProxyZoneSpec"),l=c.getDelegate();return u.parent.run((function(){var e=new a((function(){c.getDelegate()==e&&c.setDelegate(l),e.unPatchPromiseForTest(),i.run((function(){r()}))}),(function(t){c.getDelegate()==e&&c.setDelegate(l),e.unPatchPromiseForTest(),i.run((function(){o(t)}))}),"test");c.setDelegate(e),e.patchPromiseForTest()})),t.current.runGuarded(e,n)}t[n.symbol("asyncTest")]=function t(n){return e.jasmine?function(e){e||((e=function(){}).fail=function(e){throw e}),r(n,this,e,(function(t){if("string"==typeof t)return e.fail(new Error(t));e.fail(t)}))}:function(){var e=this;return new Promise((function(t,o){r(n,e,t,o)}))}}})),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
function(e){var t=e.Date;function n(){if(0===arguments.length){var e=new t;return e.setTime(n.now()),e}var r=Array.prototype.slice.call(arguments);return new(t.bind.apply(t,__spreadArrays([void 0],r)))}n.now=function(){var e=Zone.current.get("FakeAsyncTestZoneSpec");return e?e.getFakeSystemTime():t.now.apply(this,arguments)},n.UTC=t.UTC,n.parse=t.parse;var r={setTimeout:e.setTimeout,setInterval:e.setInterval,clearTimeout:e.clearTimeout,clearInterval:e.clearInterval},o=function(){function n(){this._schedulerQueue=[],this._currentTickTime=0,this._currentFakeBaseSystemTime=t.now(),this._currentTickRequeuePeriodicEntries=[]}return n.prototype.getCurrentTickTime=function(){return this._currentTickTime},n.prototype.getFakeSystemTime=function(){return this._currentFakeBaseSystemTime+this._currentTickTime},n.prototype.setFakeBaseSystemTime=function(e){this._currentFakeBaseSystemTime=e},n.prototype.getRealSystemTime=function(){return t.now()},n.prototype.scheduleFunction=function(e,t,r){var o=(r=Object.assign({args:[],isPeriodic:!1,isRequestAnimationFrame:!1,id:-1,isRequeuePeriodic:!1},r)).id<0?n.nextId++:r.id,i={endTime:this._currentTickTime+t,id:o,func:e,args:r.args,delay:t,isPeriodic:r.isPeriodic,isRequestAnimationFrame:r.isRequestAnimationFrame};r.isRequeuePeriodic&&this._currentTickRequeuePeriodicEntries.push(i);for(var a=0;a<this._schedulerQueue.length&&!(i.endTime<this._schedulerQueue[a].endTime);a++);return this._schedulerQueue.splice(a,0,i),o},n.prototype.removeScheduledFunctionWithId=function(e){for(var t=0;t<this._schedulerQueue.length;t++)if(this._schedulerQueue[t].id==e){this._schedulerQueue.splice(t,1);break}},n.prototype.removeAll=function(){this._schedulerQueue=[]},n.prototype.getTimerCount=function(){return this._schedulerQueue.length},n.prototype.tickToNext=function(e,t,n){void 0===e&&(e=1),this._schedulerQueue.length<e||this.tick(this._schedulerQueue[e-1].endTime-this._currentTickTime,t,n)},n.prototype.tick=function(t,n,r){void 0===t&&(t=0);var o=this._currentTickTime+t,i=0,a=(r=Object.assign({processNewMacroTasksSynchronously:!0},r)).processNewMacroTasksSynchronously?this._schedulerQueue:this._schedulerQueue.slice();if(0===a.length&&n)n(t);else{for(;a.length>0&&(this._currentTickRequeuePeriodicEntries=[],!(o<a[0].endTime));){var s=a.shift();if(!r.processNewMacroTasksSynchronously){var c=this._schedulerQueue.indexOf(s);c>=0&&this._schedulerQueue.splice(c,1)}if(i=this._currentTickTime,this._currentTickTime=s.endTime,n&&n(this._currentTickTime-i),!s.func.apply(e,s.isRequestAnimationFrame?[this._currentTickTime]:s.args))break;r.processNewMacroTasksSynchronously||this._currentTickRequeuePeriodicEntries.forEach((function(e){for(var t=0;t<a.length&&!(e.endTime<a[t].endTime);t++);a.splice(t,0,e)}))}i=this._currentTickTime,this._currentTickTime=o,n&&n(this._currentTickTime-i)}},n.prototype.flushOnlyPendingTimers=function(e){if(0===this._schedulerQueue.length)return 0;var t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e,{processNewMacroTasksSynchronously:!1}),this._currentTickTime-t},n.prototype.flush=function(e,t,n){return void 0===e&&(e=20),void 0===t&&(t=!1),t?this.flushPeriodic(n):this.flushNonPeriodic(e,n)},n.prototype.flushPeriodic=function(e){if(0===this._schedulerQueue.length)return 0;var t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e),this._currentTickTime-t},n.prototype.flushNonPeriodic=function(t,n){for(var r=this._currentTickTime,o=0,i=0;this._schedulerQueue.length>0;){if(++i>t)throw new Error("flush failed after reaching the limit of "+t+" tasks. Does your code use a polling timeout?");if(0===this._schedulerQueue.filter((function(e){return!e.isPeriodic&&!e.isRequestAnimationFrame})).length)break;var a=this._schedulerQueue.shift();if(o=this._currentTickTime,this._currentTickTime=a.endTime,n&&n(this._currentTickTime-o),!a.func.apply(e,a.args))break}return this._currentTickTime-r},n}();o.nextId=1;var i=function(){function i(t,n,r){void 0===n&&(n=!1),this.trackPendingRequestAnimationFrame=n,this.macroTaskOptions=r,this._scheduler=new o,this._microtasks=[],this._lastError=null,this._uncaughtPromiseErrors=Promise[Zone.__symbol__("uncaughtPromiseErrors")],this.pendingPeriodicTimers=[],this.pendingTimers=[],this.patchDateLocked=!1,this.properties={FakeAsyncTestZoneSpec:this},this.name="fakeAsyncTestZone for "+t,this.macroTaskOptions||(this.macroTaskOptions=e[Zone.__symbol__("FakeAsyncTestMacroTask")])}return i.assertInZone=function(){if(null==Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("The code should be running in the fakeAsync zone to call this function")},i.prototype._fnAndFlush=function(t,n){var r=this;return function(){for(var o=[],i=0;i<arguments.length;i++)o[i]=arguments[i];return t.apply(e,o),null===r._lastError?(null!=n.onSuccess&&n.onSuccess.apply(e),r.flushMicrotasks()):null!=n.onError&&n.onError.apply(e),null===r._lastError}},i._removeTimer=function(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)},i.prototype._dequeueTimer=function(e){var t=this;return function(){i._removeTimer(t.pendingTimers,e)}},i.prototype._requeuePeriodicTimer=function(e,t,n,r){var o=this;return function(){-1!==o.pendingPeriodicTimers.indexOf(r)&&o._scheduler.scheduleFunction(e,t,{args:n,isPeriodic:!0,id:r,isRequeuePeriodic:!0})}},i.prototype._dequeuePeriodicTimer=function(e){var t=this;return function(){i._removeTimer(t.pendingPeriodicTimers,e)}},i.prototype._setTimeout=function(e,t,n,r){void 0===r&&(r=!0);var i=this._dequeueTimer(o.nextId),a=this._fnAndFlush(e,{onSuccess:i,onError:i}),s=this._scheduler.scheduleFunction(a,t,{args:n,isRequestAnimationFrame:!r});return r&&this.pendingTimers.push(s),s},i.prototype._clearTimeout=function(e){i._removeTimer(this.pendingTimers,e),this._scheduler.removeScheduledFunctionWithId(e)},i.prototype._setInterval=function(e,t,n){var r=o.nextId,i={onSuccess:null,onError:this._dequeuePeriodicTimer(r)},a=this._fnAndFlush(e,i);return i.onSuccess=this._requeuePeriodicTimer(a,t,n,r),this._scheduler.scheduleFunction(a,t,{args:n,isPeriodic:!0}),this.pendingPeriodicTimers.push(r),r},i.prototype._clearInterval=function(e){i._removeTimer(this.pendingPeriodicTimers,e),this._scheduler.removeScheduledFunctionWithId(e)},i.prototype._resetLastErrorAndThrow=function(){var e=this._lastError||this._uncaughtPromiseErrors[0];throw this._uncaughtPromiseErrors.length=0,this._lastError=null,e},i.prototype.getCurrentTickTime=function(){return this._scheduler.getCurrentTickTime()},i.prototype.getFakeSystemTime=function(){return this._scheduler.getFakeSystemTime()},i.prototype.setFakeBaseSystemTime=function(e){this._scheduler.setFakeBaseSystemTime(e)},i.prototype.getRealSystemTime=function(){return this._scheduler.getRealSystemTime()},i.patchDate=function(){e[Zone.__symbol__("disableDatePatching")]||e.Date!==n&&(e.Date=n,n.prototype=t.prototype,i.checkTimerPatch())},i.resetDate=function(){e.Date===n&&(e.Date=t)},i.checkTimerPatch=function(){e.setTimeout!==r.setTimeout&&(e.setTimeout=r.setTimeout,e.clearTimeout=r.clearTimeout),e.setInterval!==r.setInterval&&(e.setInterval=r.setInterval,e.clearInterval=r.clearInterval)},i.prototype.lockDatePatch=function(){this.patchDateLocked=!0,i.patchDate()},i.prototype.unlockDatePatch=function(){this.patchDateLocked=!1,i.resetDate()},i.prototype.tickToNext=function(e,t,n){void 0===e&&(e=1),void 0===n&&(n={processNewMacroTasksSynchronously:!0}),e<=0||(i.assertInZone(),this.flushMicrotasks(),this._scheduler.tickToNext(e,t,n),null!==this._lastError&&this._resetLastErrorAndThrow())},i.prototype.tick=function(e,t,n){void 0===e&&(e=0),void 0===n&&(n={processNewMacroTasksSynchronously:!0}),i.assertInZone(),this.flushMicrotasks(),this._scheduler.tick(e,t,n),null!==this._lastError&&this._resetLastErrorAndThrow()},i.prototype.flushMicrotasks=function(){for(i.assertInZone();this._microtasks.length>0;){var e=this._microtasks.shift();e.func.apply(e.target,e.args)}(null!==this._lastError||this._uncaughtPromiseErrors.length)&&this._resetLastErrorAndThrow()},i.prototype.flush=function(e,t,n){i.assertInZone(),this.flushMicrotasks();var r=this._scheduler.flush(e,t,n);return null!==this._lastError&&this._resetLastErrorAndThrow(),r},i.prototype.flushOnlyPendingTimers=function(e){i.assertInZone(),this.flushMicrotasks();var t=this._scheduler.flushOnlyPendingTimers(e);return null!==this._lastError&&this._resetLastErrorAndThrow(),t},i.prototype.removeAllTimers=function(){i.assertInZone(),this._scheduler.removeAll(),this.pendingPeriodicTimers=[],this.pendingTimers=[]},i.prototype.getTimerCount=function(){return this._scheduler.getTimerCount()+this._microtasks.length},i.prototype.onScheduleTask=function(e,t,n,r){switch(r.type){case"microTask":var o=r.data&&r.data.args,i=void 0;if(o){var a=r.data.cbIdx;"number"==typeof o.length&&o.length>a+1&&(i=Array.prototype.slice.call(o,a+1))}this._microtasks.push({func:r.invoke,args:i,target:r.data&&r.data.target});break;case"macroTask":switch(r.source){case"setTimeout":r.data.handleId=this._setTimeout(r.invoke,r.data.delay,Array.prototype.slice.call(r.data.args,2));break;case"setImmediate":r.data.handleId=this._setTimeout(r.invoke,0,Array.prototype.slice.call(r.data.args,1));break;case"setInterval":r.data.handleId=this._setInterval(r.invoke,r.data.delay,Array.prototype.slice.call(r.data.args,2));break;case"XMLHttpRequest.send":throw new Error("Cannot make XHRs from within a fake async test. Request URL: "+r.data.url);case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":r.data.handleId=this._setTimeout(r.invoke,16,r.data.args,this.trackPendingRequestAnimationFrame);break;default:var s=this.findMacroTaskOption(r);if(s){var c=r.data&&r.data.args,u=c&&c.length>1?c[1]:0,l=s.callbackArgs?s.callbackArgs:c;s.isPeriodic?(r.data.handleId=this._setInterval(r.invoke,u,l),r.data.isPeriodic=!0):r.data.handleId=this._setTimeout(r.invoke,u,l);break}throw new Error("Unknown macroTask scheduled in fake async test: "+r.source)}break;case"eventTask":r=e.scheduleTask(n,r)}return r},i.prototype.onCancelTask=function(e,t,n,r){switch(r.source){case"setTimeout":case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":return this._clearTimeout(r.data.handleId);case"setInterval":return this._clearInterval(r.data.handleId);default:var o=this.findMacroTaskOption(r);if(o){var i=r.data.handleId;return o.isPeriodic?this._clearInterval(i):this._clearTimeout(i)}return e.cancelTask(n,r)}},i.prototype.onInvoke=function(e,t,n,r,o,a,s){try{return i.patchDate(),e.invoke(n,r,o,a,s)}finally{this.patchDateLocked||i.resetDate()}},i.prototype.findMacroTaskOption=function(e){if(!this.macroTaskOptions)return null;for(var t=0;t<this.macroTaskOptions.length;t++){var n=this.macroTaskOptions[t];if(n.source===e.source)return n}return null},i.prototype.onHandleError=function(e,t,n,r){return this._lastError=r,!1},i}();Zone.FakeAsyncTestZoneSpec=i}("object"==typeof window&&window||"object"==typeof self&&self||global),Zone.__load_patch("fakeasync",(function(e,t,n){var r=t&&t.FakeAsyncTestZoneSpec;function o(){return t&&t.ProxyZoneSpec}var i=null;function a(){i&&i.unlockDatePatch(),i=null,o()&&o().assertPresent().resetDelegate()}function s(){if(null==i&&null==(i=t.current.get("FakeAsyncTestZoneSpec")))throw new Error("The code should be running in the fakeAsync zone to call this function");return i}function c(){s().flushMicrotasks()}t[n.symbol("fakeAsyncTest")]={resetFakeAsyncZone:a,flushMicrotasks:c,discardPeriodicTasks:function u(){s().pendingPeriodicTimers.length=0},tick:function l(e,t){void 0===e&&(e=0),void 0===t&&(t=!1),s().tick(e,null,t)},flush:function h(e){return s().flush(e)},fakeAsync:function p(e){var n=function(){for(var n=[],s=0;s<arguments.length;s++)n[s]=arguments[s];var u=o();if(!u)throw new Error("ProxyZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/dist/proxy.js");var l=u.assertPresent();if(t.current.get("FakeAsyncTestZoneSpec"))throw new Error("fakeAsync() calls can not be nested");try{if(!i){if(l.getDelegate()instanceof r)throw new Error("fakeAsync() calls can not be nested");i=new r}var h=void 0,p=l.getDelegate();l.setDelegate(i),i.lockDatePatch();try{h=e.apply(this,n),c()}finally{l.setDelegate(p)}if(i.pendingPeriodicTimers.length>0)throw new Error(i.pendingPeriodicTimers.length+" periodic timer(s) still in the queue.");if(i.pendingTimers.length>0)throw new Error(i.pendingTimers.length+" timer(s) still in the queue.");return h}finally{a()}};return n.isFakeAsync=!0,n}}}),!0),
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
Zone.__load_patch("promisefortest",(function(e,t,n){var r=n.symbol("state"),o=n.symbol("parentUnresolved");Promise[n.symbol("patchPromiseForTest")]=function e(){var n=Promise[t.__symbol__("ZonePromiseThen")];n||(n=Promise[t.__symbol__("ZonePromiseThen")]=Promise.prototype.then,Promise.prototype.then=function(){var e=n.apply(this,arguments);if(null===this[r]){var i=t.current.get("AsyncTestZoneSpec");i&&(i.unresolvedChainedPromiseCount++,e[o]=!0)}return e})},Promise[n.symbol("unPatchPromiseForTest")]=function e(){var n=Promise[t.__symbol__("ZonePromiseThen")];n&&(Promise.prototype.then=n,Promise[t.__symbol__("ZonePromiseThen")]=void 0)}}))}));