Snippets Collections
0000000000000000000000000cbb3d0cdca75fd140c2dfacaf0658b08658b109000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000107b2273756363657373223a747275657d00000000000000000000000000000000
60a060405234801561000f575f80fd5b5060405161063538038061063583398101604081905261002e91610062565b6001600160a01b0382166080525f61004682826101c9565b505050610284565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610073575f80fd5b82516001600160a01b0381168114610089575f80fd5b602084810151919350906001600160401b03808211156100a7575f80fd5b818601915086601f8301126100ba575f80fd5b8151818111156100cc576100cc61004e565b604051601f8201601f19908116603f011681019083821181831017156100f4576100f461004e565b81604052828152898684870101111561010b575f80fd5b5f93505b8284101561012c578484018601518185018701529285019261010f565b5f8684830101528096505050505050509250929050565b600181811c9082168061015757607f821691505b60208210810361017557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101c4575f81815260208120601f850160051c810160208610156101a15750805b601f850160051c820191505b818110156101c0578281556001016101ad565b5050505b505050565b81516001600160401b038111156101e2576101e261004e565b6101f6816101f08454610143565b8461017b565b602080601f831160018114610229575f84156102125750858301515b5f19600386901b1c1916600185901b1785556101c0565b5f85815260208120601f198616915b8281101561025757888601518255948401946001909101908401610238565b508582101561027457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6080516103946102a15f395f8181605d015260c801526103945ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063097b73531461004e5780637dc0d1d0146100585780639bfca6e01461004e578063a4877ddd1461009c575b5f80fd5b6100566100b1565b005b61007f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a4610182565b604051610093919061020d565b6040516352367d1560e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906352367d15906100fd905f90600401610290565b602060405180830381865afa158015610118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013c9190610338565b6101805760405162461bcd60e51b8152602060048201526011602482015270109858dada5b99c81b9bdd081d985b1a59607a1b604482015260640160405180910390fd5b565b5f805461018e90610258565b80601f01602080910402602001604051908101604052809291908181526020018280546101ba90610258565b80156102055780601f106101dc57610100808354040283529160200191610205565b820191905f5260205f20905b8154815290600101906020018083116101e857829003601f168201915b505050505081565b5f6020808352835180828501525f5b818110156102385785810183015185820160400152820161021c565b505f604082860101526040601f19601f8301168501019250505092915050565b600181811c9082168061026c57607f821691505b60208210810361028a57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845481600182811c9150808316806102b057607f831692505b85831081036102cd57634e487b7160e01b85526022600452602485fd5b8786018381526020018180156102ea576001811461030057610329565b60ff198616825284151560051b82019650610329565b5f8b8152602090205f5b868110156103235781548482015290850190890161030a565b83019750505b50949998505050505050505050565b5f60208284031215610348575f80fd5b81518015158114610357575f80fd5b939250505056fea2646970667358221220aaf7197534a4c7abde5506281b0cfe4811c18140bc1da396e1566d1bb8e4528c64736f6c63430008140033
[{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"bytes","name":"_json","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"beforeAddLiquidity","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeRemoveLiquidity","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rawJson","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.0/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.0/ScrollTrigger.min.js"></script>

<script>
const slides = document.querySelectorAll('.slide');
let isMobile = window.innerWidth <= 768; // Assuming mobile width is 768px or less

slides.forEach((slide, i) => {
    let angle = isMobile ? i * 10 : (i * 10) - 10;
    gsap.to(slide, {
        rotation: angle,
        transformOrigin: "0% 2300px",
    });
});

let speed = isMobile ? 30 : 30; // Faster speed on mobile
ScrollTrigger.create({
    trigger: '.scroller',
    start: "top top",
    end: "bottom bottom",
    //markers: true,
    onUpdate: (self) => {
        gsap.to(slides, {
            rotation: (i) => {
                let baseAngle = isMobile ? i * 10 : (i * 10) - 10;
                return baseAngle - self.progress * speed;
            }
        });
    }
});
</script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<script>

var $ = jQuery

$(document).ready(function(){

$('.reboot-slider').each(function(){

var $this = $(this),
    currentSlide = 0,
    previousSlide = 0,
    slideNumber = $this.find('.reboot-side-slider .swiper-slide:not(.swiper-slide-duplicate)').length,
    barHTML = '',
    forward,
    textContainer = $this.find('.reboot-changing-widget')

for(var i=0; i<slideNumber;i++){

    barHTML += `<span class="dot"><span class="dot-number">${i+1}</span></span>`
}

$this.find('.reboot-bar .dot').remove()
$this.find('.reboot-bar').append(barHTML)
$this.find('.reboot-bar .dot').eq(0).addClass('active')

textContainer.each(function(){
    var texts = $(this).find('.elementor-widget').eq(0)
    texts.addClass('currentUp')
    $(this).css('--h', texts.height()+'px')
})

setTimeout(function(){
    $this.addClass('loaded')
    if($this.find('.reboot-side-slider .swiper-container-initialized, .reboot-side-slider .swiper-initialized').length){
        $this.find('.reboot-side-slider').addClass('loaded')
    }

    var init = setInterval(function(){
        if($this.find('.reboot-side-slider .swiper-container-initialized, .reboot-side-slider .swiper-initialized').length){

            $this.find('.reboot-side-slider').addClass('loaded')
            clearInterval(init)
        }
    },50)
}, 500)

var bgs = JSON.parse($this.attr('data-settings')).background_slideshow_gallery,
    bgHTML = '<div class="reboot-slider-background">'

if(bgs){
    bgs.forEach(function(background){
        bgHTML += `<img decoding="async" src="${background.url}"/>`
    })
}
bgHTML += '</div>'

$this.find('.reboot-slider-background').remove()
$this.prepend(bgHTML)

var backgrounds = $this.find('.reboot-slider-background img')

backgrounds.eq(0).addClass('currentForward')

setInterval(function(){
    currentSlide = $this.find('.reboot-side-slider .swiper-slide-active').attr('data-swiper-slide-index')
    if(previousSlide != currentSlide) {

        if( previousSlide < currentSlide ){
            forward = true
        }
        if( previousSlide > currentSlide ){
            forward = false
        }
        if( previousSlide == slideNumber - 1 && currentSlide == 0 ){
            forward = true
        }
        if( previousSlide == 0 && currentSlide == slideNumber - 1 ){
            forward = false
        }
        textContainer.each(function(){
            var texts = $(this).find('.elementor-widget')

            $(this).css('--h', texts.eq(currentSlide).height()+'px')

            texts.removeClass('prev next currentUp currentDown')
            backgrounds.removeClass('prev currentBackward currentForward')

            backgrounds.eq(previousSlide).addClass('prev')

            if(forward) {
                texts.eq(previousSlide).addClass('prev')
                texts.eq(currentSlide).addClass('currentUp')

                backgrounds.eq(currentSlide).addClass('currentForward')

            }else{
                texts.eq(previousSlide).addClass('next')
                texts.eq(currentSlide).addClass('currentDown')

                backgrounds.eq(currentSlide).addClass('currentBackward')
            }
        })

        $this.find('.reboot-bar .dot').removeClass('active')
        $this.find('.reboot-bar .dot').eq(currentSlide).addClass('active')
    }
    previousSlide = currentSlide
}, 500)

$this.find('.reboot-bar .dot').on('click', function(){

    var index = $(this).index()

    $this.find('.reboot-side-slider .swiper-pagination-bullet').eq(index).trigger('click')
    $this.find('.reboot-side-slider .swiper-container').trigger('mouseleave')

})
$this.find('.reboot-slider-left').on('click', function(){

    $this.find('.reboot-side-slider .elementor-swiper-button-prev').trigger('click')
    $this.find('.reboot-side-slider .elementor-swiper').trigger('mouseleave')
})
$this.find('.reboot-slider-right').on('click', function(){

    $this.find('.reboot-side-slider .elementor-swiper-button-next').trigger('click')
    $this.find('.reboot-side-slider .elementor-swiper').trigger('mouseleave')
})
$this.find('.reboot-slider-left a, .reboot-slider-right a').on('click', function(e){

    e.preventDefault()
})

})
})

$(window).on('resize', function(){


$('.reboot-slider').each(function(){

    var textContainer = $(this).find('.reboot-changing-widget')

    textContainer.each(function(){
        var texts = $(this).find('.elementor-widget.currentUp, .elementor-widget.currentDown')

        $(this).css('--h', texts.height()+'px')
    })
})
})

</script>
selector{
    --radius: 8px;
    --height: 320px;
    --active-height: 410px;
    --overlay: 0.75;
}
selector{
    opacity: 0;
    transform: translateX(100px);
    transition: all 0.8s ease-in-out;
}
selector.loaded{
    opacity: 1;
    transform: translateX(0);
}

selector .swiper-wrapper{
    height: var(--active-height);
    align-items: center;
}
selector:not(.loaded) .swiper-wrapper{
    transition-duration: 0s !important;
}
selector .swiper-slide{
    display: flex;
    align-items: flex-end;
    border-radius: var(--radius);
    height: var(--height);
    box-shadow: 0 0 50px rgba(0,0,0,0.15);
}
selector.loaded .swiper-slide{
    transition: all 0.3s ease-in-out 0.2s;
}
selector .swiper-slide.swiper-slide-active{
    height: var(--active-height);
}
selector .swiper-slide:before{
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    background: rgb(0,0,0);
    background: linear-gradient(20deg, rgba(0,0,0,var(--overlay)) 0%, rgba(0,0,0,0) 100%);
    height: 100%;
    width: 100%;
    z-index: 1;
}
selector .elementor-testimonial__footer{
    display: block;
}
selector img{
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border-radius: var(--radius);
}
selector .elementor-testimonial__cite{
    z-index: 2;
    position: relative;
}
selector .elementor-testimonial__name{
    margin-bottom: 5px;
}
selector .swiper-pagination,
selector .elementor-swiper-button{
    display: none;
}
selector .swiper-container{
    overflow: hidden;
    margin-left: auto;
    margin-right: auto;
}

@media (max-width: 1024px){
selector{
    --height: 180px;
    --active-height: 250px;
}
}
@media (max-width: 767px){
selector{
    --height: 80px;
    --active-height: 105px;
    width: 100% !important;
    max-width: var(--container-widget-width, 300px) !important;
}
selector .elementor-testimonial__cite{
    opacity: 0;
}
}
selector{
    --speed: 0.5s;
    --gap: 40px;
}
selector{
    transition: all 0.3s ease-in-out;
    height: var(--h);
    --height: calc(var(--h) + var(--gap));
    overflow: hidden !important;
}
selector .elementor-widget{
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
}
selector .elementor-widget .elementor-button{
    transform: translateY(calc(-10 * var(--height)));
    transition: none !important;
}
selector .elementor-widget.prev .elementor-button{
    animation: prev var(--speed) ease-in-out;
    transform: translateY(calc(-1 * var(--height)));
}
selector .elementor-widget.next .elementor-button{
    animation: next var(--speed) ease-in-out;
    transform: translateY(var(--height));
}
selector .elementor-widget.currentUp,
selector .elementor-widget.currentDown{
    z-index: 1;
}
selector .elementor-widget.currentUp .elementor-button{
    animation: currentUp var(--speed) ease-in-out;
    transform: translateY(0);
}
selector .elementor-widget.currentDown .elementor-button{
    animation: currentDown var(--speed) ease-in-out;
    transform: translateY(0);
}

@keyframes prev {
  0%   {transform: translateY(0);}
  100%   {transform: translateY(calc(-1 * var(--height)));}
}

@keyframes next {
  0%   {transform: translateY(0);}
  100%   {transform: translateY(var(--height));}
}

@keyframes currentUp {
  0%   {transform: translateY(var(--height));}
  100%   {transform: translateY(0);}
}

@keyframes currentDown {
  0%   {transform: translateY(calc(-1 * var(--height)));}
  100%   {transform: translateY(0);}
}
selector{
    --speed: 0.5s;
    --gap: 40px;
}
selector{
    transition: all 0.3s ease-in-out;
    height: var(--h);
    --height: calc(var(--h) + var(--gap));
    overflow: hidden !important;
}
selector .elementor-widget{
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
}
selector .elementor-widget p{
    transform: translateY(calc(-10 * var(--height)));
    transition: none !important;
}
selector .elementor-widget.prev p{
    animation: prev var(--speed) ease-in-out;
    transform: translateY(calc(-1 * var(--height)));
}
selector .elementor-widget.next p{
    animation: next var(--speed) ease-in-out;
    transform: translateY(var(--height));
}
selector .elementor-widget.currentUp,
selector .elementor-widget.currentDown{
    z-index: 1;
}
selector .elementor-widget.currentUp p{
    animation: currentUp var(--speed) ease-in-out;
    transform: translateY(0);
}
selector .elementor-widget.currentDown p{
    animation: currentDown var(--speed) ease-in-out;
    transform: translateY(0);
}

@keyframes prev {
  0%   {transform: translateY(0);}
  100%   {transform: translateY(calc(-1 * var(--height)));}
}

@keyframes next {
  0%   {transform: translateY(0);}
  100%   {transform: translateY(var(--height));}
}

@keyframes currentUp {
  0%   {transform: translateY(var(--height));}
  100%   {transform: translateY(0);}
}

@keyframes currentDown {
  0%   {transform: translateY(calc(-1 * var(--height)));}
  100%   {transform: translateY(0);}
}
selector{
    --speed: 0.8s;
    --gap: 40px;
}
selector{
    transition: all 0.3s ease-in-out;
    height: var(--h);
    --height: calc(var(--h) + var(--gap));
    overflow: hidden !important;
}
selector .elementor-widget{
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
}
selector .elementor-widget .elementor-heading-title{
    transform: translateY(calc(-10 * var(--height)));
    transition: none !important;
}
selector .elementor-widget.prev .elementor-heading-title{
    animation: prev var(--speed) ease-in-out;
    transform: translateY(calc(-1 * var(--height)));
}
selector .elementor-widget.next .elementor-heading-title{
    animation: next var(--speed) ease-in-out;
    transform: translateY(var(--height));
}
selector .elementor-widget.currentUp,
selector .elementor-widget.currentDown{
    z-index: 1;
}
selector .elementor-widget.currentUp .elementor-heading-title{
    animation: currentUp var(--speed) ease-in-out;
    transform: translateY(0);
}
selector .elementor-widget.currentDown .elementor-heading-title{
    animation: currentDown var(--speed) ease-in-out;
    transform: translateY(0);
}

@keyframes prev {
  0%   {transform: translateY(0);}
  100%   {transform: translateY(calc(-1 * var(--height)));}
}

@keyframes next {
  0%   {transform: translateY(0);}
  100%   {transform: translateY(var(--height));}
}

@keyframes currentUp {
  0%   {transform: translateY(var(--height));}
  100%   {transform: translateY(0);}
}

@keyframes currentDown {
  0%   {transform: translateY(calc(-1 * var(--height)));}
  100%   {transform: translateY(0);}
}
@media (max-width: 1750px) and (min-width: 1381px){
selector{
    padding-left: 8%;
    padding-right: 12%;
}
}
@media (max-width: 1380px) and (min-width: 768px){
selector{
    padding-left: 0.5%;
    padding-right: 5.5%;
}
}
selector{
    --dot-size: 23px;
    --line-color: #B0B7D04D;
    --dot-color: #B0B7D0;
    --dot-color-active: #B0B7D0;
    color: #fff;
    font-size: 13px;
    font-weight: bold;
}
selector{
    height: 80vh;
    height: var(--min-height);
    max-height: 80vh;
    min-height: 0 !important;
}
selector .dot{
    height: var(--dot-size);
    width: var(--dot-size);
    background: var(--dot-color);
    border-radius: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    transform: scale(0.3);
    transition: all 0.3s ease-in-out;
    cursor: pointer;
}
selector .dot-number{
    opacity: 0;
    transition: all 0.3s ease-in-out;
}
selector .dot.active{
    transform: scale(1);
    background: var(--dot-color-active);
}
selector .dot.active .dot-number{
    opacity: 1;
}
selector:before{
    content: "";
    position: absolute;
    top: 50%;
    height: calc(100% - 20px);
    max-height: 90vh;
    width: 1px;
    background: var(--line-color);
    left: 50%;
    transform: translateX(-50%) translateY(-50%);
}

@media (max-width: 767px){
selector{
    transform: translateX(-50%);
    flex-wrap: nowrap !important;
}
selector:before {
    width: calc(100% - 20px);
    height: 1px;

}
}
selector{
    background: #fff;
    --background-speed: 0.5s;
}
selector .elementor-background-slideshow{
    display: none;
}
selector .reboot-slider-background,
selector .reboot-slider-background img{
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    transition: all 1s ease-in-out;
}
selector .reboot-slider-background img{
    object-fit: cover;
    opacity: 0;
    transform: scale(1.1);
}
selector .reboot-slider-background img.prev,
selector .reboot-slider-background img.currentBackward,
selector .reboot-slider-background img.currentForward{
    opacity: 1;
    transform: scale(1.1);
}

selector .reboot-slider-background img.currentBackward,
selector .reboot-slider-background img.currentForward{
    z-index: 1;
    opacity: 1;
    animation: bgNext var(--background-speed) linear;
    transition: all 1s ease-in-out;
    transform: scale(1);
}

selector:before{
    z-index: 2;
}
selector > .elementor-element{
    z-index: 3;
}

selector .reboot-bar,
selector .reboot-slider-left,
selector .reboot-slider-right{
    opacity: 0;
    transition: all 0.8s ease-in-out;
}
selector.loaded .reboot-bar,
selector.loaded .reboot-slider-left,
selector.loaded .reboot-slider-right{
    opacity: 1;
}
/*selector .ds-slider-left a:focus,*/
/*selector .ds-slider-right a:focus{*/
/*    outline: none !important;*/
/*}*/

@keyframes bgNext {
  0%   {opacity: 0; transform: scale(1.1);}
  100%   {opacity: 1; transform: scale(1);}
}

@media (min-width: 768px){
selector .reboot-bar,
selector .reboot-slider-left,
selector .reboot-slider-right{
    position: relative;
}
}

@media (max-width: 1380px) and (min-width: 768px){
selector{
    padding-left: 4%;
    padding-right: 4%;
}
}

@media (max-width: 767px){
selector .reboot-slider-left{
    left: calc(50% - 300px/2) !important;
}
selector .reboot-slider-right{
    right: calc(50% - 300px/2) !important;
}
}
reboot-slider

reboot-bar

reboot-changing-widget

reboot-changing-widget

reboot-changing-widget

reboot-side-slider

reboot-slider-left

reboot-slider-right
import mongoose, { Schema, Document, Model } from "mongoose";
import Joi, { ObjectSchema } from "joi";

interface IBook extends Document {
  id: number;
  title: string;
  author: string;
  year: number;
  genre: string;
}

const bookSchema: Schema<IBook> = new Schema({
  id: { type: Number, required: true, unique: true },
  title: { type: String, required: true },
  author: { type: String, required: true },
  year: { type: Number, required: true, min: 1800, max: 2025 },
  genre: { type: String, required: true, minlength: 2 },
});

const Books: Model<IBook> = mongoose.model<IBook>("MyBooks", bookSchema);

const bookDataValidator: ObjectSchema = Joi.object({
  id: Joi.number().min(1).required(),
  title: Joi.string().required(),
  author: Joi.string().required(),
  year: Joi.number().min(1800).max(2025).required(),
  genre: Joi.string().min(2).required(),
});

async function fetchBooks(): Promise<IBook[] | Error> {
  try {
    return await Books.find({});
  } catch (err) {
    return err as Error;
  }
}

const queryPageSchema: ObjectSchema = Joi.object({
  page: Joi.number().integer().min(1).required(),
});

//pagination fetching
async function fetchBooksByPage(page: {page:number}): Promise<{ status: number; data: IBook[] | string }> {
  try {
    const totalBooks = await Books.estimatedDocumentCount();
    console.log(page);
    if (totalBooks < (page.page - 1) * 2) {
      return { status: 404, data: "Sorry, no page found!" };
    } else if (totalBooks === 0) {
      return { status: 404, data: "Sorry, no book is there!" };
    }
    const booksData = await Books.find({}).skip((page.page - 1) * 2).limit(2);
    return { status: 200, data: booksData };
  } catch (err) {
    return { status: 500, data: (err as Error).message };
  }
}

async function addBook(title: string, author: string, year: number, genre: string): Promise<IBook | string | Error> {
  try {
    const lastDocument = await Books.find().sort({ id: -1 }).limit(1);
    const newBookId = lastDocument[0]?.id + 1 || 1;
    
    const { error, value } = bookDataValidator.validate({
      id: newBookId,
      title,
      author,
      year,
      genre,
    });
    
    if (error) return "Incorrect Data!";
    
    const newBook = new Books(value);
    return await newBook.save();
  } catch (err) {
    return err as Error;
  }
}

async function getBook(id: number): Promise<IBook | string | null | any> {
  try {
    const book = await Books.findOne({ id });
    return book || "No Books by this ID";
  } catch (err: any) {
    return err as Error;
  }
}

async function editBook(id: number, bodyValue: Partial<IBook>): Promise<IBook | string | null | any> {
  try {
    const updatedBook = await Books.findOneAndUpdate({ id }, { $set: bodyValue }, { new: true });
    return updatedBook || "No Books found to update";
  } catch (err: any) {
    return err as Error;
  }
}

async function deleteBook(id: number): Promise<IBook | null | Error> {
  try {
    return await Books.findOneAndDelete({ id });
  } catch (err) {
    return err as Error;
  }
}

const booksCurd = { fetchBooks, fetchBooksByPage, addBook, getBook, editBook, deleteBook, queryPageSchema }
export default booksCurd;
import mongoose from "mongoose";
import { Request, Response, NextFunction } from "express";

const connectDB = async (): Promise<void> => {
    try {
        await mongoose.connect("mongodb://localhost:27017/bookDB", {
            useNewUrlParser: true,
            useUnifiedTopology: true,
        } as mongoose.ConnectOptions);
        console.log("MongoDB connected!");
    } catch (err) {
        console.error("Error connecting to MongoDB:", err);
    }
};

const authenticationMiddleware = (req: Request, res: Response, next: NextFunction): void => {
    const authHeader = req.headers.authorization;
    if (authHeader) {
        const token = 'Bearer yesauth1234';
        if (token === authHeader) {
            next();
        } else {
            res.status(403).send("Invalid token");
        }
    } else {
        res.status(401).send("Authentication required");
    }
};

export { connectDB, authenticationMiddleware };
https://medium.com/the-andela-way/what-exactly-is-cors-and-how-to-handle-it-fc2e52e89a0

import express, { Request, Response, Application } from 'express';
import { connectDB, authenticationMiddleware } from '../mongoDB/bookLib_db';
import booksCurd from '../mongoDB/bookModel';

const app: Application = express();
const port: number = 6933;

app.use(express.json());
app.use(authenticationMiddleware);

// Connect to MongoDB
async function connectMongo(): Promise<void> {
    await connectDB();
}
connectMongo();

//Fetch all books or by page --- two books per page
app.get('/', async (req: Request, res: Response): Promise<any> => {
    try {
        if (req.query?.page) {
            const page = parseInt(req.query.page as string, 10);
            const { error, value } = booksCurd.queryPageSchema.validate({ page });
            
            if (error) {
                return res.status(400).json({ error: error.details.map(detail => detail.message) });
            }
            
            const booksDataResultPerPage = await booksCurd.fetchBooksByPage(value);
            return res.status(booksDataResultPerPage.status).json(booksDataResultPerPage.data);
        }
        
        const booksDataResult = await booksCurd.fetchBooks();
        return res.status(200).json(booksDataResult);
    } catch (error) {
        return res.status(500).json({ message: 'Internal Server Error', error });
    }
});

//Add a new book
app.post('/books', async (req: Request, res: Response): Promise<any> => {
    try {
        const { title, author, year, genre } = req.body;
        const savedBook = await booksCurd.addBook(title, author, year, genre);
        return res.status(201).json(savedBook);
    } catch (error) {
        return res.status(500).json({ message: 'Failed to add book', error });
    }
});

//Get a book by ID
app.get('/books/:id', async (req: any, res: Response): Promise<any> => {
    try {
        const findBook = await booksCurd.getBook(req.params.id);
        return res.json(findBook);
    } catch (error) {
        return res.status(500).json({ message: 'Failed to fetch book', error });
    }
});

//Update a book by ID
app.put('/books/:id', async (req: any, res: Response): Promise<any> => {
    try {
        const updatedBook = await booksCurd.editBook(req.params.id, req.body);
        return res.json(updatedBook);
    } catch (error) {
        return res.status(500).json({ message: 'Failed to update book', error });
    }
});

//Delete a book by ID
app.delete('/books/:id', async (req: any, res: Response): Promise<any> => {
    try {
        const deletedBook = await booksCurd.deleteBook(req.params.id);
        
        if (!deletedBook || Object.keys(deletedBook).length === 0) {
            return res.status(404).json({ message: 'No book found for deletion' });
        }
        
        return res.status(200).json(deletedBook);
    } catch (error) {
        return res.status(500).json({ message: 'Something went wrong, Internal Server Error!', error });
    }
});

app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});
const mongoose = require("mongoose");

