Generate a YGOPro Lua script for the following Yu-Gi-Oh card effect:
Target 1 monster in either GY; destroy 1 WATER monster on the target's owner's field, and if you do, Special Summon that target to that field in Defense Position. If this card is in your GY, except the turn it was sent there: You can banish this card, then target 1 WATER monster in either GY; destroy 1 monster on the targeted monster's owner's field, and if you do, Special Summon that targeted monster to that field in Defense Position. You can only use 1 "Hydor, the Base of All Things" effect per turn, and only once that turn.
--万物の始源－「水」
--Hydor, the Base of All Things
--Scripted by Hatter
local s,id=GetID()
function s.initial_effect(c)
	--Special Summon 1 monster from either GY
	local e1=Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(id,0))
	e1:SetCategory(CATEGORY_DESTROY+CATEGORY_SPECIAL_SUMMON)
	e1:SetType(EFFECT_TYPE_ACTIVATE)
	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
	e1:SetCode(EVENT_FREE_CHAIN)
	e1:SetCountLimit(1,id)
	e1:SetTarget(s.sptg(false))
	e1:SetOperation(s.spop(false))
	c:RegisterEffect(e1)
	--Special Summon 1 WATER monster from either GY
	local e2=Effect.CreateEffect(c)
	e2:SetDescription(aux.Stringid(id,1))
	e2:SetCategory(CATEGORY_DESTROY+CATEGORY_SPECIAL_SUMMON)
	e2:SetType(EFFECT_TYPE_IGNITION)
	e2:SetProperty(EFFECT_FLAG_CARD_TARGET)
	e2:SetRange(LOCATION_GRAVE)
	e2:SetCountLimit(1,id)
	e2:SetCondition(aux.exccon)
	e2:SetCost(Cost.SelfBanish)
	e2:SetTarget(s.sptg(true))
	e2:SetOperation(s.spop(true))
	c:RegisterEffect(e2)
end
function s.spfilter(c,e,tp,water)
	return (not water or c:IsAttribute(ATTRIBUTE_WATER)) and c:IsCanBeSpecialSummoned(e,0,tp,false,false,POS_FACEUP_DEFENSE)
		and Duel.IsExistingMatchingCard(s.desfilter,c:GetOwner(),LOCATION_MZONE,0,1,nil,water)
end
function s.desfilter(c,water)
	return Duel.GetMZoneCount(c:GetControler(),c)>0 and (water or (c:IsAttribute(ATTRIBUTE_WATER) and c:IsFaceup()))
end
function s.sptg(water)
	return function(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
		if chkc then return chkc:IsLocation(LOCATION_GRAVE) and s.spfilter(chkc,e,water) end
		if chk==0 then return Duel.IsExistingTarget(s.spfilter,tp,LOCATION_GRAVE,LOCATION_GRAVE,1,nil,e,tp,water) end
		Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SPSUMMON)
		local g=Duel.SelectTarget(tp,s.spfilter,tp,LOCATION_GRAVE,LOCATION_GRAVE,1,1,nil,e,tp,water)
		Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,g,1,tp,0)
	end
end
function s.spop(water)
	return function(e,tp,eg,ep,ev,re,r,rp)
		local tc=Duel.GetFirstTarget()
		if not tc:IsRelateToEffect(e) then return end
		Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_DESTROY)
		local g=Duel.SelectMatchingCard(tp,s.desfilter,tc:GetOwner(),LOCATION_MZONE,0,1,1,nil,water)
		if #g==0 then return end
		Duel.HintSelection(g)
		if Duel.Destroy(g,REASON_EFFECT)>0 then
			Duel.SpecialSummon(tc,0,tp,tc:GetControler(),false,false,POS_FACEUP_DEFENSE)
		end
	end
end