--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [22:25:28.294] Vidbot :: start() [22:25:28.295] Vidbot :: _next(), _stepIndex:0 of 4 [22:25:28.295] index :: _onStepStarted_vidbot(), step: 1 [22:25:28.297] Vidbot :: step[0], label:Initializing Core [22:25:28.306] index :: _onStepProgress_vidbot(), percent: 20 [22:25:28.306] Vidbot :: _parse() [22:25:28.308] index :: _onStepProgress_vidbot(), percent: 40 [22:25:28.308] Vidbot :: _validate() [22:25:28.309] index :: _onStepProgress_vidbot(), percent: 60 [22:25:28.309] Vidbot :: _fonts() [22:25:28.309] FabricFontManager :: add(), id: SourceSansPro-Bold [22:25:28.309] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [22:25:28.318] FabricFontManager :: add(), id: SourceSansPro-Light [22:25:28.318] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [22:25:28.319] FabricFontManager :: add(), id: DINOT-Bold [22:25:28.319] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [22:25:28.320] FabricFontManager :: add(), id: DINOT-Light [22:25:28.320] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [22:25:28.320] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [22:25:28.321] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [22:25:28.321] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [22:25:28.321] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [22:25:28.323] index :: _onStepProgress_vidbot(), percent: 80 [22:25:28.323] Vidbot :: _clips() [22:25:28.323] StreamManager :: add(), id:audio_vo, type:audio [22:25:28.324] AudioClip[audio_vo] :: constructor() [22:25:28.324] InputStream[audio_vo] :: constructor() [22:25:28.324] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [22:25:28.327] StreamManager :: add(), id:bg_music, type:audio [22:25:28.327] AudioClip[bg_music] :: constructor() [22:25:28.327] InputStream[bg_music] :: constructor() [22:25:28.327] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [22:25:28.327] StreamManager :: add(), id:simplefadedisplay, type:canvas [22:25:28.328] CanvasStream[canvas_1408889494743] :: constructor() [22:25:28.328] InputStream[canvas_1408889494743] :: constructor() [22:25:28.410] KenBurnsSlideshow[simplefadedisplay] :: constructor() [22:25:28.410] Overlay[simplefadedisplay] :: constructor() [22:25:28.410] CanvasClip[simplefadedisplay] :: constructor() [22:25:28.411] Clip[simplefadedisplay] :: constructor() [22:25:28.411] clip:"simplefadedisplay" added to stream:"canvas_1408889494743" [22:25:28.411] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1408889494743', clipId: 'simplefadedisplay' } [22:25:28.411] StreamManager :: add(), id:caption, type:canvas [22:25:28.411] RenCaption[caption] :: constructor() [22:25:28.411] Ren[caption] :: constructor() [22:25:28.411] Overlay[caption] :: constructor() [22:25:28.412] CanvasClip[caption] :: constructor() [22:25:28.412] Clip[caption] :: constructor() [22:25:28.412] clip:"caption" added to stream:"canvas_1408889494743" [22:25:28.412] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1408889494743', clipId: 'caption' } [22:25:28.412] all added... [22:25:28.412] Vidbot :: _next(), _stepIndex:1 of 4 [22:25:28.412] index :: _onStepCompleted_vidbot(), step: 1 [22:25:28.413] index :: _onStepStarted_vidbot(), step: 2 [22:25:28.413] Vidbot :: step[1], label:Initializing Input Streams [22:25:28.413] StreamManager :: init() [22:25:28.414] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [22:25:28.414] index :: _onStepProgress_vidbot(), percent: 33 [22:25:28.414] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [22:25:28.414] index :: _onStepProgress_vidbot(), percent: 67 [22:25:28.415] CanvasStream[canvas_1408889494743] :: _init(), BEGIN [22:25:28.415] i:0, c.id:simplefadedisplay [22:25:28.415] KenBurnsSlideshow[simplefadedisplay] :: _init(), BEGIN [22:25:28.415] KenBurnsSlideshow[simplefadedisplay] :: _validate() [22:25:28.416] KenBurnsSlideshow[undefined] :: _validateAnim() [22:25:28.416] KenBurnsSlideshow[undefined] :: _validateTheme() [22:25:28.418] i:1, c.id:caption [22:25:28.418] RenCaption[caption] :: _init() [22:25:28.418] RenCaption[caption] :: _validate() [22:25:28.420] KenBurnsSlideshow[simplefadedisplay] :: _build() [22:25:28.426] AnimatedImageFrame[aif] :: constructor() [22:25:28.427] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.427] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_1.jpg [22:25:28.440] RenCaption[caption] :: _build() [22:25:28.460] Overlay[caption] :: _animate() [22:25:28.463] CanvasStream[caption] :: _init(), p.then() [22:25:28.537] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:28.542] AnimatedImageFrame[aif] :: _init(), END [22:25:28.543] AnimatedImageFrame[aif] :: constructor() [22:25:28.543] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.544] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_2.jpg [22:25:28.619] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:28.621] AnimatedImageFrame[aif] :: _init(), END [22:25:28.622] AnimatedImageFrame[aif] :: constructor() [22:25:28.622] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.622] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_3.jpg [22:25:28.695] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:28.697] AnimatedImageFrame[aif] :: _init(), END [22:25:28.697] AnimatedImageFrame[aif] :: constructor() [22:25:28.697] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.697] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_4.jpg [22:25:28.757] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:28.758] AnimatedImageFrame[aif] :: _init(), END [22:25:28.759] AnimatedImageFrame[aif] :: constructor() [22:25:28.759] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.759] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_5.jpg [22:25:28.829] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:28.830] AnimatedImageFrame[aif] :: _init(), END [22:25:28.830] AnimatedImageFrame[aif] :: constructor() [22:25:28.830] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.831] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_6.jpg [22:25:28.893] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:28.894] AnimatedImageFrame[aif] :: _init(), END [22:25:28.895] AnimatedImageFrame[aif] :: constructor() [22:25:28.895] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.895] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_7.jpg [22:25:28.957] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:28.959] AnimatedImageFrame[aif] :: _init(), END [22:25:28.959] AnimatedImageFrame[aif] :: constructor() [22:25:28.959] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:28.959] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_8.jpg [22:25:29.024] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.026] AnimatedImageFrame[aif] :: _init(), END [22:25:29.027] AnimatedImageFrame[aif] :: constructor() [22:25:29.027] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.027] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_9.jpg [22:25:29.102] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.104] AnimatedImageFrame[aif] :: _init(), END [22:25:29.104] AnimatedImageFrame[aif] :: constructor() [22:25:29.104] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.105] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_10.jpg [22:25:29.178] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.180] AnimatedImageFrame[aif] :: _init(), END [22:25:29.180] AnimatedImageFrame[aif] :: constructor() [22:25:29.180] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.180] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_11.jpg [22:25:29.277] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.278] AnimatedImageFrame[aif] :: _init(), END [22:25:29.279] AnimatedImageFrame[aif] :: constructor() [22:25:29.279] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.279] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_12.jpg [22:25:29.334] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.336] AnimatedImageFrame[aif] :: _init(), END [22:25:29.336] AnimatedImageFrame[aif] :: constructor() [22:25:29.336] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.336] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_13.jpg [22:25:29.396] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.397] AnimatedImageFrame[aif] :: _init(), END [22:25:29.398] AnimatedImageFrame[aif] :: constructor() [22:25:29.398] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.398] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_14.jpg [22:25:29.456] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.457] AnimatedImageFrame[aif] :: _init(), END [22:25:29.458] AnimatedImageFrame[aif] :: constructor() [22:25:29.458] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.458] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_15.jpg [22:25:29.517] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.518] AnimatedImageFrame[aif] :: _init(), END [22:25:29.518] AnimatedImageFrame[aif] :: constructor() [22:25:29.518] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.518] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_16.jpg [22:25:29.574] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.575] AnimatedImageFrame[aif] :: _init(), END [22:25:29.576] AnimatedImageFrame[aif] :: constructor() [22:25:29.576] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.576] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_17.jpg [22:25:29.644] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.645] AnimatedImageFrame[aif] :: _init(), END [22:25:29.646] AnimatedImageFrame[aif] :: constructor() [22:25:29.646] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.646] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_18.jpg [22:25:29.700] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.701] AnimatedImageFrame[aif] :: _init(), END [22:25:29.702] AnimatedImageFrame[aif] :: constructor() [22:25:29.702] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.702] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_19.jpg [22:25:29.766] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.768] AnimatedImageFrame[aif] :: _init(), END [22:25:29.768] AnimatedImageFrame[aif] :: constructor() [22:25:29.768] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.769] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_20.jpg [22:25:29.823] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.824] AnimatedImageFrame[aif] :: _init(), END [22:25:29.825] AnimatedImageFrame[aif] :: constructor() [22:25:29.825] AnimatedImageFrame[aif] :: _init(), BEGIN [22:25:29.825] CanvasClip :: LoadImageWithPromise(), src: CF5160DC-1CDC-473A-BFC0-0840CB20DD83_1.jpg [22:25:29.889] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [22:25:29.890] AnimatedImageFrame[aif] :: _init(), END [22:25:29.891] Overlay[simplefadedisplay] :: _animate() [22:25:29.891] KenBurnsSlideshow[simplefadedisplay] :: _init(), END [22:25:29.891] CanvasStream[simplefadedisplay] :: _init(), p.then() [22:25:29.892] CanvasStream[canvas_1408889494743] :: _init(), promise.all.then() [22:25:29.898] CanvasStream[canvas_1408889494743] :: _init(), END [22:25:29.898] StreamMangaer :: init(), stream[canvas_1408889494743].then() [22:25:29.898] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_1408889494743', progress: 1 } [22:25:29.899] index :: _onStepProgress_vidbot(), percent: 100 [22:25:29.899] StreamManager :: init(), promise.all.then... [22:25:29.899] Vidbot :: StreamMgr.on( 'INITED' ) [22:25:29.899] Vidbot :: _next(), _stepIndex:2 of 4 [22:25:29.899] index :: _onStepCompleted_vidbot(), step: 2 [22:25:29.899] index :: _onStepStarted_vidbot(), step: 3 [22:25:29.900] Vidbot :: step[2], label:Rendering Canvas Streams [22:25:29.900] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [22:25:29.900] StreamManager :: render() [22:25:29.901] CanvasStream[canvas_1408889494743] :: render() [22:25:30.025] index :: _onStepProgress_vidbot(), percent: 0 [22:26:43.759] index :: _onStepProgress_vidbot(), percent: 5 [22:28:01.833] index :: _onStepProgress_vidbot(), percent: 10 [22:29:21.004] index :: _onStepProgress_vidbot(), percent: 15 [22:30:44.774] index :: _onStepProgress_vidbot(), percent: 20 [22:31:58.236] index :: _onStepProgress_vidbot(), percent: 25 [22:33:04.810] index :: _onStepProgress_vidbot(), percent: 30 [22:34:25.845] index :: _onStepProgress_vidbot(), percent: 35 [22:35:45.955] index :: _onStepProgress_vidbot(), percent: 40 [22:37:14.565] index :: _onStepProgress_vidbot(), percent: 45 [22:38:30.818] index :: _onStepProgress_vidbot(), percent: 50 [22:39:35.876] index :: _onStepProgress_vidbot(), percent: 55 [22:40:39.059] index :: _onStepProgress_vidbot(), percent: 60 [22:41:50.299] index :: _onStepProgress_vidbot(), percent: 65 [22:42:55.780] index :: _onStepProgress_vidbot(), percent: 70 [22:43:56.076] index :: _onStepProgress_vidbot(), percent: 75 [22:45:02.404] index :: _onStepProgress_vidbot(), percent: 80 [22:46:15.801] index :: _onStepProgress_vidbot(), percent: 85 [22:47:20.769] index :: _onStepProgress_vidbot(), percent: 90 [22:48:26.528] index :: _onStepProgress_vidbot(), percent: 95 [22:49:36.713] index :: _onStepProgress_vidbot(), percent: 100 [22:49:44.414] StreamManager :: render(), Promise.all.then... [22:49:44.414] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [22:49:44.415] Vidbot :: _next(), _stepIndex:3 of 4 [22:49:44.415] index :: _onStepCompleted_vidbot(), step: 3 [22:49:44.415] index :: _onStepStarted_vidbot(), step: 4 [22:49:44.416] Vidbot :: step[3], label:Encoding Media [22:49:44.418] CanvasFilters :: Overlay() [22:49:44.419] AudioStream[audio_vo] :: inputOptions() [22:49:44.419] AudioFilters :: Volume() [22:49:44.419] filter: [2:a]volume=1[2_vol] [22:49:44.419] AudioFilters :: Delay() [22:49:44.419] filter: [2_vol]adelay=0|0[2_del] [22:49:44.420] AudioStream[bg_music] :: inputOptions() [22:49:44.420] AudioFilters :: Volume() [22:49:44.420] filter: [3:a]volume=0.25[3_vol] [22:49:44.420] AudioFilters :: FadeOut() [22:49:44.420] filter: [3_vol]afade=t=out:st=61.17:d=1[3_fadeout] [22:49:44.420] AudioFilters :: Delay() [22:49:44.420] filter: [3_fadeout]adelay=0|0[3_del] [22:49:44.420] AudioFilters :: Mix() [22:49:44.420] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [22:49:44.420] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [22:49:44.423] hang.time: 60 [22:49:44.609] Vidbot :: ffmpeg.on( 'start' ) [22:49:44.609] ffmpeg -f lavfi -i color=c=000000:s=1280x720:r=30:duration=61.17 -r 30 -i ./tmp/canvas_1408889494743_%05d.png -to 00:01:01.170 -i file:///var/www/html [22:49:44.610] /clients/20508/audio/CF5160DC-1CDC-473A-BFC0-0840CB20DD83.mp3 -to 00:01:01.170 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/Conce [22:49:44.610] pt11.mp3 -y -filter_complex [0:v][1:v]overlay=x=0:y=0[1_out];[2:a]volume=1[2_vol];[2_vol]adelay=0|0[2_del];[3:a]volume=0.25[3_vol];[3_vol]afade=t=out: [22:49:44.610] st=61.17:d=1[3_fadeout];[3_fadeout]adelay=0|0[3_del];[2_del][3_del]amix=inputs=2:duration=longest[a_out] -acodec aac -vcodec libx264 -r 30 -f mp4 -map [22:49:44.610] [a_out] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/20508/video/CF5160DC-1CDC-473 [22:49:44.610] A-BFC0-0840CB20DD83.mp4 [22:49:44.862] index :: _onStepProgress_vidbot(), percent: -3395861464 [22:49:45.243] index :: _onStepProgress_vidbot(), percent: 1 [22:49:46.752] index :: _onStepProgress_vidbot(), percent: 5 [22:49:48.269] index :: _onStepProgress_vidbot(), percent: 10 [22:49:49.799] index :: _onStepProgress_vidbot(), percent: 15 [22:49:51.346] index :: _onStepProgress_vidbot(), percent: 21 [22:49:52.910] index :: _onStepProgress_vidbot(), percent: 25 [22:49:54.419] index :: _onStepProgress_vidbot(), percent: 30 [22:49:56.453] index :: _onStepProgress_vidbot(), percent: 36 [22:49:57.971] index :: _onStepProgress_vidbot(), percent: 40 [22:49:59.493] index :: _onStepProgress_vidbot(), percent: 45 [22:50:01.520] index :: _onStepProgress_vidbot(), percent: 51 [22:50:03.059] index :: _onStepProgress_vidbot(), percent: 56 [22:50:04.587] index :: _onStepProgress_vidbot(), percent: 61 [22:50:06.169] index :: _onStepProgress_vidbot(), percent: 66 [22:50:07.710] index :: _onStepProgress_vidbot(), percent: 70 [22:50:09.226] index :: _onStepProgress_vidbot(), percent: 75 [22:50:10.750] index :: _onStepProgress_vidbot(), percent: 80 [22:50:12.770] index :: _onStepProgress_vidbot(), percent: 86 [22:50:13.782] index :: _onStepProgress_vidbot(), percent: 90 [22:50:15.317] index :: _onStepProgress_vidbot(), percent: 95 [22:50:16.838] index :: _onStepProgress_vidbot(), percent: 100 [22:50:17.116] Vidbot :: ffmpeg.on( 'end' ), Done! [22:50:17.116] StreamManager :: dispose() [22:50:17.117] CanvasStream[canvas_1408889494743] :: dispose() [22:50:17.122] Vidbot :: fflog.on( 'finish' ) [22:50:17.122] fflog.path: /var/www/html/clients/20508/video/CF5160DC-1CDC-473A-BFC0-0840CB20DD83.mp4.fflog [22:50:17.122] Vidbot :: _next(), _stepIndex:4 of 4 [22:50:17.122] index :: _onStepCompleted_vidbot(), step: 4 [22:50:17.123] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 1488.848, output: '/var/www/html/clients/20508/video/CF5160DC-1CDC-473A-BFC0-0840CB20DD83.mp4', duration: 61.17 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/20508/video/CF5160DC-1CDC-473A-BFC0-0840CB20DD83.mp4 Media Duration : 00:01:01.170 Generation Time : 00:24:48.847 ---------------------------------------------------------------------------------------------------------------