mongoose.connect("mongodb://127.0.0.1:27017/feb");
const prodschema = new mongoose.Schema({ name: String, price: Number });

const mongooseSave = async () => {
	const prodmodel = mongoose.model("prodgooses", prodschema);
	let ent = new prodmodel({ name: "vinear wallet 1", price: 8000 });
	let result = await ent.save();
	console.log(result);
};
// mongooseSave();

const mongooseUpdate = async () => {
    const prodmodel = mongoose.model('prodgooses', prodschema);
    let ent = await prodmodel.updateOne({name: "vinear wallet"}, {$set:{price :9500}});
}
// mongooseUpdate();

const mongoosedel = async () => {
    const prodmodel = mongoose.model('prodgooses', prodschema);
    let ent = await prodmodel.deleteOne({name: 'vinear wallet 1'});
}
// mongoosedel();

const mongoosefind = async () => {
    const prodmodel = mongoose.model('prodgooses', prodschema);
    let ent = await prodmodel.find();
    console.log(ent);
}
mongoosefind();
import axios, { AxiosRequestConfig } from 'axios';
import Axios from 'axios';

import { setTokens } from 'screens/SignUp/reducer/signup.reducer';
import { persisterStore, store } from 'services/redux/store';

import { TypeStore } from './redux/store';
import { isTokenExpired } from './utils';
import { CONFIG } from 'constants/config';
// import { useLogout } from 'hooks/useLogout';
// import { NotificationBox } from 'components/notificationBox';

