--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [05:28:36.283] Vidbot :: start() [05:28:36.284] Vidbot :: _next(), _stepIndex:0 of 4 [05:28:36.284] index :: _onStepStarted_vidbot(), step: 1 [05:28:36.285] Vidbot :: step[0], label:Initializing Core [05:28:36.295] index :: _onStepProgress_vidbot(), percent: 20 [05:28:36.295] Vidbot :: _parse() [05:28:36.296] index :: _onStepProgress_vidbot(), percent: 40 [05:28:36.297] Vidbot :: _validate() [05:28:36.297] index :: _onStepProgress_vidbot(), percent: 60 [05:28:36.298] Vidbot :: _fonts() [05:28:36.298] FabricFontManager :: add(), id: SourceSansPro-Bold [05:28:36.298] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [05:28:36.307] FabricFontManager :: add(), id: SourceSansPro-Light [05:28:36.307] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [05:28:36.308] FabricFontManager :: add(), id: DINOT-Bold [05:28:36.308] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [05:28:36.309] FabricFontManager :: add(), id: DINOT-Light [05:28:36.309] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [05:28:36.309] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [05:28:36.309] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [05:28:36.310] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [05:28:36.310] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [05:28:36.311] index :: _onStepProgress_vidbot(), percent: 80 [05:28:36.312] Vidbot :: _clips() [05:28:36.312] StreamManager :: add(), id:audio_vo, type:audio [05:28:36.313] AudioClip[audio_vo] :: constructor() [05:28:36.313] InputStream[audio_vo] :: constructor() [05:28:36.313] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [05:28:36.317] StreamManager :: add(), id:bg_music, type:audio [05:28:36.317] AudioClip[bg_music] :: constructor() [05:28:36.317] InputStream[bg_music] :: constructor() [05:28:36.317] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [05:28:36.317] StreamManager :: add(), id:intro, type:video [05:28:36.318] VideoStream[intro] :: constructor() [05:28:36.318] InputStream[intro] :: constructor() [05:28:36.318] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'intro', clipId: null } [05:28:36.318] StreamManager :: add(), id:simplefadedisplay, type:canvas [05:28:36.318] CanvasStream[canvas_1570589403506] :: constructor() [05:28:36.318] InputStream[canvas_1570589403506] :: constructor() [05:28:36.401] KenBurnsSlideshow[simplefadedisplay] :: constructor() [05:28:36.401] Overlay[simplefadedisplay] :: constructor() [05:28:36.401] CanvasClip[simplefadedisplay] :: constructor() [05:28:36.402] Clip[simplefadedisplay] :: constructor() [05:28:36.402] clip:"simplefadedisplay" added to stream:"canvas_1570589403506" [05:28:36.402] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1570589403506', clipId: 'simplefadedisplay' } [05:28:36.402] StreamManager :: add(), id:infosheet, type:canvas [05:28:36.402] RenInfosheet[infosheet] :: constructor() [05:28:36.402] Ren[infosheet] :: constructor() [05:28:36.402] Overlay[infosheet] :: constructor() [05:28:36.402] CanvasClip[infosheet] :: constructor() [05:28:36.402] Clip[infosheet] :: constructor() [05:28:36.403] clip:"infosheet" added to stream:"canvas_1570589403506" [05:28:36.403] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1570589403506', clipId: 'infosheet' } [05:28:36.403] StreamManager :: add(), id:caption, type:canvas [05:28:36.403] RenCaption[caption] :: constructor() [05:28:36.403] Ren[caption] :: constructor() [05:28:36.403] Overlay[caption] :: constructor() [05:28:36.403] CanvasClip[caption] :: constructor() [05:28:36.403] Clip[caption] :: constructor() [05:28:36.403] clip:"caption" added to stream:"canvas_1570589403506" [05:28:36.403] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1570589403506', clipId: 'caption' } [05:28:36.404] StreamManager :: add(), id:odometer, type:canvas [05:28:36.404] RenOdometer[odometer] :: constructor() [05:28:36.404] Ren[odometer] :: constructor() [05:28:36.404] Overlay[odometer] :: constructor() [05:28:36.404] CanvasClip[odometer] :: constructor() [05:28:36.404] Clip[odometer] :: constructor() [05:28:36.404] clip:"odometer" added to stream:"canvas_1570589403506" [05:28:36.404] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1570589403506', clipId: 'odometer' } [05:28:36.404] StreamManager :: add(), id:options, type:canvas [05:28:36.404] RenOptions[options] :: constructor() [05:28:36.405] Ren[options] :: constructor() [05:28:36.405] Overlay[options] :: constructor() [05:28:36.405] CanvasClip[options] :: constructor() [05:28:36.405] Clip[options] :: constructor() [05:28:36.405] clip:"options" added to stream:"canvas_1570589403506" [05:28:36.405] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1570589403506', clipId: 'options' } [05:28:36.405] StreamManager :: add(), id:carfax, type:video [05:28:36.405] VideoStream[carfax] :: constructor() [05:28:36.405] InputStream[carfax] :: constructor() [05:28:36.405] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'carfax', clipId: null } [05:28:36.405] StreamManager :: add(), id:map, type:canvas [05:28:36.405] CanvasStream[canvas_27286797340] :: constructor() [05:28:36.406] InputStream[canvas_27286797340] :: constructor() [05:28:36.419] RenMap[map] :: constructor() [05:28:36.419] Ren[map] :: constructor() [05:28:36.419] Overlay[map] :: constructor() [05:28:36.419] CanvasClip[map] :: constructor() [05:28:36.419] Clip[map] :: constructor() [05:28:36.419] clip:"map" added to stream:"canvas_27286797340" [05:28:36.419] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_27286797340', clipId: 'map' } [05:28:36.419] StreamManager :: add(), id:outro, type:video [05:28:36.420] VideoStream[outro] :: constructor() [05:28:36.420] InputStream[outro] :: constructor() [05:28:36.420] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'outro', clipId: null } [05:28:36.420] all added... [05:28:36.420] Vidbot :: _next(), _stepIndex:1 of 4 [05:28:36.420] index :: _onStepCompleted_vidbot(), step: 1 [05:28:36.420] index :: _onStepStarted_vidbot(), step: 2 [05:28:36.421] Vidbot :: step[1], label:Initializing Input Streams [05:28:36.421] StreamManager :: init() [05:28:36.421] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.14285714285714285 } [05:28:36.422] index :: _onStepProgress_vidbot(), percent: 14 [05:28:36.422] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.2857142857142857 } [05:28:36.422] index :: _onStepProgress_vidbot(), percent: 29 [05:28:36.422] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'intro', progress: 0.42857142857142855 } [05:28:36.422] index :: _onStepProgress_vidbot(), percent: 43 [05:28:36.423] CanvasStream[canvas_1570589403506] :: _init(), BEGIN [05:28:36.423] i:0, c.id:simplefadedisplay [05:28:36.423] KenBurnsSlideshow[simplefadedisplay] :: _init(), BEGIN [05:28:36.423] KenBurnsSlideshow[simplefadedisplay] :: _validate() [05:28:36.424] KenBurnsSlideshow[undefined] :: _validateAnim() [05:28:36.424] KenBurnsSlideshow[undefined] :: _validateTheme() [05:28:36.425] i:1, c.id:infosheet [05:28:36.426] RenInfosheet[infosheet] :: _init() [05:28:36.426] RenInfosheet[infosheet] :: _validate() [05:28:36.427] i:2, c.id:caption [05:28:36.427] RenCaption[caption] :: _init() [05:28:36.428] RenCaption[caption] :: _validate() [05:28:36.428] i:3, c.id:odometer [05:28:36.428] RenOdometer[odometer] :: _init() [05:28:36.429] RenOdometer[odometer] :: _validate() [05:28:36.429] i:4, c.id:options [05:28:36.429] RenPrice[options] :: _init() [05:28:36.430] RenOptions[options] :: _validate() [05:28:36.430] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'carfax', progress: 0.5714285714285714 } [05:28:36.430] index :: _onStepProgress_vidbot(), percent: 57 [05:28:36.430] CanvasStream[canvas_27286797340] :: _init(), BEGIN [05:28:36.431] i:0, c.id:map [05:28:36.431] RenMap[map] :: _init() [05:28:36.431] RenMap[map] :: _validate() [05:28:36.431] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'outro', progress: 0.7142857142857143 } [05:28:36.432] index :: _onStepProgress_vidbot(), percent: 71 [05:28:36.432] KenBurnsSlideshow[simplefadedisplay] :: _build() [05:28:36.439] AnimatedImageFrame[aif] :: constructor() [05:28:36.440] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:36.440] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_1.jpg [05:28:36.453] RenInfosheet[infosheet] :: _assets() [05:28:36.453] CanvasClip :: LoadSVGFromStringWithPromise() [05:28:36.474] CanvasClip :: LoadSVGFromString(), loaded [05:28:36.475] RenCaption[caption] :: _build() [05:28:36.492] RenInfosheet[odometer] :: _assets() [05:28:36.493] CanvasClip :: LoadSVGFromStringWithPromise() [05:28:36.510] CanvasClip :: LoadSVGFromString(), loaded [05:28:36.512] RenOptions[options] :: _assets() [05:28:36.512] CanvasClip :: LoadSVGFromStringWithPromise() [05:28:36.524] CanvasClip :: LoadSVGFromString(), loaded [05:28:36.526] RenMap[map] :: _assets() [05:28:36.526] CanvasClip :: LoadSVGFromStringWithPromise() [05:28:36.529] CanvasClip :: LoadSVGFromString(), loaded [05:28:36.532] CanvasClip :: LoadImageWithPromise(), src: map_540.jpg [05:28:36.534] Overlay[caption] :: _animate() [05:28:36.538] RenInfosheet[infosheet] :: _build() [05:28:36.565] RenOdometer[odometer] :: _build() [05:28:36.571] RenOptions[options] :: _build() [05:28:36.687] Overlay[infosheet] :: _animate() [05:28:36.688] CanvasStream[caption] :: _init(), p.then() [05:28:36.688] Overlay[odometer] :: _animate() [05:28:36.689] RenOptions[options] :: _animate() [05:28:36.689] Overlay[options] :: _animate() [05:28:36.689] CanvasStream[infosheet] :: _init(), p.then() [05:28:36.690] CanvasStream[odometer] :: _init(), p.then() [05:28:36.690] CanvasStream[options] :: _init(), p.then() [05:28:36.738] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:36.741] AnimatedImageFrame[aif] :: _init(), END [05:28:36.743] AnimatedImageFrame[aif] :: constructor() [05:28:36.743] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:36.743] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_2.jpg [05:28:36.768] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:36.769] RenMap[map] :: _build() [05:28:36.787] Overlay[map] :: _animate() [05:28:36.788] CanvasStream[map] :: _init(), p.then() [05:28:36.788] CanvasStream[canvas_27286797340] :: _init(), promise.all.then() [05:28:36.789] CanvasStream[canvas_27286797340] :: _init(), END [05:28:36.789] StreamMangaer :: init(), stream[canvas_27286797340].then() [05:28:36.790] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_27286797340', progress: 0.8571428571428571 } [05:28:36.790] index :: _onStepProgress_vidbot(), percent: 86 [05:28:36.828] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:36.829] AnimatedImageFrame[aif] :: _init(), END [05:28:36.830] AnimatedImageFrame[aif] :: constructor() [05:28:36.830] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:36.830] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_3.jpg [05:28:36.878] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:36.879] AnimatedImageFrame[aif] :: _init(), END [05:28:36.879] AnimatedImageFrame[aif] :: constructor() [05:28:36.880] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:36.880] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_4.jpg [05:28:36.920] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:36.921] AnimatedImageFrame[aif] :: _init(), END [05:28:36.922] AnimatedImageFrame[aif] :: constructor() [05:28:36.922] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:36.922] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_5.jpg [05:28:36.962] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:36.962] AnimatedImageFrame[aif] :: _init(), END [05:28:36.963] AnimatedImageFrame[aif] :: constructor() [05:28:36.963] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:36.963] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_6.jpg [05:28:37.004] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.006] AnimatedImageFrame[aif] :: _init(), END [05:28:37.007] AnimatedImageFrame[aif] :: constructor() [05:28:37.007] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.007] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_7.jpg [05:28:37.051] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.052] AnimatedImageFrame[aif] :: _init(), END [05:28:37.053] AnimatedImageFrame[aif] :: constructor() [05:28:37.053] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.053] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_8.jpg [05:28:37.091] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.092] AnimatedImageFrame[aif] :: _init(), END [05:28:37.093] AnimatedImageFrame[aif] :: constructor() [05:28:37.093] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.093] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_9.jpg [05:28:37.129] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.130] AnimatedImageFrame[aif] :: _init(), END [05:28:37.131] AnimatedImageFrame[aif] :: constructor() [05:28:37.131] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.131] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_10.jpg [05:28:37.167] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.168] AnimatedImageFrame[aif] :: _init(), END [05:28:37.168] AnimatedImageFrame[aif] :: constructor() [05:28:37.168] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.168] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_11.jpg [05:28:37.211] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.212] AnimatedImageFrame[aif] :: _init(), END [05:28:37.213] AnimatedImageFrame[aif] :: constructor() [05:28:37.213] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.213] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_12.jpg [05:28:37.253] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.254] AnimatedImageFrame[aif] :: _init(), END [05:28:37.254] AnimatedImageFrame[aif] :: constructor() [05:28:37.254] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.254] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_13.jpg [05:28:37.293] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.294] AnimatedImageFrame[aif] :: _init(), END [05:28:37.295] AnimatedImageFrame[aif] :: constructor() [05:28:37.295] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.295] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_14.jpg [05:28:37.345] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.347] AnimatedImageFrame[aif] :: _init(), END [05:28:37.347] AnimatedImageFrame[aif] :: constructor() [05:28:37.347] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.348] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_15.jpg [05:28:37.381] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.382] AnimatedImageFrame[aif] :: _init(), END [05:28:37.382] AnimatedImageFrame[aif] :: constructor() [05:28:37.383] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.383] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_16.jpg [05:28:37.421] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.422] AnimatedImageFrame[aif] :: _init(), END [05:28:37.423] AnimatedImageFrame[aif] :: constructor() [05:28:37.423] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.423] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_17.jpg [05:28:37.457] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.458] AnimatedImageFrame[aif] :: _init(), END [05:28:37.459] AnimatedImageFrame[aif] :: constructor() [05:28:37.459] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.459] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_18.jpg [05:28:37.495] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.496] AnimatedImageFrame[aif] :: _init(), END [05:28:37.496] AnimatedImageFrame[aif] :: constructor() [05:28:37.497] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.497] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_19.jpg [05:28:37.530] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.531] AnimatedImageFrame[aif] :: _init(), END [05:28:37.532] AnimatedImageFrame[aif] :: constructor() [05:28:37.532] AnimatedImageFrame[aif] :: _init(), BEGIN [05:28:37.532] CanvasClip :: LoadImageWithPromise(), src: DDC7F365-7B7F-A9DC-9A96-FDE945472A9C_20.jpg [05:28:37.565] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:28:37.566] AnimatedImageFrame[aif] :: _init(), END [05:28:37.567] Overlay[simplefadedisplay] :: _animate() [05:28:37.567] KenBurnsSlideshow[simplefadedisplay] :: _init(), END [05:28:37.567] CanvasStream[simplefadedisplay] :: _init(), p.then() [05:28:37.568] CanvasStream[canvas_1570589403506] :: _init(), promise.all.then() [05:28:37.570] CanvasStream[canvas_1570589403506] :: _init(), END [05:28:37.570] StreamMangaer :: init(), stream[canvas_1570589403506].then() [05:28:37.570] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_1570589403506', progress: 1 } [05:28:37.570] index :: _onStepProgress_vidbot(), percent: 100 [05:28:37.571] StreamManager :: init(), promise.all.then... [05:28:37.571] Vidbot :: StreamMgr.on( 'INITED' ) [05:28:37.571] Vidbot :: _next(), _stepIndex:2 of 4 [05:28:37.571] index :: _onStepCompleted_vidbot(), step: 2 [05:28:37.571] index :: _onStepStarted_vidbot(), step: 3 [05:28:37.571] Vidbot :: step[2], label:Rendering Canvas Streams [05:28:37.572] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [05:28:37.572] StreamManager :: render() [05:28:37.572] CanvasStream[canvas_1570589403506] :: render() [05:28:37.642] index :: _onStepProgress_vidbot(), percent: 0 [05:28:58.398] index :: _onStepProgress_vidbot(), percent: 5 [05:30:14.820] index :: _onStepProgress_vidbot(), percent: 10 [05:31:32.930] index :: _onStepProgress_vidbot(), percent: 15 [05:33:03.173] index :: _onStepProgress_vidbot(), percent: 20 [05:34:36.768] index :: _onStepProgress_vidbot(), percent: 25 [05:36:09.264] index :: _onStepProgress_vidbot(), percent: 30 [05:37:27.666] index :: _onStepProgress_vidbot(), percent: 35 [05:38:51.545] index :: _onStepProgress_vidbot(), percent: 40