{"graph": {"acyclic": false, "pipe_collision": false}, "nodes": {"0x15f4f9bc190": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Start Node 0", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Initial Program": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe https://www.tiktok.com/upload?lang=en", "Data": "{\"type\": \"Start Node\", \"x\": 0, \"y\": 0, \"Application\": \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe https://www.tiktok.com/upload?lang=en\"}"}}, "0x15f4f9be200": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Bash Commands 1", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \npip3 install opencv-python-headless\npip3 install numpy\npip3 install requests\npip3 install pyttsx3\npip3 install moviepy\n\n\n", "Data": "{\"type\": \"bash\", \"code\": \" \\npip3 install --upgrade --force-reinstall \\\"git+https://github.com/yt-dlp/yt-dlp.git\\\"\\n\\n\\n\"}"}}, "0x15f4f9be470": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Python Code 2", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \nimport cv2\nimport numpy as np\nimport requests\nimport pyttsx3\nfrom PIL import ImageFont, ImageDraw, Image\nfrom moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip\n\ndef download_file(url, filename):\n response = requests.get(url)\n with open(filename, 'wb') as f:\n f.write(response.content)\n\n# Generate synthetic video\nsynthetic_video_url = genSyntheticVideo(\"robots dancing around a fire\")\nsynthetic_video_filename = 'synthetic.mp4'\ndownload_file(synthetic_video_url, synthetic_video_filename)\n\n# Generate voiceover text using GPT-3\nvoiceover_text = gpt3Prompt(\"generate a short 2 sentence voiceover about how Cheat layer marketing agents allow you to grow any brand on autopilot\", \"\") \n\nvoiceover_text += \"This video was generated and uploaded automatically using Cheat Layer marketing agents for tiktok.\"\n\n# Generate voice from the text\nvoiceover_filename = 'voiceover.mp3'\ngenVoice(voiceover_text, voiceover_filename)\n\n# Load synthetic video and voiceover\nvideo_clip = VideoFileClip(synthetic_video_filename).loop(duration=AudioFileClip(voiceover_filename).duration)\naudio_clip = AudioFileClip(voiceover_filename)\n\n# Composite video and audio\nfinal_clip = CompositeVideoClip([video_clip.set_audio(audio_clip)])\nfinal_clip.write_videofile('voiceover_video.mp4', codec='libx264', audio_codec='aac')\n\n# Draw sentences on top of the video\nfont_path = 'arial.ttf' # Use a common font path or include the font in the project directory\nfont_size = 48\nfont = ImageFont.truetype(font_path, font_size)\n\ncap = cv2.VideoCapture('voiceover_video.mp4')\nframe_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\nframe_rate = int(cap.get(cv2.CAP_PROP_FPS))\nfourcc = cv2.VideoWriter_fourcc(*'mp4v')\nout = cv2.VideoWriter('text_video.mp4', fourcc, frame_rate, (frame_width, frame_height))\nwords = voiceover_text.split()\n\ndef chunk_list_to_string(lst, size):\n return [' '.join(lst[i:i + size]) for i in range(0, len(lst), size)]\n\nsentences = chunk_list_to_string(words, 3)\n#sentences = voiceover_text.split('. ')\ncurrent_sentence = 0\nframe_counter = 0\n\nwhile cap.isOpened():\n ret, frame = cap.read()\n if not ret:\n break\n\n if frame_counter == 8:\n current_sentence = (current_sentence + 1) % len(sentences)\n frame_counter = 0\n\n # Convert the image to RGB (OpenCV uses BGR)\n cv2_im_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n pil_im = Image.fromarray(cv2_im_rgb)\n\n draw = ImageDraw.Draw(pil_im)\n text = sentences[current_sentence]\n\n # Calculate text size and position\n #text_size = [32,32]\n text_size = draw.textsize(text, font=font)\n text_x = 20\n text_y = (frame_height - text_size[1]) / 2\n\n # Draw the text on the frame\n draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255))\n\n # Convert back to BGR for OpenCV\n frame_with_text = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)\n\n out.write(frame_with_text)\n frame_counter += 1\n\ncap.release()\nout.release()\n\n# Overlay the voiceover on the final video with text\ntext_video_clip = VideoFileClip('text_video.mp4')\nfinal_audio_video_clip = CompositeVideoClip([text_video_clip.set_audio(audio_clip)])\nfinal_audio_video_clip.write_videofile('cheatlayer.mp4', codec='libx264', audio_codec='aac')\n\n", "Data": "{\"type\": \"python\", \"code\": \" \\ngenSyntheticVideo(\\\"AI automation\\\")\\n\"}"}}, "0x15f4f9be9e0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 3", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 960, "Y": 628, "semanticTarget": "A pink button with white text that says Select Files", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a man riding a wave on top of a surfboard\", \"x\": 960, \"y\": 628}"}}, "0x15f4f9beda0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 4", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "cheatlayer.mp4", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bef80": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 5", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "return", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bf4c0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 8", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 867, "Y": 477, "semanticTarget": "Input text box for a caption with the word CheatLayer in it", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with the words upload video on it\", \"x\": 867, \"y\": 477}"}}, "0x15f4f9bfca0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Scroll 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Distance": "-5000", "Data": "{\"type\": \"scroll\"}"}}, "0x15f4f9bfdc0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 11", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 1025, "Y": 453, "semanticTarget": "A pink button with white text that says Post", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with a message\", \"x\": 1025, \"y\": 453}"}}, "0x15f4fab1db0": {"type_": "nodes.basic.BasicNodeA", "icon": null, "name": "GPT4 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [180.89147286821708, 7.669041141261857], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"input": " Generate a short tiktok caption about a video of marketing agents generate videos using Dalle3+Stable Video and automate uploading them and a/b testing them for you, so you can grow any brand on auto-pilot! #cheatlayer #chatgpt", "Automation Input": "", "Data": "{\"type\": \"GPT4\"}"}}}, "connections": [{"out": ["0x15f4f9bc190", "out A"], "in": ["0x15f4f9be200", "in A"]}, {"out": ["0x15f4f9be200", "out A"], "in": ["0x15f4f9be470", "in A"]}, {"out": ["0x15f4f9be470", "out A"], "in": ["0x15f4f9be9e0", "in A"]}, {"out": ["0x15f4f9be9e0", "out A"], "in": ["0x15f4f9beda0", "in A"]}, {"out": ["0x15f4f9beda0", "out A"], "in": ["0x15f4f9bef80", "in A"]}, {"out": ["0x15f4f9bef80", "out A"], "in": ["0x15f4f9bf4c0", "in A"]}, {"out": ["0x15f4f9bf4c0", "out A"], "in": ["0x15f4fab1db0", "in A"]}, {"in": ["0x15f4f9bfca0", "in A"], "out": ["0x15f4fab1db0", "out A"]}, {"out": ["0x15f4f9bfca0", "out A"], "in": ["0x15f4f9bfdc0", "in A"]}]} About Us | AB Construction LTD {"graph": {"acyclic": false, "pipe_collision": false}, "nodes": {"0x15f4f9bc190": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Start Node 0", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Initial Program": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe https://www.tiktok.com/upload?lang=en", "Data": "{\"type\": \"Start Node\", \"x\": 0, \"y\": 0, \"Application\": \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe https://www.tiktok.com/upload?lang=en\"}"}}, "0x15f4f9be200": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Bash Commands 1", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \npip3 install opencv-python-headless\npip3 install numpy\npip3 install requests\npip3 install pyttsx3\npip3 install moviepy\n\n\n", "Data": "{\"type\": \"bash\", \"code\": \" \\npip3 install --upgrade --force-reinstall \\\"git+https://github.com/yt-dlp/yt-dlp.git\\\"\\n\\n\\n\"}"}}, "0x15f4f9be470": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Python Code 2", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \nimport cv2\nimport numpy as np\nimport requests\nimport pyttsx3\nfrom PIL import ImageFont, ImageDraw, Image\nfrom moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip\n\ndef download_file(url, filename):\n response = requests.get(url)\n with open(filename, 'wb') as f:\n f.write(response.content)\n\n# Generate synthetic video\nsynthetic_video_url = genSyntheticVideo(\"robots dancing around a fire\")\nsynthetic_video_filename = 'synthetic.mp4'\ndownload_file(synthetic_video_url, synthetic_video_filename)\n\n# Generate voiceover text using GPT-3\nvoiceover_text = gpt3Prompt(\"generate a short 2 sentence voiceover about how Cheat layer marketing agents allow you to grow any brand on autopilot\", \"\") \n\nvoiceover_text += \"This video was generated and uploaded automatically using Cheat Layer marketing agents for tiktok.\"\n\n# Generate voice from the text\nvoiceover_filename = 'voiceover.mp3'\ngenVoice(voiceover_text, voiceover_filename)\n\n# Load synthetic video and voiceover\nvideo_clip = VideoFileClip(synthetic_video_filename).loop(duration=AudioFileClip(voiceover_filename).duration)\naudio_clip = AudioFileClip(voiceover_filename)\n\n# Composite video and audio\nfinal_clip = CompositeVideoClip([video_clip.set_audio(audio_clip)])\nfinal_clip.write_videofile('voiceover_video.mp4', codec='libx264', audio_codec='aac')\n\n# Draw sentences on top of the video\nfont_path = 'arial.ttf' # Use a common font path or include the font in the project directory\nfont_size = 48\nfont = ImageFont.truetype(font_path, font_size)\n\ncap = cv2.VideoCapture('voiceover_video.mp4')\nframe_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\nframe_rate = int(cap.get(cv2.CAP_PROP_FPS))\nfourcc = cv2.VideoWriter_fourcc(*'mp4v')\nout = cv2.VideoWriter('text_video.mp4', fourcc, frame_rate, (frame_width, frame_height))\nwords = voiceover_text.split()\n\ndef chunk_list_to_string(lst, size):\n return [' '.join(lst[i:i + size]) for i in range(0, len(lst), size)]\n\nsentences = chunk_list_to_string(words, 3)\n#sentences = voiceover_text.split('. ')\ncurrent_sentence = 0\nframe_counter = 0\n\nwhile cap.isOpened():\n ret, frame = cap.read()\n if not ret:\n break\n\n if frame_counter == 8:\n current_sentence = (current_sentence + 1) % len(sentences)\n frame_counter = 0\n\n # Convert the image to RGB (OpenCV uses BGR)\n cv2_im_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n pil_im = Image.fromarray(cv2_im_rgb)\n\n draw = ImageDraw.Draw(pil_im)\n text = sentences[current_sentence]\n\n # Calculate text size and position\n #text_size = [32,32]\n text_size = draw.textsize(text, font=font)\n text_x = 20\n text_y = (frame_height - text_size[1]) / 2\n\n # Draw the text on the frame\n draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255))\n\n # Convert back to BGR for OpenCV\n frame_with_text = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)\n\n out.write(frame_with_text)\n frame_counter += 1\n\ncap.release()\nout.release()\n\n# Overlay the voiceover on the final video with text\ntext_video_clip = VideoFileClip('text_video.mp4')\nfinal_audio_video_clip = CompositeVideoClip([text_video_clip.set_audio(audio_clip)])\nfinal_audio_video_clip.write_videofile('cheatlayer.mp4', codec='libx264', audio_codec='aac')\n\n", "Data": "{\"type\": \"python\", \"code\": \" \\ngenSyntheticVideo(\\\"AI automation\\\")\\n\"}"}}, "0x15f4f9be9e0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 3", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 960, "Y": 628, "semanticTarget": "A pink button with white text that says Select Files", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a man riding a wave on top of a surfboard\", \"x\": 960, \"y\": 628}"}}, "0x15f4f9beda0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 4", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "cheatlayer.mp4", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bef80": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 5", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "return", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bf4c0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 8", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 867, "Y": 477, "semanticTarget": "Input text box for a caption with the word CheatLayer in it", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with the words upload video on it\", \"x\": 867, \"y\": 477}"}}, "0x15f4f9bfca0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Scroll 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Distance": "-5000", "Data": "{\"type\": \"scroll\"}"}}, "0x15f4f9bfdc0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 11", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 1025, "Y": 453, "semanticTarget": "A pink button with white text that says Post", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with a message\", \"x\": 1025, \"y\": 453}"}}, "0x15f4fab1db0": {"type_": "nodes.basic.BasicNodeA", "icon": null, "name": "GPT4 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [180.89147286821708, 7.669041141261857], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"input": " Generate a short tiktok caption about a video of marketing agents generate videos using Dalle3+Stable Video and automate uploading them and a/b testing them for you, so you can grow any brand on auto-pilot! #cheatlayer #chatgpt", "Automation Input": "", "Data": "{\"type\": \"GPT4\"}"}}}, "connections": [{"out": ["0x15f4f9bc190", "out A"], "in": ["0x15f4f9be200", "in A"]}, {"out": ["0x15f4f9be200", "out A"], "in": ["0x15f4f9be470", "in A"]}, {"out": ["0x15f4f9be470", "out A"], "in": ["0x15f4f9be9e0", "in A"]}, {"out": ["0x15f4f9be9e0", "out A"], "in": ["0x15f4f9beda0", "in A"]}, {"out": ["0x15f4f9beda0", "out A"], "in": ["0x15f4f9bef80", "in A"]}, {"out": ["0x15f4f9bef80", "out A"], "in": ["0x15f4f9bf4c0", "in A"]}, {"out": ["0x15f4f9bf4c0", "out A"], "in": ["0x15f4fab1db0", "in A"]}, {"in": ["0x15f4f9bfca0", "in A"], "out": ["0x15f4fab1db0", "out A"]}, {"out": ["0x15f4f9bfca0", "out A"], "in": ["0x15f4f9bfdc0", "in A"]}]}
top of page
Construction Workers

About Us

We Build for People

At AB Construction L.T.D, we believe in providing quality work and exceptional customer service. Our team of highly-skilled contractors are dedicated to getting the job done right the first time, and our attention to detail is something we take great pride in.

We strive to make sure our clients are always satisfied with the outcome, and that the end results are something to be proud of. Whether you’re looking for a one-time repair or a full-scale renovation, AB Construction has you covered. Contact us today to get started on your project

bottom of page