export const injectStore = (_store: TypeStore) => {
  let store: TypeStore;
  store = _store;
};

let isRefreshing = false;
let refreshSubscribers: any[] = [];

const processQueue = (error: null | string, token: string | null = null) => {
  refreshSubscribers.forEach((prom) => {
    if (error) {
      prom.reject(error);
    } else {
      prom.resolve(token);
    }
  });

  refreshSubscribers = [];
};
export interface ICapiumAuthPayload {
  email: string;
  password: string;
}
const capiumBaseURL = 'https://dev-identity.capium.co.uk/api/Auth/AuthenticateUser';
const googleUserInfoURL = 'https://www.googleapis.com/oauth2/v3/userinfo';
const refreshTokensURL = 'auth/refresh-tokens';

const fetchTokens = (refreshToken: string) => {
  return axios.post(
    `${CONFIG.apiUrl}${refreshTokensURL}`,
    {},
    {
      headers: {
        Authorization: `Bearer ${refreshToken}`,
      },
    }
  );
};

const instance = axios.create({
  baseURL: CONFIG.apiUrl,
  timeout: 60000,
});

const logOut = () => {
  // Clear user-related data from localStorage/sessionStorage
  localStorage.removeItem('authToken');
  localStorage.removeItem('refreshToken');
  persisterStore.purge(); // Purge persisted Redux store if needed

  // Optionally dispatch a Redux action to clear user state
  store.dispatch({ type: 'LOGOUT' });

  // Redirect to login page or any other route
  window.location.href = '/login';
};
export const setInterseptors = () => {
  instance.interceptors.request.use(async (config: AxiosRequestConfig<any>) => {
    const token = store.getState().user.token;
    const refreshToken = store.getState().user.refreshToken;

    if (!token) {
      return config;
    }
    if (config.headers!.Authorization) {
      return config;
    }

    if (isTokenExpired(token)) {
      if (isRefreshing) {
        return new Promise(function (resolve, reject) {
          refreshSubscribers.push({ resolve, reject });
          return config;
        })
          .then((token) => {
            config.headers &&
              (config.headers['Authorization'] = `Bearer ${token}`);
            return {
              ...config,
              headers: { Authorization: `Bearer ${token}` },
            };
          })
          .catch((error) => {
            return Promise.reject(error);
          });
      }
      isRefreshing = true;

      try {
        const { data } = await fetchTokens(refreshToken);
        store.dispatch(
          setTokens({
            accessToken: data.access_token,
            refreshToken: data.refresh_token,
          })
        );
        processQueue(null, data.access_token);
        isRefreshing = false;

        return {
          ...config,
          headers: { Authorization: `Bearer ${data.access_token}` },
        };
      } catch (err: any) {
        store.dispatch({ type: 'LOGOUT' });
        processQueue(err, null);
        isRefreshing = false;
        return config;
      }
    } else {
      return {
        ...config,
        headers: {
          Authorization: `Bearer ${token}`,
        },
      };
    }
  });
  return instance;
};


const token = store.getState().user.token;
export const apiServices = {
  postData: async (requestUrl: string, payload: any) => {
    const token = store.getState().user.token;
    console.warn('()()post-post', token, payload);

    // return await instance.post(`${requestUrl}`, payload, {
    //   headers: { Authorization: `Bearer ${token}` },
    // });
    try {
      const response = await instance.post(`${requestUrl}`, payload, {
        headers: { Authorization: `Bearer ${token}` },
      });
        if (response.data.message === 'TOKEN IS EXPIRED') {
          logOut();        
        } //else if (response.status !== 200) {
          // callNotification(response);
          // setNotification({yesShow: true, message: 'Something went wrong. Try after sometimes!', type: 'warning'});
          // dispatch(setNotification({yesShow: true, message: `${response.status} | Something went wrong. Try after sometimes!`, type: 'warning', position:'75'}))
        // } else if (response.status > 499 && response.status < 599) {
          // setNotification({yesShow: true, message: 'Technical Error. Sorry for Inconvience!', type: 'alert'});
          // dispatch(setNotification({yesShow: true, message: `${response.status} | Technical Error. Sorry for Inconvience!`, type: 'alert', position:'75'}))
        // }
      return response; 
    } catch (error: any) {
			// <NotificationBox titleText={notification.message || ''} closePopupFc={notificationRevoked} isShowPopup={notification.yesShow} type={notification.type}/>
      console.error('Error during POST request:', error);
      return error.response; // Return the successful response
      // throw error;
    }
  },
  fetchData: async (requestUrl: string, params?: {}) => {
    const token = store.getState().user.token;
    console.warn('()()fetch-get', token);
    // return instance.get(`${requestUrl}`, { params , headers: { Authorization: `Bearer ${token}` } });
    try {
      // Perform the GET request
      const response = await instance.get(`${requestUrl}`, {
        params,
        headers: { Authorization: `Bearer ${token}` },
      });
      
      if (response.data.message === 'TOKEN IS EXPIRED') {
      logOut(); // Call logOut when the token has expired
    }

    return response; // Return the successful response
  } catch (error: any) {
    console.error('Error during GET request:', error);

    // If error response indicates token expiry, log out
    if (error.response?.data?.message === 'TOKEN IS EXPIRED') {
      logOut(); // Log out if the token is expired
    }

    throw error; // Propagate the error for further handling
  }
  
  },
  changeData: async (requestUrl: string, payload: any) => {
    const token = store.getState().user.token;
    console.warn('()()change-put', token);
    try {
      // Perform the PUT request
      const response = await instance.put(`${requestUrl}`, payload, {
        headers: { Authorization: `Bearer ${token}` },
      });
  
      // Check if the token has expired
      if (response.data.message === 'TOKEN IS EXPIRED') {
        logOut(); // Call logOut when the token has expired
      }
  
      return response; // Return the successful response
    } catch (error: any) {
      console.error('Error during PUT request:', error);
  
      // If error response indicates token expiry, log out
      if (error.response?.data?.message === 'TOKEN IS EXPIRED') {
        logOut(); // Log out if the token is expired
      }
  
      throw error; // Propagate the error for further handling
    }
    // return instance.put(`${requestUrl}`, payload, {
    //   headers: { Authorization: `Bearer ${token}` },
    // });
  },
  deleteData: async (requestUrl: string, params?: {}) => {
    const token = store.getState().user.token;
    console.warn('()()delete-delete', token);
    try {
      // Perform the DELETE request
      const response = await instance.delete(`${requestUrl}`, {
        params,
        headers: { Authorization: `Bearer ${token}` },
      });
  
      // Check if the token has expired
      if (response.data.message === 'TOKEN IS EXPIRED') {
        logOut(); // Call logOut when the token has expired
      }
  
      return response; // Return the successful response
    } catch (error: any) {
      console.error('Error during DELETE request:', error);
  
      // If error response indicates token expiry, log out
      if (error.response?.data?.message === 'TOKEN IS EXPIRED') {
        logOut(); // Log out if the token is expired
      }
  
      throw error; // Propagate the error for further handling
    }
    // return instance.delete(`${requestUrl}`, { params, headers: { Authorization: `Bearer ${token}` } });
  },
  deleteDataPayload: async (requestUrl: string, payload?: any) => {
    const token = store.getState().user.token;
    console.warn('()()delete-delete', token);
    try {
      // Perform the DELETE request
      const response = await Axios.delete(requestUrl, {
          headers: {
            Authorization: `Bearer ${token}`,
          },
          data: payload,
        });
  
      // Check if the token has expired
      if (response.data.message === 'TOKEN IS EXPIRED') {
        logOut(); // Call logOut when the token has expired
      }
  
      return response; // Return the successful response
    } catch (error: any) {
      console.error('Error during DELETE request:', error);
      // If error response indicates token expiry, log out
      if (error.response?.data?.message === 'TOKEN IS EXPIRED') {
        logOut(); // Log out if the token is expired
      }
      throw error; // Propagate the error for further handling
    }
    // return instance.delete(`${requestUrl}`, { params, headers: { Authorization: `Bearer ${token}` } });
  },
  updateData: async (requestUrl: string, payload: any) => {
    const token = store.getState().user.token;
    console.warn('()()update-patch', token);
    try {
      // Perform the PATCH request
      const response = await instance.patch(`${requestUrl}`, payload, {
        headers: { Authorization: `Bearer ${token}` },
      });
      // Check if the token has expired
      if (response.data.message === 'TOKEN IS EXPIRED') {
        logOut(); // Call logOut when the token has expired
      }
  
      return response; // Return the successful response
    } catch (error: any) {
      console.error('Error during PATCH request:', error);
  
      // If error response indicates token expiry, log out
      if (error.response?.data?.message === 'TOKEN IS EXPIRED') {
        logOut(); // Log out if the token is expired
      }
      throw error; // Propagate the error for further handling
    }
    // return instance.patch(`${requestUrl}`, payload, {
    //   headers: { Authorization: `Bearer ${token}` },
    // });
  },
  capiumFetchData: async (payload: ICapiumAuthPayload) => {
    const token = store.getState().user.token;
    console.warn('()()capium-post', token);
    const data = axios.post(capiumBaseURL, payload, {
      headers: { Authorization: `Bearer ${token}` },
    });
    return data;
  },
  getGoogleUserInfo: async (token: string) => {
    console.warn('()()google-get', token);
    const data = await axios.get(googleUserInfoURL, {
      headers: { Authorization: `Bearer ${token}` },
    });
    return data;
  },
};
import { persistStore, persistReducer } from 'redux-persist';
import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit';
import { rootReducer } from './reducer';

import storage from 'redux-persist/lib/storage';
import storageSession from 'redux-persist/lib/storage/session';

const store = configureStore({
  reducer: rootReducer,
  middleware: getDefaultMiddleware({
    serializableCheck: false,
  }),
  // devTools: process.env.NODE_ENV !== 'production',
  devTools: false,
});

const persistConfig = {
  key: 'root',
  storage,
}

const persistedReducer = persistReducer(persistConfig, rootReducer);

const persisterStore = persistStore(store);
export { persisterStore, store };
export type RootState = ReturnType<typeof store.getState>;
export type TypeStore = typeof store;
free brawl stars gift card

free brawl stars gift card

free brawl stars gift card

free brawl stars gift card
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
https://github.com/leaknetworks/Claim-Today-brawl-stars-gift-card-in-2025-EASY-and-Legit
https://medium.com/@extrememiniboats/without-charge-brawl-stars-gift-card-claim-in-2025-updated-6d99f0ec5b12
https://medium.com/@dibratapon/gratis-brawl-stars-free-gems-in-2025-updated-and-easy-claim-efb6ed6770c8
https://github.com/leakedtoolspro/-Gratis-brawl-stars-gift-card-claim-today-in-2025
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
 name: prometheuses.monitoring.coreos.com
 annotations:
   argocd.argoproj.io/sync-options: ServerSideApply=true
import pandas as pd

# Cargar archivo
input_file = 'input.csv'
output_file = 'filtered_output.csv'

# Leer CSV
df = pd.read_csv(input_file)

# Paso 1: Identificar el monto del Tip por orden
# Creamos un nuevo DataFrame que contiene el monto del Tip por cada orden
tip_montos = df[df['item'].str.contains('Tip', case=False, na=False)][['orden', 'monto']]
tip_montos = tip_montos.rename(columns={'monto': 'monto_tip'})

# Paso 2: Unir esa información al DataFrame original (por la columna 'orden')
df = df.merge(tip_montos, on='orden', how='left')

# Paso 3: Aplicar el filtro original (conservar órdenes repetidas que tengan 'Tip')
filtered_df = df.groupby('orden').filter(lambda x: (x['item'].str.contains('Tip', case=False, na=False).any()))

# Paso 4: Eliminar filas sin 'metodo'
filtered_df = filtered_df[filtered_df['metodo'].notna()]

# Paso 5: Eliminar columna 'item'
filtered_df = filtered_df.drop(columns=['item'])

# Guardar resultado
filtered_df.to_csv(output_file, index=False)
print(f'Filtrado completado. Archivo guardado como {output_file}')
from dotenv import load_dotenv
from os import getenv
import vt

load_dotenv()

"""
requirements :
pip install python-dotenv==1.1.0
pip install vt_py==0.20.0

1 - Create account in https://www.virustotal.com/
2 - Copy your API Key and but it into .env file or put it into your script

"""
apikey = getenv('api_key')

url = input('URL:')

stats_meaning = {
    'malicious': 'No engine explicitly marked this URL as malicious (i.e., known for phishing, malware, scams, etc.). ✅',
    'suspicious': 'No engine thought the URL looked suspicious or sketchy based on patterns or heuristics. ✅',
    'harmless': 'engines scanned the URL and found it to be safe. ✅',
    'undetected': 'engines scanned it but didn’t detect anything, which often means they didn’t have an opinion one way or the other — like saying “no result.” 🟡',
    'timeout': 'No engines timed out while analyzing the URL. ✅',
}

with vt.Client(apikey=apikey) as client:
    analysis = client.scan_url(url=url, wait_for_completion=True)
    stats = analysis.stats
    for k in stats:
        print(f"{k} : {str(stats[k])} {stats_meaning[k].capitalize()}")


Windowstaste+R, Eintippen von resmon
Reiter CPU 
"Zugeordnete Handles"
"Handles durchsuchen"
Namen (oder einen Namensteil) des Objekts (Datei oder Ordner) eintippen der blockiert wird
mindestens eine Zeile mit dem Zugehörigen Prozess erscheint
Prozess beenden
<?php
if($_POST['password'] != 'secretpassword'){
    echo "Access Denied.";
    exit;
}
mysqlx_query("UPDATE users SET total=total+".$_POST['payout']." WHERE tracking_id=".$_POST['tracking_id'],$db);
?>
voz.vn##.js-inlineModContainer:has(.message-name,.bbCodeBlock-title,.message-attribution:has-text(tengtengvn))
voz.vn##.js-inlineModContainer:has(.message-name,.bbCodeBlock-title,.message-attribution:has-text(tengtengvn))
voz.vn##.js-inlineModContainer:has(.message-name,.bbCodeBlock-title,.message-attribution:has-text(tengtengvn))
import { useEffect, useState } from "react"
import { toast } from "react-toastify"
import { useNavigate } from "react-router-dom"
import { useSelector } from "react-redux"
import axios from "axios"
import {
  CheckCircle,
  XCircle,
  Home,
  MapPin,
  Package,
  PenToolIcon as Tool,
  FileText,
  Clock,
  Calendar,
  Truck,
  DollarSign,
  FileUp,
  CheckCheck,
  Award
} from "lucide-react"
import Navbar from "../components/Navbar"
import { ConfirmationModal } from "../modals/ConfirmationModal"
import API from "../API"

import { useDispatch } from "react-redux"
import { logout } from "../utils/UserSlice"

const TransporterDashboardPage = () => {
  const [tenders, setTenders] = useState([])
  const [history, setHistory] = useState([])
  const [showModal, setShowModal] = useState(false)
  const [selectedTender, setSelectedTender] = useState(null)
  const [responseForm, setResponseForm] = useState({
    price: "",
    vehicleNo: "",
    attachments: [],
  })
  const [view, setView] = useState(false)
  const [loading, setLoading] = useState(true)
  const [error, setError] = useState(null)
  const [isSubmitting, setIsSubmitting] = useState(false)
  const [confirmDialog, setConfirmDialog] = useState(null)
  const [historyLoading, setHistoryLoading] = useState(false)
  const [historyError, setHistoryError] = useState(null)
  const [transporters, setTransporters] = useState([])
  const [transporterMap, setTransporterMap] = useState({})

  const navigate = useNavigate()
  const dispatch = useDispatch()


  const userInfo = useSelector((state) => state.User?.userInfo)
  const userName = userInfo?.name || "RR User"

  const fetchTenders = async () => {
    try {
      const res = await fetch(`${API.FETCH_ALL_TENDERS}`, {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
        },
        credentials: "include",
      })

      const data = await res.json()
      // console.log("fetch all tenders : ", data.data)

      const userId = userInfo?._id

      // Mark tenders where this user has submitted a quotation
      const updatedTenders = (data.data || []).map((tender) => {
        const hasUserQuoted = (tender.quotations || []).some((q) => {
          if (typeof q === 'object' && q.transportUser?._id) {
            return q.transportUser._id === userId
          }
          return false
        })

        return {
          ...tender,
          hasUserQuoted,
        }
      })

      setTenders(updatedTenders);

    } catch (err) {
      console.error("Fetch error:", err)
      setError("Failed to load tenders.")
    } finally {
      setLoading(false)
    }
  }

  useEffect(() => {

    fetchTenders()
  }, [])

  const fetchTransporters = async () => {
    try {
      const res = await axios.get(API.FETCH_ALL_TRANSPORTER, {
        withCredentials: true,
      })
      const list = res.data?.data || []
      // console.log("transporter's name : ", res.data)
      setTransporters(list)

      // create a map for quick lookup
      const map = {}
      list.forEach((t) => {
        map[t._id] = t.name
      })
      setTransporterMap(map)
    } catch (err) {
      console.error("Error fetching transporter list:", err)
    }
  }

  // const handleReject = (id) => {
  //   setConfirmDialog({
  //     message: "Are you sure you want to reject this tender?",
  //     onConfirm: () => {
  //       setTenders((prev) => prev.filter((t) => t.id !== id))
  //       toast.info("Tender rejected.")
  //       setConfirmDialog(null)
  //     },
  //     onCancel: () => setConfirmDialog(null),
  //   })
  // }

  const handleApprove = (tender) => {
    setSelectedTender(tender)
    setShowModal(true)
  }

  const handleFileChange = (e) => {

    const file = e.target.files?.[0]

    if (file && !["image/jpeg", "image/jpg"].includes(file.type)) {
      toast.error("Only JPG and JPEG files are allowed.")
      e.target.value = null // Reset input
      return
    }

    setResponseForm({
      ...responseForm,
      attachments: e.target.files?.[0] ? [e.target.files[0]] : [],
    })
  }

  const handleResponseChange = (e) => {
    setResponseForm({ ...responseForm, [e.target.name]: e.target.value })
  }

  const handleSubmitResponse = async () => {
    if (!responseForm.price || !responseForm.vehicleNo) {
      toast.warning("Price and vehicle number are required.")
      return
    }

    const formData = new FormData()
    formData.append("price", responseForm.price)
    formData.append("vehicleNumber", responseForm.vehicleNo)

    if (responseForm.attachments.length > 0) {
      formData.append("file", responseForm.attachments[0])
    }

    // console.log([...formData.entries()])
    setIsSubmitting(true)

    try {
      const res = await fetch(`${API.SUBMIT_QUOTATION}/${selectedTender._id}`, {
        method: "POST",
        body: formData,
        credentials: "include",
      })

      const result = await res.json()

      if (res.ok) {
        toast.success("Quotation submitted successfully!")

        setHistory((prev) => [
          ...prev,
          {
            rrName: selectedTender.rrName,
            price: responseForm.price,
            vehicleNo: responseForm.vehicleNo,
            attachments: result.data.files?.map((f) => f.originalName || f.url) || [],
            dispatchLocation: selectedTender.dispatchLocation,
            materials: selectedTender.materials.map((m) => ({
              item: m.material,
              subItem: m.subMaterial,
              weight: m.weight,
              quantity: m.quantity,
            })),
          },
        ])

        setShowModal(false)
        setResponseForm({ price: "", vehicleNo: "", attachments: [] })

        // Refresh tender list to reflect quotation
        await fetchTenders()

      } else {
        toast.error(result.message || "Failed to submit quotation.")
      }
    } catch (error) {
      console.error("Quotation Submit Error:", error)
      toast.error("An error occurred while submitting your quotation.")
    } finally {
      setIsSubmitting(false)
    }
  }

  // const handleClearHistory = () => {
  //   setConfirmDialog({
  //     message: "Are you sure you want to delete all history?",
  //     onConfirm: () => {
  //       setHistory([])
  //       toast.info("All history cleared.")
  //       setConfirmDialog(null)
  //     },
  //     onCancel: () => setConfirmDialog(null),
  //   })
  // }

  // const handleDeleteHistoryItem = (index) => {
  //   setConfirmDialog({
  //     message: "Delete this history entry?",
  //     onConfirm: () => {
  //       setHistory((prev) => prev.filter((_, idx) => idx !== index))
  //       toast.success("History entry deleted.")
  //       setConfirmDialog(null)
  //     },
  //     onCancel: () => setConfirmDialog(null),
  //   })
  // }

  const handleLogout = async () => {
    try {
      await axios.post(API.LOGOUT_USER, {}, { withCredentials: true })
      dispatch(logout())
      toast.success("Logged out successfully!")
    } catch (err) {
      console.error("Logout failed:", err)
      toast.error("Logout failed. Please try again.")
    } finally {
      navigate("/signin")
    }
  }


  const handleToggleView = async () => {
    if (!view) {
      // Switching to history view
      setHistoryLoading(true)
      setHistoryError(null)
      try {
        await fetchTransporters()
        const res = await axios.get(API.HISTORY_FOR_QUOTATION_QUOTE, {
          withCredentials: true,
          headers: {
            "Content-Type": "application/json",
          },
        })

        // console.log("History response:", res.data)

        const enriched = res.data.data.map((entry) => {
          return {
            ...entry,
            transporterName: transporterMap[entry.tenderId] || "Unknown Transporter",
          }
        })

        setHistory(enriched)
      } catch (err) {
        console.error("Failed to load history:", err)
        if (err.response) {
          console.error("Server responded with:", err.response.status, err.response.data)
        } else if (err.request) {
          console.error("No response received:", err.request)
        }
        setHistoryError("Failed to load submission history.")
      } finally {
        setHistoryLoading(false)
      }
    }
    setView((prev) => !prev)
  }

  const navbarActions = (
    <button
      onClick={handleToggleView}
      className="px-4 py-2 bg-teal-600 text-white rounded-md hover:bg-teal-700 transition-colors duration-200 flex items-center gap-2 shadow-sm"
    >
      {view ? (
        <>
          <Package className="h-4 w-4" /> Back to Dashboard
        </>
      ) : (
        <>
          <Clock className="h-4 w-4" /> View History
        </>
      )}
    </button>
  )

  const formatDate = (dateString) => {
    if (!dateString) return "N/A"
    return new Date(dateString).toLocaleDateString("en-US", {
      year: "numeric",
      month: "long",
      day: "numeric",
    })
  }

  return (
    <div className="min-h-screen bg-slate-200">
      <Navbar
        title="Transporter Dashboard"
        userName={userName || "Transport User"}
        actions={navbarActions}
        onLogout={handleLogout}
      />

      <div className="py-8 px-4 max-w-6xl mx-auto">
        {loading ? (
          <div className="flex justify-center items-center h-64">
            <div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-teal-500"></div>
          </div>
        ) : error ? (
          <div className="text-center p-8 bg-red-50 rounded-lg border border-red-200 text-red-600">
            <XCircle className="h-8 w-8 mx-auto mb-2" />
            {error}
          </div>
        ) : view ? (
          historyLoading ? (
            <div className="flex justify-center items-center h-64">
              <div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-teal-500"></div>
            </div>
          ) : historyError ? (
            <div className="text-center p-8 bg-red-50 rounded-lg border border-red-200 text-red-600">
              <XCircle className="h-8 w-8 mx-auto mb-2" />
              {historyError}
            </div>
          ) : history.length > 0 ? (
            <div className="mb-10">
              <div className="flex justify-between items-center mb-6">
                <h3 className="text-2xl font-bold text-teal-700 flex items-center gap-2">
                  <FileText className="h-6 w-6 text-teal-600" />
                  Submission History
                </h3>

                {/* <button
                  onClick={handleClearHistory}
                  className=" bg-red-100 flex items-center gap-2 px-4 py-2 text-red-600 border border-red-300 rounded-md hover:bg-red-500 hover:text-white transition-colors duration-200">
                  <XCircle className="h-4 w-4" />
                  Clear All
                </button> */}

              </div>
              <div className="grid gap-6">
                {history.map((entry, idx) => (
                  <div
                    key={entry._id || idx}
                    className="relative bg-white border border-slate-200 rounded-xl shadow-sm p-6 transition-all duration-200 hover:shadow-md"
                  >
                    {/* Delete Button */}
                    {/* <button
                      onClick={() => handleDeleteHistoryItem(idx)}
                      className="absolute top-4 right-4 text-slate-400 hover:text-red-500 transition-colors duration-200"
                      title="Delete Entry">
                      <XCircle className="h-5 w-5" />
                    </button> */}

                    {/* Header with status badge */}
                    <div className="mb-4 pb-4 border-b border-slate-100 ">
                      <div className="flex flex-wrap items-start justify-between gap-2">
                        <h4 className="text-lg font-semibold text-slate-800">Quotation #{idx + 1}</h4>
                        <span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-teal-100 text-teal-800">
                          Submitted
                        </span>
                      </div>
                    </div>

                    {/* Tender Info Grid */}
                    <div className="grid sm:grid-cols-2 gap-4 text-sm">
                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <Home className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">RR User</p>
                          <p className="font-medium text-slate-800">{entry.tender?.createdBy?.name || "Unknown"}</p>
                          <p className="text-xs text-slate-500">
                            {entry.tender?.createdBy?.email || "Email not available"}
                          </p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <Calendar className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Delivery Window</p>
                          <p className="font-medium text-slate-800">
                            {entry.tender?.deliveryWindow?.from && entry.tender?.deliveryWindow?.to
                              ? `${formatDate(entry.tender.deliveryWindow.from)} to ${formatDate(entry.tender.deliveryWindow.to)}`
                              : "N/A"}
                          </p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <Clock className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Closing Date</p>
                          <p className="font-medium text-slate-800">{formatDate(entry.tender?.closeDate)}</p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <Clock className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Submitted On</p>
                          <p className="font-medium text-slate-800">
                            {new Date(entry.createdAt).toLocaleString("en-US", {
                              year: "numeric",
                              month: "long",
                              day: "numeric",
                              hour: "2-digit",
                              minute: "2-digit",
                              hour12: true,
                            })}
                          </p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <MapPin className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Location</p>
                          <p className="font-medium text-slate-800">{entry.tender?.dispatchLocation || "N/A"}</p>
                          <p className="text-xs text-slate-500">
                            {entry.tender?.address ? `${entry.tender.address}, ` : ""}
                            {entry.tender?.pincode || ""}
                          </p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <Truck className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Vehicle Number</p>
                          <p className="font-medium text-slate-800">{entry.vehicleNumber}</p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <DollarSign className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Price</p>
                          <p className="font-medium text-slate-800">₹ {entry.price}</p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <Package className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Total Weight</p>
                          <p className="font-medium text-slate-800">{entry.tender?.totalWeight ?? "N/A"} kg</p>
                        </div>
                      </div>

                      <div className="flex items-start gap-2">
                        <span className="text-slate-500 mt-0.5">
                          <Package className="h-4 w-4" />
                        </span>
                        <div>
                          <p className="text-slate-500">Total Quantity</p>
                          <p className="font-medium text-slate-800">{entry.tender?.totalQuantity ?? "N/A"} pcs</p>
                        </div>
                      </div>
                    </div>

                    {/* Remarks */}
                    {entry.tender?.remarks && (
                      <div className="mt-4 bg-amber-50 border border-amber-100 rounded-lg p-3 text-sm">
                        <div className="flex gap-2">
                          <FileText className="h-4 w-4 text-amber-600 mt-0.5 flex-shrink-0" />
                          <div>
                            <span className="font-medium text-amber-800">Remarks:</span> {entry.tender.remarks}
                          </div>
                        </div>
                      </div>
                    )}

                    {/* Materials List */}
                    {entry.tender?.materials?.length > 0 && (
                      <div className="mt-4 bg-slate-50 border border-slate-200 rounded-lg p-4">
                        <h4 className="text-sm font-semibold text-slate-800 mb-3 flex items-center gap-2">
                          <Tool className="h-4 w-4 text-slate-600" /> Materials
                        </h4>
                        <div className="overflow-x-auto">
                          <table className="w-full text-sm">
                            <thead>
                              <tr className="bg-slate-100 text-slate-600">
                                <th className="px-3 py-2 text-left">Material</th>
                                <th className="px-3 py-2 text-left">Sub Item</th>
                                <th className="px-3 py-2 text-right">Weight (Kg)</th>
                                <th className="px-3 py-2 text-right">Quantity</th>
                              </tr>
                            </thead>
                            <tbody>
                              {entry.tender.materials.map((m, i) => (
                                <tr key={m._id || i} className="border-t border-slate-200">
                                  <td className="px-3 py-2 font-medium">{m.material}</td>
                                  <td className="px-3 py-2">{m.subMaterial || "-"}</td>
                                  <td className="px-3 py-2 text-right">{m.weight || "-"}</td>
                                  <td className="px-3 py-2 text-right">{m.quantity || "-"}</td>
                                </tr>
                              ))}
                            </tbody>
                          </table>
                        </div>
                      </div>
                    )}

                    {/* Attachments */}
                    <div className="mt-4">
                      <h4 className="text-sm font-semibold text-slate-800 mb-2 flex items-center gap-2">
                        <FileUp className="h-4 w-4 text-slate-600" /> Attachments
                      </h4>
                      {entry.files?.length > 0 ? (
                        <div className="flex flex-wrap gap-2">
                          {entry.files.map((f, i) => {
                            const label = f.originalName || f.name || `File ${i + 1}`
                            const fileUrl = f.url || f

                            return (
                              <a
                                key={i}
                                href={fileUrl}
                                target="_blank"
                                rel="noopener noreferrer"
                                className="inline-flex items-center gap-1.5 px-3 py-1.5 bg-slate-100 text-slate-700 rounded-md hover:bg-slate-200 transition-colors duration-200 text-sm"
                              >
                                <FileText className="h-3.5 w-3.5" />
                                {label}
                              </a>
                            )
                          })}
                        </div>
                      ) : (
                        <p className="text-slate-500 text-sm">No attachments</p>
                      )}
                    </div>
                  </div>
                ))}
              </div>
            </div>
          ) : (
            <div className="flex flex-col items-center justify-center h-64 bg-white rounded-xl border border-slate-200 p-8">
              <FileText className="h-12 w-12 text-slate-300 mb-4" />
              <p className="text-slate-500 text-lg">No submission history available</p>
              <button
                onClick={handleToggleView}
                className="mt-4 px-4 py-2 bg-teal-600 text-white rounded-md hover:bg-teal-700 transition-colors duration-200"
              >
                Return to Dashboard
              </button>
            </div>
          )
        ) : tenders.length === 0 ? (
          <div className="flex flex-col items-center justify-center h-64 bg-white rounded-xl border border-slate-200 p-8">
            <Package className="h-12 w-12 text-slate-300 mb-4" />
            <p className="text-slate-500 text-lg">No pending tenders available</p>
          </div>
        ) : (
          <>
            <h1 className="text-2xl font-bold text-teal-700 mb-6 flex items-center gap-2">
              <Package className="h-6 w-6" />
              Available Tenders
            </h1>

            <div className="space-y-8">
              {tenders.map((tender) => (
                <div
                  key={tender._id}
                  className="bg-white p-6 rounded-xl shadow-sm border border-slate-200 transition-all duration-200 hover:shadow-md"
                >
                  {/* Header */}
                  <div className="flex flex-wrap justify-between items-start gap-4 pb-4 border-b border-slate-100 mb-4">
                    <div>
                      <h3 className="text-xl font-bold text-slate-800 mb-1">
                        Tender from {tender.createdBy?.name || "Unknown RR User"}
                      </h3>
                      <p className="text-sm text-slate-500">{tender.createdBy?.email || "Email not available"}</p>
                    </div>

                    {/* <div className="flex items-center gap-2">
                      <span className="text-xs font-medium px-2.5 py-0.5 rounded-full bg-amber-100 text-amber-800">
                        Pending Response
                      </span>
                    </div> */}

                    <div className="flex items-center gap-2">
                      <span className={`text-xs font-medium px-2.5 py-0.5 rounded-full ${tender.hasUserQuoted ? "bg-green-100 text-green-800" : "bg-amber-100 text-amber-800"}`}>
                        {tender.hasUserQuoted ? "Quotation Submitted" : "Pending Response"}
                      </span>
                    </div>
                  </div>

                  {/* Info Grid */}
                  <div className="grid md:grid-cols-2 gap-4 mb-6">
                    <div className="flex items-start gap-3">
                      <div className="bg-teal-100 p-2 rounded-lg text-teal-600">
                        <Calendar className="h-5 w-5" />
                      </div>
                      <div>
                        <p className="text-sm text-slate-500">Delivery Window</p>
                        <p className="font-medium text-slate-800">
                          {tender.deliveryWindow?.from && tender.deliveryWindow?.to
                            ? `${formatDate(tender.deliveryWindow.from)} to ${formatDate(tender.deliveryWindow.to)}`
                            : "N/A"}
                        </p>
                      </div>
                    </div>

                    <div className="flex items-start gap-3">
                      <div className="bg-purple-100 p-2 rounded-lg text-purple-600">
                        <Clock className="h-5 w-5" />
                      </div>
                      <div>
                        <p className="text-sm text-slate-500">Closing Date</p>
                        <p className="font-medium text-slate-800">{formatDate(tender?.closeDate)}</p>
                      </div>
                    </div>

                    <div className="flex items-start gap-3">
                      <div className="bg-rose-100 p-2 rounded-lg text-rose-600">
                        <MapPin className="h-5 w-5" />
                      </div>
                      <div>
                        <p className="text-sm text-slate-500">Location</p>
                        <p className="font-medium text-slate-800">{tender.dispatchLocation || "N/A"}</p>
                      </div>
                    </div>

                    <div className="flex items-start gap-3">
                      <div className="bg-sky-100 p-2 rounded-lg text-sky-600">
                        <Home className="h-5 w-5" />
                      </div>
                      <div>
                        <p className="text-sm text-slate-500">Address</p>
                        <p className="font-medium text-slate-800">
                          {tender.address || "N/A"}
                          {tender.pincode ? `, ${tender.pincode}` : ""}
                        </p>
                      </div>
                    </div>
                  </div>

                  {/* Materials Table */}
                  <div className="bg-slate-50 rounded-lg p-4 mb-6">
                    <h4 className="font-semibold mb-3 text-slate-700 flex items-center gap-2">
                      <Tool className="h-5 w-5 text-slate-600" /> Materials
                    </h4>
                    <div className="overflow-x-auto">
                      <table className="w-full text-sm">
                        <thead>
                          <tr className="bg-slate-100 text-slate-600">
                            <th className="px-4 py-2 text-left rounded-l-md">Material</th>
                            <th className="px-4 py-2 text-left">Sub Item</th>
                            <th className="px-4 py-2 text-right">Weight (Kg)</th>
                            <th className="px-4 py-2 text-right rounded-r-md">Quantity</th>
                          </tr>
                        </thead>
                        <tbody>
                          {tender.materials.map((m, index) => (
                            <tr
                              key={m._id}
                              className={`${index % 2 === 0 ? "bg-white" : "bg-slate-50"} hover:bg-slate-100 transition-colors duration-150`}
                            >
                              <td className="px-4 py-2 font-medium">{m.material}</td>
                              <td className="px-4 py-2">{m.subMaterial || "-"}</td>
                              <td className="px-4 py-2 text-right">{m.weight || "-"}</td>
                              <td className="px-4 py-2 text-right">{m.quantity || "-"}</td>
                            </tr>
                          ))}
                        </tbody>
                      </table>
                    </div>
                  </div>

                  {/* Summary Stats */}
                  <div className="flex flex-wrap gap-4 mb-4">
                    <div className="bg-teal-50 border border-teal-100 px-4 py-2 rounded-lg">
                      <span className="text-slate-600 text-sm">Total Weight: </span>
                      <span className="text-teal-700 font-semibold">{tender?.totalWeight ?? "N/A"} kg</span>
                    </div>
                    <div className="bg-teal-50 border border-teal-100 px-4 py-2 rounded-lg">
                      <span className="text-slate-600 text-sm">Total Quantity: </span>
                      <span className="text-teal-700 font-semibold">{tender?.totalQuantity ?? "N/A"} pcs</span>
                    </div>
                  </div>

                  {/* Remarks */}
                  {tender.remarks && (
                    <div className="mb-6 bg-amber-50 border border-amber-100 rounded-lg p-3 text-sm">
                      <div className="flex gap-2">
                        <FileText className="h-4 w-4 text-amber-600 mt-0.5 flex-shrink-0" />
                        <div>
                          <span className="font-medium text-amber-800">Remarks:</span> {tender.remarks}
                        </div>
                      </div>
                    </div>
                  )}

                  {/* Action Buttons */}
                  {tender.hasUserQuoted ? (
                    <div className="flex justify-center mt-4 animate-fadeIn">
                      <div className="inline-flex items-center gap-2 px-5 py-3 bg-gradient-to-r from-green-50 to-emerald-50 text-emerald-700 font-medium text-sm border border-emerald-200 rounded-lg shadow-sm">
                        <Award className="h-5 w-5 text-emerald-500" />
                        <span>Quotation Submitted</span>
                        <CheckCheck className="h-5 w-5 text-emerald-500 ml-1" />
                      </div>
                    </div>
                  ) : (
                    <div className="flex flex-col sm:flex-row gap-3 justify-center mt-6">
                      {/* <button
                        onClick={() => handleReject(tender._id)}
                        className="bg-white border border-slate-300 text-slate-700 px-6 py-2.5 rounded-lg hover:bg-slate-50 transition-all duration-200 flex items-center justify-center gap-2 shadow-sm hover:shadow"
                      >
                        <XCircle className="h-5 w-5 text-red-500" />
                        <span>Reject</span>
                      </button> */}

                      <button
                        onClick={() => handleApprove(tender)}
                        className="bg-gradient-to-r from-teal-600 to-emerald-600 text-white px-6 py-2.5 rounded-lg hover:from-teal-700 hover:to-emerald-700 transition-all duration-200 flex items-center justify-center gap-2 shadow-sm hover:shadow"
                      >
                        <CheckCircle className="h-5 w-5" />
                        <span>Approve</span>
                      </button>
                    </div>
                  )}

                </div>
              ))}
            </div>
          </>
        )}
      </div>

      {/* Quotation Modal */}
      {showModal && selectedTender && (
        <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4">
          <div className="bg-white rounded-xl p-6 w-full max-w-lg max-h-[90vh] overflow-y-auto">
            <h3 className="text-xl font-bold text-slate-800 mb-6 flex items-center gap-2">
              <FileText className="h-5 w-5 text-teal-600" />
              Submit Quotation
            </h3>
            <div className="space-y-5">
              <div>
                <label className="block font-medium mb-1.5 text-sm text-slate-700">Price (₹)</label>
                <input
                  name="price"
                  value={responseForm.price}
                  onChange={handleResponseChange}
                  type="number"
                  placeholder="Enter your price"
                  className="w-full px-3 py-2.5 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-teal-500 focus:border-transparent"
                  required
                />
              </div>
              <div>
                <label className="block font-medium mb-1.5 text-sm text-slate-700">Vehicle Details</label>
                <input
                  name="vehicleNo"
                  value={responseForm.vehicleNo}
                  onChange={handleResponseChange}
                  type="text"
                  placeholder="Enter vehicle details"
                  className="w-full px-3 py-2.5 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-teal-500 focus:border-transparent"
                  required
                />
              </div>
              <div>
                <label className="block font-medium mb-1.5 text-sm text-slate-700">Attachments</label>
                <div className="border border-dashed border-slate-300 rounded-lg p-4 bg-slate-50">
                  <input
                    type="file"
                    accept=".jpg,.jpeg,image/jpeg"
                    onChange={handleFileChange}
                    className="w-full text-sm text-slate-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-medium file:bg-teal-50 file:text-teal-700 hover:file:bg-teal-100"
                  />
                  <p className="text-xs text-slate-500 mt-2">
                    Only upload <strong>.jpg</strong> or <strong>.jpeg</strong> files
                  </p>

                </div>
              </div>
            </div>
            <div className="flex flex-col sm:flex-row sm:justify-end gap-3 mt-8">
              <button
                onClick={() => setShowModal(false)}
                className="px-5 py-2.5 border border-slate-300 rounded-lg text-sm text-slate-700 hover:bg-slate-50 transition-colors duration-200 order-2 sm:order-1"
              >
                Cancel
              </button>
              <button
                onClick={handleSubmitResponse}
                className="px-5 py-2.5 bg-teal-600 text-white rounded-lg text-sm hover:bg-teal-700 transition-colors duration-200 order-1 sm:order-2 flex items-center justify-center"
                disabled={isSubmitting}
              >
                {isSubmitting ? (
                  <>
                    <svg
                      className="animate-spin h-4 w-4 text-white mr-2"
                      xmlns="http://www.w3.org/2000/svg"
                      fill="none"
                      viewBox="0 0 24 24"
                    >
                      <circle
                        className="opacity-25"
                        cx="12"
                        cy="12"
                        r="10"
                        stroke="currentColor"
                        strokeWidth="4"
                      ></circle>
                      <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v8H4z"></path>
                    </svg>
                    Submitting...
                  </>
                ) : (
                  "Submit Quotation"
                )}
              </button>
            </div>
          </div>
        </div>
      )}

      {/* Confirmation Modal */}
      {confirmDialog && (
        <ConfirmationModal
          message={confirmDialog.message}
          onConfirm={confirmDialog.onConfirm}
          onCancel={confirmDialog.onCancel}
        />
      )}
    </div>
  )
}

export default TransporterDashboardPage
CREATE TABLE Hastalar (
    PatientID INT PRIMARY KEY AUTO_INCREMENT,
    Ad VARCHAR(50) NOT NULL,
    Soyad VARCHAR(50) NOT NULL,
    TCKN CHAR(11) UNIQUE NOT NULL,
    DogumTarihi DATE NOT NULL,
    Cinsiyet ENUM('Erkek', 'Kadın', 'Diğer') NOT NULL,
    Telefon VARCHAR(20),
    Eposta VARCHAR(100),
    Adres TEXT,
    Boy DECIMAL(5,2),
    Kilo DECIMAL(5,2),
    SigortaTuru ENUM('SGK', 'Özel', 'Yok'),
    Alerjiler TEXT,
    KronikHastaliklar TEXT,
    KanGrubu ENUM('A+', 'A-', 'B+', 'B-', 'AB+', 'AB-', 'O+', 'O-')
);
ollama pull llama3.2
echo "FROM llama3.2" >> Modelfile
echo "SYSTEM You are a friendly assistant." >> Modelfile
ollama create -f Modelfile killrkingz/brandonjessup
ollama push killrkingz/brandonjessup
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":cute-sun: Boost Days - What's On This Week :cute-sun:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Xero Café :coffee:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n :new-thing: *This week we are offering:* \n\n :caramel-slice: Anzac Slices  \n\n :cheesecake: Raspberry and White Choc cheesecake  \n\n *Weekly Café Special:* _Iced Matcha Latte_"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": " Wednesday, 23rd April :calendar-date-16:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "  \n\n \n\n :lunch: *Light Lunch*: Provided by Kartel Catering from *12pm* \n\n"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Thursday, 24th April :calendar-date-17:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":breakfast: *Breakfast*: Provided by *Kartel Catering* from *8:30am - 10:30am* in the Wominjeka Breakout Space."
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Stay tuned for more fun throughout the year. :party-wx:"
			}
		}
	]
}
input.Add_notes _field = "<style>input.zc-live-primary-btn { display: none;}</style>";
Teamwork Communications Group is the one-stop destination for all brands who seek to be at the forefront of the news and want to increase their presence among the right target audience. We are the Best PR Firm in India purveying brands to build a hero position in the market using effective communication strategies, including Digital and Influencer marketing.
End-to-end solutions for P2E Game Development can help your business generate new revenue streams.  We are the top Play-to-Earn Game development Company, providing outstanding P2E game development services.  Hire Play-to-Earn game developers to make your gaming concepts a reality.  Attract players and investors with an advanced gaming platform that is built for long-term growth and success.
https://chatgpt.com/share/67fea1e0-4fe0-800f-bdd8-9a39c7ea02d9
OTT Influence is the best influencer marketing agency in Delhi, offering impeccable services that connect your brand with the right influencers. At OTT, we unite brands with top micro-influencers, ensuring maximum engagement.
{"url":"https://chatgpt.com","cookies":[{"domain":"chatgpt.com","hostOnly":true,"httpOnly":true,"name":"__Host-next-auth.csrf-token","path":"/","sameSite":"lax","secure":true,"session":true,"storeId":"0","value":"337eca6f64d51ab44e96ad2d730a6cf61bb4dd6a187648fb95eff5251758c62a%7C34fa57fcbc4a093c97c166ee58c7514903c45ebb9d0c77871c193edded99daf9"},{"domain":".chatgpt.com","expirationDate":1775794870.919494,"hostOnly":false,"httpOnly":false,"name":"oai-did","path":"/","sameSite":"lax","secure":false,"session":false,"storeId":"0","value":"ad550994-b717-475c-a09d-8e4cbc3a47a8"},{"domain":".chatgpt.com","hostOnly":false,"httpOnly":true,"name":"_cfuvid","path":"/","sameSite":"no_restriction","secure":true,"session":true,"storeId":"0","value":".ZCzOJ0HNEjbK91wVle70wP3trWE7YHKqSZdgLdAVa8-1744690871171-0.0.1.1-604800000"},{"domain":"chatgpt.com","hostOnly":true,"httpOnly":true,"name":"__Secure-next-auth.callback-url","path":"/","sameSite":"lax","secure":true,"session":true,"storeId":"0","value":"https%3A%2F%2Fchatgpt.com%2F"},{"domain":"chatgpt.com","expirationDate":1775794891.241609,"hostOnly":true,"httpOnly":false,"name":"oai-hlib","path":"/","sameSite":"lax","secure":false,"session":false,"storeId":"0","value":"true"},{"domain":"chatgpt.com","expirationDate":1747282965.209637,"hostOnly":true,"httpOnly":false,"name":"oai-last-model","path":"/","sameSite":"lax","secure":false,"session":false,"storeId":"0","value":"gpt-4o"},{"domain":".chatgpt.com","expirationDate":1744704853.116044,"hostOnly":false,"httpOnly":true,"name":"__cf_bm","path":"/","sameSite":"no_restriction","secure":true,"session":false,"storeId":"0","value":"eidvaDKwtbwpzrq_NJH.8ywhU.vVijHaVFGQRkyUhYw-1744703053-1.0.1.1-NefiTbmmfXv_8q2sul4dkkP3RmK4ktDE75ulFGxiMUWqBl50y5jKFL4HqwjaW6GviS6GboCbabSNFqhF.Ho0agHhTLkzPcIIpHLlcgDKpbw"},{"domain":"chatgpt.com","expirationDate":1744706653.116104,"hostOnly":true,"httpOnly":true,"name":"__cflb","path":"/","sameSite":"no_restriction","secure":true,"session":false,"storeId":"0","value":"0H28vzvP5FJafnkHxiseZX82KGkF3aDneuym4DsnykP"},{"domain":".chatgpt.com","expirationDate":1752479110.805003,"hostOnly":false,"httpOnly":true,"name":"__Secure-next-auth.session-token.0","path":"/","sameSite":"lax","secure":true,"session":false,"storeId":"0","value":"eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..cU2BC9TN0Dtu249y.rG4LXkHvBtSWg4fahhqUwcT3c2vSEXF9UNjhpEkjKbsaSt_olRyQSrjF3SWLvFtrJYHaOYmNX8qutYWtnIrhy6uUda5M4L8SkOVqwDaLnfMsdxtkmrDuiHaIrW49fR65USLZeZKZe_gIJNkHmUwgNcmNSXU9CONzlCKiG5khNZIZh185QDXk6oidVbXleDTmtmG1KmXTPg1v6hAen1zS8rtCxrCyNwVteWrSczvVJVmZwaPPm_atnmCIVqQ5h6OLSR30y96NemRTLjl8jfXKtd09MXF7a1XSSg5q2sn3DFYu1Wse4FJzoc37TEAhsC_GnOmY3MXHubHdVCHwlxlrrIjG8adaztLNZNhBSjTp0UBfvMgl1lAaXUgYLdyX3pPLTpN43SfUqFv7hgJnsyiFXe5ze_3SecoxURBw7uZU2g0uqh5tdn0_TMg3vJwaJZ3iUMP_63HkKRwhe0mq02f22vkuGuet2P_i5SzjHTsTTKdVliR-_TW_Gel4bTl2eAw6rm5tXjfo0-D1FfHvivcADNzCJCLrVeIC1p6NV3Sr70Rhj_ip0s_r3aN9NOxLwYt9aEhcpZPS4joyRgddFWLyQcXHqZr-45pAJ-LMR0crL5-wTTCtnluxGCV_HksvSGcDceR4xVIWIMbk5yr1xSPAx7cHKDHDZcj-VJR2cIGfo5-94yvYTR9HynKURkT9ZMR6EjcE9I8fSlwQlpeEipR-ZefKmKA40NcRM5phTYtOwfNHt9TWJSZZ2-beaxViD6ui6JMWINr4Nk8my0WoIx3NIIQNGQqu2yvu3lyTUknvQNhtNT4I6fxTjKFAlstjM0NH-6uhOwUzjos3ze0qx8O3-OB_yVWybla9yaWyZcyozw6lYdWeqww0jlIjtOPAeNUYJ7z8iIiBy6h6ehNrAdA7SWg1BT1SgqeZxQsqWMc5EaEQwEJ_nQNcyh-1zr8H3Jt25evMKbq23_e0K11RmpwOKULlRzDyBq5KaAU_EDSTWLX0FSWPv6bpCJtC3ycanXqy6HiXOy9dKgqxDjRJCRcD-PWEoyN8N1uJuW1ZPdSH1pjERKabHWwP-toE5O6SyNRy46wOZmELCi83ltsq2To0qC2QbIiThJ5mJG3KOgijIQywqkcxGtvNLEAYx05TfsTlBdkJDDrkFSv3zaUc_eLniwK2hXsdivYZpE7sAVqLp9ooK-PDRllD-ISzKEwY2_EJJEvzjWy3ovzSrSQhgnpwnzK8TNrV9AqEV4sWPwhvvOx1giuUV2v4ApCPveWMsJqQfT4rVdJ2oGX-QY66XFKm1Hkyc6hbR_3_0HMMbFJHECm5lEXLW0OkkHkHPKv0W80x9jf0OI0F29LP4MMil4ZcsZdXFLOLClm_dHALOY_Q5b3cOTp6fvvmIJ_unuD5_4DPHcVLJ5pyCjnM5r-pefkxsdaJKtBKvKa2MJNKj1T0I4jwfz1eKxIvcpngNosXijlMRlcqafyKrYinILUPXuGNNDG5hxkRtjI-H4QZlDl9SY0hrcaT92E3Tc3RPabuOSB4w0LzKAiocnDh12aj7gZAAhuF1iJeG9J48p5yQaJ76P5V9mB9UyjdPd9GNMg0ylhdwXzOAe-w4kg6bLDuQGWWYs80MbBj33ATipGTOPpxJCB242PxXeWFweIGMQwtUwQQG__ubdV9FSwPp2vk2kaUzCi_NIoPTGZjhLuzLQ-J_xQ-BckrGsd7RozTQZhbitwwiBUKFxCgsLsVkV7UqR2DFzgGrx7vP2X33gQlkr0KK72RZvJLeCwr7VI0tzMYuc8w71bEgDrVktc_HRdPV9j-_NFbC6_Dw_YIHjsovqtE0-9Ctbr5EuQIWggjZEYmtgJbWiyJfAx9WkmAcv4ygqawTOJnBk5xsb_MRREICDJ47LtetFdTVIYVuChk8eta7fXKRA8AGUxUCt6KXruYE2mOUAYnmU_0oC0sZ9mcSLkHvINRA7r4-A496sqw9spYDZrpq7T3vuwD-Cg-HqYZM4VLDxtbRfmFbA6CrmCrIIESu_2Vb_kgbJlyCJne9MGi5j8tftvIFNwqZKFpOpmrahOaXepyNGuqX9arphh2OOWvhA6tpS6p-E1Xrvc5c1LnJzYtykSpCL48JBxX-ZjzUK8j2hEDgFmyL5zsV8AoKhNY5hZy-zy3lWRJnTaAq_zsbYFq7ZbckkLTyz8OfC_xGYBsv2chcoa4MuqySx_QaQi8spZbwe2ccKBKny8NcFQKA_bXkBPohCCntgpeY-mjWfQyps_voDzcZH197GDjTsklO430f7iyGBX5-CDCO6dLRI2RsA8e-TqQYpwtPKf_2kaFPBFVd6ViyP4Xa5f6P5g5awOA1EQpVA54uG1TUY9yDvgAeZIRJX-U8mI65y9BTpyXtp4518o5pSIevSDW0wbveRVcQHHJ5w_oSlAdVRtZnnHs_I-H3M1mmxvWhoAnXlgKbZZeHayoDjMTw_1em83gRjbtqjA0fvLyPDWwdXTjBuF8d9oDaJMIaPZz3TRmB5tpfGbkwbJj_adIsiRUiOy7GieT6tnNn9kavDUHfpJQFSGOkRtFYEIwAuIZz2fYkoGLQGDA5gUJbWAUOpoic2Ys5SPHTAcaoafA8rBgAhzNQv9Y1n8HNoGA53PJbxxBNECDq0atAySkpEc-SJ4_EMMd0LfCC9Y1vab15Wn7Fi08avINRS3QmsSIYb5aYsu1JDYWUWWmh8TY_PV-5VrPw8tBdh6RkauSfIr_NOV5r9clI3VnSJ4W_uCuFHvhg0wEZKmqyBvITUMxQ4ynYT_ofbbBw1K38NxhyFjHwXs0KIOBi9GrFpr6G-hbWVPcAcJIAe6ZbggjzpIFkJBMeCWeIDT6cukj9RD-ayxqMYqENB9Ub-ermwxl4RgMrq3ElOrVAPOQBON2ioS9AacrOvYbljvzfOuq5B-dphJoiTbDmdFPQjO73Nrry3yQ1NedYaCemKjgg0KWiP0UJuc8zk1UJ9AcU7m5NTgf2MWIsiz_YUrW7bt8JQPEPYysjdQaARoi_CSajd1lr8ZCedg-4anc-lmItm1COXTd7sc7Gp9OarBiDf25WwE6Uy5eVRKTCjubrF_zC_-_tNDd7Incyea0I28mRq29OcCGriRgHGx12vmVih73Wr1rA8aCXRjk_-du8u52iKwyxAvvCnvl1La3pIN4OdXQPsPBr62aWqCu-Qbgh6fH4i8u8C0aPxATNKmY_8jM19SA9ijjhXSMtZO_mheuIpseWlgCRyWd0Z7LqwAhoTzKGAken9C2kiU7LDeI4Y-6j2pKMzTqSr741YHfSQotvPLlAqjXQbnY9LjlPyhEJqPoPEqM_Zhv_6DcGc49cRL-pt3fJi_1CnxeMD2LETwIdUTydRCzInieGkuhe9M0Py70Olpgp-GDevwOk5R9zJ4nZ_vmk60vQw5skPMP_X63Gaed2A0tOZcYc0dS9uHrDmlFbj5nPHlKKwDN8FbF7ziY4Dxgb59e718lqqc9bVsBQQ7XfOyAKOXnKnIWDFr_zPkKzObfp_hNeledKWZ0SA51rM5997HOn7ZoRYPU2HMAJEiw61Ej041sNOjOFRTAYhTWVOiS4cE4podDnVCudb4w4e_y1SFhLMxZnlXlXoN3laX5D075SojQVosjMFvfawSOcSlcwjE8H1Nh1xxkjU7Rz8y94rvIExdYA5VuSxWOSTnlEVlbW6te8VmCOODTuPaAMxLDxz7gXWXyEfD_j_EkKewWYS4iMo_I1r-t7my3mVL0_ICl_hVx9vJCVQEkUyHlvUZiI3g0jaFFwP0t-25y-DrOKD-Punmfs2dDKswkT2CanOakdMg2YPmWlHp7GdyWzmGybcLQSmXzTfzHWFcRcVsPztWT0a4Ri1F"},{"domain":".chatgpt.com","expirationDate":1752479110.805117,"hostOnly":false,"httpOnly":true,"name":"__Secure-next-auth.session-token.1","path":"/","sameSite":"lax","secure":true,"session":false,"storeId":"0","value":"FyHQcqvoTNXJwcRpDCiAxOivNJHhKzUuJq7OPbwHeA5EV9_-oOZI.e0eSUVNVgSgRgO_krXyEBQ"},{"domain":".chatgpt.com","expirationDate":1776239111.913607,"hostOnly":false,"httpOnly":false,"name":"oai-sc","path":"/","sameSite":"no_restriction","secure":true,"session":false,"storeId":"0","value":"0gAAAAABn_g6IWjRIPM9d6fSX7kRgWouvExGNs0ZXM1kDFqkpYADsRc8PrPkClyZvrocUX4epOylI33QJh0ad5feClHpwcch9mKwFoYc-ShpD6crmCtPqpuhViq2UNSxHSVOQw2OxG-JZc0z3zvSkYBA7_qCmOzXNYIjT59MZRdpONZy_qIBJf6Uy_hYk-9SK6-2G9JXhrwndE8kkMRcNQgCcACup7Xr0RpgDHLiXQxUqeYd3zmV7tLA"},{"domain":"chatgpt.com","expirationDate":1744704104,"hostOnly":true,"httpOnly":false,"name":"_dd_s","path":"/","sameSite":"strict","secure":false,"session":false,"storeId":"0","value":"rum=0&expire=1744704100422&logs=1&id=d172268d-bb48-438e-84a1-df230e44e25b&created=1744699886272"}]}
star

Tue Apr 22 2025 02:22:31 GMT+0000 (Coordinated Universal Time) https://etherscan.io/verifyContract-solc?a

@mathewmerlin72

star

Tue Apr 22 2025 02:22:25 GMT+0000 (Coordinated Universal Time) https://etherscan.io/verifyContract-solc?a

@mathewmerlin72

star

Tue Apr 22 2025 02:22:20 GMT+0000 (Coordinated Universal Time) https://etherscan.io/verifyContract-solc?a

@mathewmerlin72

star

Tue Apr 22 2025 02:22:17 GMT+0000 (Coordinated Universal Time) https://etherscan.io/verifyContract-solc?a

@mathewmerlin72

star

Tue Apr 22 2025 01:35:17 GMT+0000 (Coordinated Universal Time) https://lifeonablock.com/spin-code/

@websplach #javascript

star

Tue Apr 22 2025 01:35:17 GMT+0000 (Coordinated Universal Time) https://lifeonablock.com/spin-code/

@websplach #css

star

Mon Apr 21 2025 23:40:01 GMT+0000 (Coordinated Universal Time)

@shahmeeriqbal

star

Mon Apr 21 2025 09:21:57 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/cryptocurrency-wallet-development-company/

@CharleenStewar #multichain #multichain wallet #cryptowallet #cryptomanagement

star

Mon Apr 21 2025 05:59:48 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:39 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:35 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:31 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:28 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:24 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:22 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:18 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:59:10 GMT+0000 (Coordinated Universal Time) https://rebootwebsites.co.za/how-to-create-an-advanced-slider-with-card-carousel-in-elementor-wordpress-tutorial/

@websplach #javascript

star

Mon Apr 21 2025 05:22:43 GMT+0000 (Coordinated Universal Time)

@codejck

star

Mon Apr 21 2025 05:21:48 GMT+0000 (Coordinated Universal Time)

@codejck

star

Mon Apr 21 2025 05:20:51 GMT+0000 (Coordinated Universal Time)

@codejck

star

Mon Apr 21 2025 05:19:41 GMT+0000 (Coordinated Universal Time)

@codejck

star

Mon Apr 21 2025 05:17:36 GMT+0000 (Coordinated Universal Time)

@codejck

star

Mon Apr 21 2025 05:16:41 GMT+0000 (Coordinated Universal Time)

@codejck

star

Sun Apr 20 2025 20:41:51 GMT+0000 (Coordinated Universal Time) https://www.shellscript.sh/

@lililld03 #sh

star

Sat Apr 19 2025 19:30:26 GMT+0000 (Coordinated Universal Time)

@agent302

star

Sat Apr 19 2025 14:56:12 GMT+0000 (Coordinated Universal Time)

@vjg #python

star

Sat Apr 19 2025 09:04:01 GMT+0000 (Coordinated Universal Time) https://www.pctipp.ch/praxis/datenverwaltung/windows-fehler-datei-oder-ordner-in-benutzung-aber-durch-wen-2012564.html

@2late #windows

star

Sat Apr 19 2025 05:26:22 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/poloniex-clone-script/

@janetbrownjb #poloniexclonescript #cryptoexchangeclone #cryptocurrencyexchangedevelopment #whitelabelcryptoexchange #cryptotradingplatform

star

Sat Apr 19 2025 01:00:36 GMT+0000 (Coordinated Universal Time) https://www.cpagrip.com/admin/dash_tools_gpostback.php

@Mido4477

star

Fri Apr 18 2025 18:29:48 GMT+0000 (Coordinated Universal Time) https://voz.vn/t/them-nut-ignore-đoi-voi-tai-khoan-mod-hoac-chan-tai-khoan-mod-tham-gia-tranh-luan.1091590/

@abcabcabc

star

Fri Apr 18 2025 04:51:45 GMT+0000 (Coordinated Universal Time)

@SrijanVerma

star

Fri Apr 18 2025 04:27:06 GMT+0000 (Coordinated Universal Time)

@Ankur

star

Thu Apr 17 2025 21:02:12 GMT+0000 (Coordinated Universal Time) https://chatgpt.com/g/g-m5lMeGifF-sql-expert-querygpt/c/68016b0a-87fc-800c-9804-fcb8c0e53665

@GurhanKaya

star

Thu Apr 17 2025 12:17:09 GMT+0000 (Coordinated Universal Time) https://ollama.com/killrkingz/brandonjessup

@killrkingz

star

Thu Apr 17 2025 11:29:32 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/cryptocurrency-wallet-development-company/

@CharleenStewar #multicurrencywallet #cryptowallet #cryptosecurity #cryptoadoption #digitalassets

star

Thu Apr 17 2025 08:25:08 GMT+0000 (Coordinated Universal Time) https://wisewaytec.com/crypto-marketing-agency/

@snehawt15

star

Thu Apr 17 2025 00:41:25 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Wed Apr 16 2025 09:58:44 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/best-crypto-wallets/

@CharleenStewar #bestcryptowallets #topcryptowallets #cryptocurrencywallets

star

Wed Apr 16 2025 09:24:56 GMT+0000 (Coordinated Universal Time) https://www.newassignmenthelp.co.uk

@tracyscott790

star

Wed Apr 16 2025 05:58:50 GMT+0000 (Coordinated Universal Time) https://www.addustechnologies.com/p2e-nft-game-platform-development-company

@Seraphina

star

Tue Apr 15 2025 20:06:45 GMT+0000 (Coordinated Universal Time) https://github.com/ainextgentool/Free-Instagram-Follower-Generator-Tool

@extrememiniboat ##instagramfollower ##free

star

Tue Apr 15 2025 18:15:03 GMT+0000 (Coordinated Universal Time)

@sayedhurhussain

star

Tue Apr 15 2025 10:43:01 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/cryptocurrency-exchange-business-plan/

@CharleenStewar #cryptocurrencyexchangebusinessplan #cryptocurrencyexchange #cryptoentrepreneur #cryptolaunch #cryptocurrencybusiness

star

Tue Apr 15 2025 09:13:46 GMT+0000 (Coordinated Universal Time) https://ottinfluence.com/best-influencer-marketing-agency-in-delhi/

@ottinfluence #influencermarketing agency delhi #influencermarketing agency in delhi #influenceragency india #influencermarketing agency india

star

Tue Apr 15 2025 07:47:05 GMT+0000 (Coordinated Universal Time)

@chatgpt4cham0

Save snippets that work with our extensions

Available in the Chrome Web Store Get Firefox Add-on Get VS Code extension