// File: contracts/FEMALE.sol




// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @title: Editions
/// @author: manifold.xyz

import "./ERC721Creator.sol";

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                                //
//                                                                                                                                //
//    ;S8.   .S@88S%S8;t:;@:;;X@;  ttXS;;;:.:::.:.:.::::::::::tSS;:%;::::::::::;;::::..::.:.. %%...... . . ..: S8@.;Xt.  %8:8:    //
//    X8t@:8t: 8S%8%X@8SX%.;; X@%%; :t8%S:..........::.:.:.:.:t%@%;;:.::::::::.:........... ..::;......::t;:tX8 %X8S8XXSXt @88    //
//    88.8.S;8; 8; 88SXXSX8..;:%;:  ;St::@..:.::....:.:.::::::.::;::.:::.::::........:;. ... .....;;.%S8@S%%:SS:   ;%:;@S@S@.8    //
//    @88t:@8@X;%X8SXX@ %8 8t ;t% : S@Stt:S .:.:..:.:.:.....:.:..::....::.:.::.:.:....::: ... ;tttS88.%.;;%%@. 88t%:8X ;@.t:%@    //
//    t.  X@S88SStt  X@SS8X88S@@8@. %SX%: t: :.:tXXt..:......:.:..::..:.:.::..:::::. :...:...t8@8@@S88S@S %X ;t;;888@;S:.8 8X.    //
//    @S.:SX%:XS ..:8 888S@:  @ @X88888@t .X;::X%XS8..::......................:.::::..:..:. @SX8@S@@X%:.;t%  .   :: 88X .;S. 8    //
//    :  8:@X8@ X t8: X8St@ t;:  888S;  @ X.; t @@Xtt.::::::.::::.::.::...;;;::...::....... 8@8%8@8%t.: %t; S%   88.X .%8;8.8     //
//    S8XX :.  @S%  888 XSX%SX@ 8 .X8.S t@t8.;S;8StX8888SX@XSt888@8@XXS@888888888@SX%S%;.;X888 8:;8.::.:;::....            .:t    //
//    S:%8;t8X S8t8@888X 888 .8X:.S88@X%t%@88X8S@8X888888t88%S88S%S:.: ;888888@8S%;@X8%ttXS 8:;8  8;8S8@S8 8 ::8 88::;@ 8 ::.8    //
//    . %:8St88@ @8  @S   %88X: 8%8::.8;@;tS8XtSX8888X888X8@X@8@@@S ;%8%88S88@888@@t888tt%.8@; 8 .88:; @.8  8. 8%;. S;%8.:;; @    //
//    S88888  tXX;;tt;;t;;:@:.;% ;t8%S@8;8 8@888@X888XX8 t8888:S@S8: 8:8X 8tX;8888S8;8;. 888 8.; 8;88 .% @;%.888 t:.X  %@8.@ 8    //
//    : 8 @8S::;t%;::::;S8%8.8:. XS8%8%@%88t8@8X888888tt. @@S; ;;;;;8tSt8: @ X88@888@8X88S. S8888888 %8 t888@8.XX:@X8.;;.%S  8    //
//     S8X@8:8:@SSS.SSXt8S888Xt%tXS8. .X@X%8SX8S8X8XX@t .88XtX 8888@SX8   8%S;t%t 888@tX;   8t: 88@8XS8%.; 8S88 :8tt88%S:.8 .8    //
//      8X8 S%.88%;;8tS8tt%SS8X.S XXX8X8S8:;t;88X;S88S@88.:888@888@S8 @S   :8.: ..88. @@88888 .;SSS X  8%t 8XS X.:t@:t:t:t8 .@    //
//    X  X8 X tt88t@:X%St%S%8@%8XS8%X%8 8X8S S@8888X8S8888@S8@X8888888  88888 X888 S8 88;XXt88:.: @.8tXttSX88S:.;tX %%t;% 8 8X    //
//    8.8@8 @@.X8S8t8;X@XX8%@S;;8:88t;@%XSS :S88;t8X@.@88S88X 8888t;8: 88@: :;.88S .@ 8 888.8 8Xt888 ;;S% ;;8; :% @8@8 ;8 S8 8    //
//    : 8 :.XtX88@.X%8X8S .8  8 X88%tt;8SS X8%Xt8:. S88;%88:8t X@.:8 %%.88888:t88%t 8::@ ;X8t8%8   8888 ;@.%t%S     .%8@ 8.%8%    //
//    %t8   X S8SS88.  X  8888 88 8X;S;t;8%8@@8@S8;;.;.8; 88:%S8888;;  XS88X8X;@8 S@S8X.@ S :X8 .8 %.8S SSS; 8 @SS @t8@  8X8%     //
//     X    8:@SS@8 888   X  8% 8888;X@ S.;;%@8S8888.88 8%8. 8%t8;  S8:88  88:8. X8 88888XS8888%:8 t@88888:%X      @ 8  8 8 ::    //
//     8X: 8Xt;S88@S888 88%;8  8 8888 8:% t8.:S88888;.8t888 t;t888888 t XX8 :8:8 ;;:tXS%%ttt@%88%.  8t8 ttX .@8     X .:8..8.S    //
//        8;;;@X@8 88888 88@  t 88S 8:SX8 88888@%88888:8X@S8X%@   tX8t8S888:8t8tt8888t888888tS8:X8:; @ 8  : : 8   88.;8::8:;8     //
//    8 X8 X.:X@S 8 8888%SX88 ;;8@%SSX.t%X8S 8:SX8S      8t88%8S.  .S8888%88t8S8t 8S8X888888%8 88S8tt  8: 8@.8X8 88.;t8t8.8 8S    //
//    @  t@@8t8:tS88@8XSXX X ;8@ 88;X8;t8ttXX   S XX%S;SS88SS8::tt;SX@SX88% 8%tt8;888888@88@tS8;88X8.t:X888%@ 8888%%%8;t8:8.8S    //
//     X@88.:t@8SS @  SSS   %8S8S::8SX@:X888 8X%  X8X .888:8:%;;tt%88@X88.% S88S88%X8@@88@88t 888888;t@%@88t8 88X%SX8%S8;8;8S.    //
//    ;;.S8;t.t;:8t; 8  t@t8888S88 8@.8 ;8@8 8 88@ S%88S.t8t8S;.;;@@88.8@S8;;88%8%8%X8@@8888X88:88%%88S8X%.:%:8SS8XXX8t8.S8:8@    //
//     X8S8%%%.  X8X8 8X88SS@8@88; %8X8  888 88@8 88888 S@@t.t: tt;%88@@8t%S:S@;;X@%SX@X88S;%8%8%8888%8 X;XS88tX@@88SXX%8:Xt@8    //
//     88%.8.X: 8.8@SX8@XSS88S%t88%XSS8t8888@888:8;8  8@88SS8X;:;;:. ..;@ Xt;:.. ;tt%X8Xt;t;t88888S8@8XSt8%Xt@88::@X8S8.%8XtS8    //
//    t88X88@;88@X888:8XSS@888S8@XX@tS%8@.88%8.@88X8888%888SS%X  SSX;X:: S %S: 8@:. :%tttt%%t8St88@888;@8%8S;X8%%8:8.SS@@@8;%8    //
//    X@@8@@888X@88888%XSX88S8%88X@ t@t;% 8t88@8%XSX8 88S88888%% 8SX8S%%8; 8.:.88S   @%%S%S@X8X%8S8;; 8:S@X8:8X. ;8;8t@8S8S% 8    //
//    8 ;:@8@8 S ;8XX@@88t%S8X8%%X%8 S;8 88888S88;888@    XX;@;%%S8X@.%8t8888%888 X  ;X%%tS8S8888%:t8S8%8@8.8S8 8S::S8%8%8%8 %    //
//    @ 8::8:. @S888t@8;%8S%8t8%;;:t;X888 8%8XX X SStSXXS8%S888%%S.88:8@888888:8 8  ::@t%%t@:.; .8t8.%8SX%8@@X@@:@t8XXtS.:88X;    //
//     t8:8t8 8 @888X88;.%8 8S;t%S%SX;8%8t8 S@@S88X8%t :.8@ 8888888X88888X88@%88 8 : %8X%@8 ;;.;:@X@@@;X%:.;:S.XX:8St%;88%;8;%    //
//    8@ 8tX;X%S%S8888%.88.888t8SS@X@88@:@8;8 %:8tX%@;888;@@@SS%tS:;X88X88888888S@XS88t8SX  88XXS@t@X8S8@@;tS tt:X8@ .8X;tSXXX    //
//    ;%S:;@8:tt% S%.888:8X@X8 8@%%@SX@%SX8%t. SX@X88t%;XXt.;:;@88888 8SS%%SSSS;;S .8;8 ::  ;8;:.8XXS8  @:.t8t88X;S88@X88 ..S8    //
//    :@ttX:X@S%;S8X;@SX8888888X8%8t@8%X8X 8.8:X;t:8; ;8@888S%XX88@ 88 88Xt;;tXS@88  8 ;;: .8;88S;t @@@% ;.8S:  Xt ;; %XX; :88    //
//    %@8:  ;:t8%S8%tS8X8%@8S8@@8.SXtSX8XXS::tX8@S8;888Xt X88;8@@ 88  .8 88t8     8X   8 8:8888X.888888888@88:88888@888@8X8X 8    //
//    S%@@8%t%;S88X.8  S88@t; %@tS%@;%%t888X8@. XS8@@8@ %X8 8 t;.t888 8  8 @  8 888   8.8 88. .:.%%%%%S:%t;.8 ;SX8XStXttXX.:;8    //
//    S;8: ;@8;8@888;88%@@8X8%88XX.SS%S88X88.%X 8. @S@ 888t88t   ::88     888   X  8 8   8 8tS88@8@8888@8@@%.%S%%%:      S:SS     //
//    8888S@S8;8:X8;%Xt;.;88% :@X@8S@8S8@@@ :@@.8;8 S8   @ @8X 88 88 8S888    88      S@X 88 ;8S;;.:t;:....:;;;t;tt;::: tX:t;     //
//    8X88S8:8X8X888 .tS88 %;%. 888S8.SXX@XS:8@8; 88@@t S  ;:  8 :88  S888X @8X@8 888@X88888t%8 .: . .:::;t%ttt;t;;;;;;:SX.;S%    //
//    88@S8:88.888 8t888%X@XS8St8S.S:@:S 8.8S; SX::tt      8 8    ; SX  S %            8 8 8 ;8:..;;;;;;:t@8:88X;;;;;:;  t;. @    //
//    88X.%8t.@8SStX8%8 XtXX8888X;StX.S;8@X.   8  @: X88X   @88  SX8X88 S8 ::         .8   t8 X%:.t;t.88SSXX:8;S;S;;;:;:SSt.8@    //
//    8X8S @t8X%X.::.@@t;X@8S8tXS88@t8 S8S8.:X88@88%8:%tS8888XS8@;8S88888 8  :     .;8..   88@Xt.:%t:%%88. 88t @t8tt;;t  %%S%:    //
//    888 88888 S@X@8%8t@:8X.8%@%;X 8. S.;88.8@ @X:8X8X@88XSX8X@%88@8@@@%Xt@ ;   .. ..8.:  8S %%..St8@SSXt8888@ 8SX%t;t:%%SX8X    //
//    @  X:  @ @888XS S  :S8888 8  8X .t.Xt;.  % 8.S8888888888S88888X88@X@@8 : .;;;.;;:; t 888 t: tX8S:Xt SSX ;88%888S%..;SS88    //
//    ;8 ;t    8 X88888 X; t8 8@88   8SX:%t%t.t :::@ .8888X8888888XX8@88888@@:  88 : 8.t   t 88 S8; %@%%S 8888S;88:%8t%;8tX%8S    //
//    .;t: SX     @XX8 ;888:.8 X88X88@8 ;Xt%%%.:t8X@888888@8888@S8X888SX8@8@@     t     @ %888%  :%X888  88 8SX;888SS8S;8%Xt.%    //
//    St% .%%        88 @88.X8888@88    ;%t.:: %8S@@88X8@8@8888888@@88SX8@@S8 X  88 @88 8 @%  8@.;X@8:t S888 8 8t:8888%%SSS%8X    //
//    8%: :  :    8 X8@88.8 88S @  8 X8 8.  :.. ;X888888X8;88XS888@@88X8;@888888S8  S8888:88;88%:%888%888S888S 8 888X %;S8@X8@    //
//    .S%. 88  X  X88888  888      8  88@  X%;t.;@88@8888@8@88S8X8%8 8@8X88;88@8X8@@8S@ 8@88888.;S :tX8 X88 888S88@%88;% 8@X8     //
//    . 8 888  @ @S%X 8SX .88%%8S 888  S   S tt. @8@88X888X@X@X8@8X@@88@@88X8t88888888X8 8%8%@8;%S%8@8XS 8XSX8X8.SXS8%t% @8@S8    //
//    :8%8% 88  @ S 88888888 888888888888%  8  @ @@@888888%X888X8t8888888888t  t;S:88888X888:88:;X 8.X8;8X 8X8SS88 ;X888SX:@:S    //
//    SS;% @88  S8 88888888888%8888888888@X88t8888S88888888@XX8@88888888@888@8S8;88@88S X888@S8; :8888X%;888t88@%tXX888@;S;X8t    //
//    t8t% 888@ 8S%88888S@88X88 888888888X8 8@888XXS8@@@8%8@S888888.8888;t88.S 8S8@8X@@  888;88S8.888888@888888%888@S88X8t88 S    //
//    :XS    88  S88X8@8888%88S8888888888% X@SS 8%t@@SXX@888t8888;88S%888888%X8 88X88@     8S8X;t:%@888%:.88 ::%SXS88X88@888@;    //
//    88SS :8X;  S 8 8@S88t%@88S888888888 88888 @88888@88@@@88888@@@@88@;88@8888888 8 8   :8;.8.888:@:@X88@88888@XX@8888;%%8 t    //
//     t 88 888 S%%S8X88 X S@88@X888888888S:88  88S8888S@88S88SS88S8888%@8@X.888@ 8. 8    @8% .X8X888@8X888@888888888888%8S:XS    //
//    @tS88 . S@8SX@:SSSS %SS@88S8 88888@;8 88. 8888%8X88@S8Xtt @8 XS%8 S::88888   ;S88X   88;%XX8@88@@8@8@X8@S88XS88888.88@.:    //
//    ;@XX8  8@8%88@X8888t8%S;8X@@t8S8888 8%;8t888%888888@8 S:S;X.:t@S   X ;S @  %t88t@@8888.8888888S88888X88@S88@88888888@88%    //
//    X88   8SS@S@X:8 88SX8X@88%%8;@8888888%@SS  ;888S88888%@ .%8%@  @;  8 %88  8 S8 8    8:S8888XX88888S@S@88@888888@XS88@SX8    //
//    %8X   8: 8S8X 88888%888S%8%8S8X88 88XS 8@8XS8XX8888@8 X%8  888 8888@ 8X     8 S%8 .888X@8X888888;S@88;t:8888S88888 ;8@.8    //
//    ;    .8 .8 8S 88 888S@@XS888888888 88S8t8@8@8;8S88@X8t.S@@t.888.8.8S;888%8@X8@% % :t8888 XX@8888X8X 8X   8;8@88  X 888@%    //
//    ;X    888.8888@@SSX888X SSS 8XXS8@888888SX@.. X:X%88X8X;8X ;888888888X888X88X8%8.;.8888X;8X@X888@8S@@ 888 @;8S:88S888@88    //
//    X  8  88:X8 :%X888XXS;.%X8SS8888@8XSS8@@8tS8%S8@X8.S88;S%X@8XS88X8X8888@X88S@@88Xt8888XX8SX888888%8888@S:8@8;8   @ 88S88    //
//    8St  ;S88888 %  @S@X@S@%888t %X8@X@88%@@S88X8 8%tX8%88.8888SS8888X@SS%S8@88S8888 St 8;@888tXS@ 8%%@ X8 88X8X88888S8888X     //
//    8t @S8%.8t ..%X@X@;;8;X@8@8  @%88S:@8@%@@88@%;8 S8888  8X888%t@@%SSSXXX8888t@X8S8S88888S tS88.X;@:@; .S88SS 8S888XXS..8X    //
//    S%   8:8888@S%t8@%@@Xt8S88@888@@888@ @ ;SX8; S88 8XSX8 8;8@@X%XX%S%SSXX@@XX@8 ;XS;t888 @ .;t 8@8St8 8S.8S888X%@88X@ S @X    //
//    %% @ @8%8S@@8Xt@:%%:XXX@X@.X8@%88X%8;XX @8 :S8;@S8888@88t8XX88@X%X@S8S@SXX@@S :St %@8S8@8%@:8@8X8@8%XS8888@X88888X8@:8X%    //
//    tt%. 8SX  .S8;88@@X;.@%@S8 : 8; %:%% :S@88;t%8;S% .S8%8 :@@88888SXS8S@SX88888t@t;; @:@;88X88888S@@888@8ttX888888XS8X8t:@    //
//    .:.8888S@@S :%%.;: % ;X88;X8; %tS: ;ttt@%:@8@8 S8@% t .8S888888S88@@S88888888% 8:88S:S%X8SS8888X888@88@88@8 ;8@S8888888     //
//    t8888;S%S8@8tt%t;t;%X8:.88@  @@8S88S  @8 %X  S8 8;8 X %8%88@88@8X@@S888@88888t  88X8:8@8 :88XS88@88S@@%XX8@8888@88@88X88    //
//    t8.:@S@S@8:888S;;t:@@@t@888%88 88SS888@SS8X 8  8X.8t8 8 S@888888@X8888888@888@ 8t%@:X8X%88t88X@88S8888@8.X888X@X88888:8@    //
//    . 8S8S8X8X;8X8%t;tt8 @ 888S8 88888888888S  @8  88. 8:S  @@8S8SX88888888S8X888@8X88:.;8888@S@X8S@S8X8@88S@88888t@S8S8888S    //
//     8%8t8@@8%@ % X;t;S %@  8.888888 XXX@88888888St:. 888888t8888S88@8X88S888t88S X ..X ;888 @S8X@@88@@888@%8888@S8X888 @@ S    //
//    :S8tX88S8t8XX88S;;St8S%8 88@S :t;;.::...:;%@ @8S8SX:;S8@SX8888888888SX88%@888@@ .8 8:8888 8S8888@XS@X888@@X88@8.%%XS8 88    //
//    : t@%8X@SX%;888::;t88X:t... .;::...;::..:::%8@SX... :8t8XX8888@88;8888S%X8XX88 8  8X88%888%8@88S88888@8@@88888888SS88X 8    //
//    8:.@@888ttX%X;8;88@.   .   .  . ...;:....::%XXX S S;X8 8%8@8888S8888888@8@8X8S%:88 888 @8t X@.S88S888S88%S88888;8%XX@. 8    //
//    :: t8X8%X;t%;XSS8Xtt:.   .  . . .....: .:;:%X%   8 ;@@ SSS8888X8@8888888888%8@88 @ .8888888% @8;%@@@888@8@X@S8 8tX;S888@    //
//      .;8%8@;%8tX8%8;S8%%S%t%;t;;t;tt%S%%%%tt;:8;8X; 88 : ;;S@88888888t88X8@:8XX8; 888 .8@%.@  %% 8S8@X88S@@@88X8SX88@8S8;8S    //
//     ;%@8@t8t@tS@SSt@8t:t%%%%%%%%%%t%t%t%%%%%St888;  8@:t8 %;S88888888@X@88888%@S8% . @8X8888 888%88t888%888X88%8@8888% 8:8     //
//     :8 S;.SttX8% .X@%tS@@%%%%%%%tt%ttt%%%%%%StXt %88 8;St ;%S@8X@X8888@8@88XSSX8@X888888X:888 XX88@X88%88@8888@8S88@8X  X:     //
//    .:tS % ; 8S:%tXt8@88;S; 8t;tt%t;t;t;ttS%SSt88;888%SX.X@SSX@@@8@8@%S88888@@S@8.X   8 88.888S8S88 :8@88XX88X8% 8 88S 88S:8    //
//    XS88.@ 8@8% .;%t8888@8 8t :X%tt;;;t;;ttX%XS8 .tSXSX S%@ XS8@88888%@XX888X8X88@%  888:8%88 88 888 @88X%8%8S8:@888SS 8S88t    //
//    .@% .%X8S88S ...X%t88S88  t 888X%;;ttt%XXX@tXS :  tX8%; 8X88@@@8S@@88S@88S8Xt@%888t8@8@88888888@X ;@8.S888888S8@@888X8:8    //
//    XS; X; 88X t@S..:888X88S 8.@@88.%XS%:t%XX@@8 SX : : %@  t%t tS 8@@@:.88SX@@  :;X8 8t88.S8888 88888S8@ 8 SX.@ ;  S8 8S88     //
//     XXS%88 8S8 8:;.;:;t;:t;.SS@@St8X88  @;%SXX8 t8.8:%:.; X88S 8%.XS888 88XS. .%8: % 8 8888:8888S8X.@8X8SX88S8;X8.S 888.t@%    //
//    S8@  ..;8 8 @ SX:@SS%%%ttt%@X%; 8S :.St%SXX@ @t8%XX 8.;S88@@@t.:@:: X:8@X;  tS.. .Xt.%XX 88 88888X 88S 88S88@8S 8888 t%.    //
//    ;t;XS   8.@88X88@%S%;%SSS8@S88@%@888%@@@@X8@ S%8SX % @ t8X:88;S   t  8.S8.S %S: :.@888%8;;@888 88XS8@8S8S88888 888 8 X%X    //
//    :@88X8@S8;S@88SXX8  ::: .::.   ;:..:;%8t8S@% S:8%888%.S SS%X:@@8%@8 8 88tX;SttX.8:8 888 8.X888@X8.;@%StX%8SSX  88SS@88.X    //
//    ;;8.88X8S8X@S888SX:. S%t%  ;S@;;8@88X888@8t;;88S8@ 8:@@ % . @ @ 88:8S.@S ;S8%%%@t%8888t8888    8 S;t@@@@@@Xt8@8@%SSS8S:S    //
//    t8:.S@:;S ;%S8  . :X@88@8S%:  SS X8  ..@888tt@8X 8%;8%@ 888XX;@St.XS S ; @S:8  %:8t;:888%:888%8X8S St8t:88S:S@88%8@@:88S    //
//    8@@    8S;8X8%tX88.S@8@S8X8.tX8%8.@X888@@;SS.@SXX @t8S88XX:88  X@;  8 8 8@;t 8X Xt88 %t8tX8S%:S8 % 8t8X@S8%X@SXX:S@@  .@    //
//    8t:: XX.%8X;t@;@X%@XS@@SXXt:S88 %:;8:;t@.S88 @%8:.8@  ;  . t8X8%.:tS t888X %8%tX8.  :%8S.X@SXSS8%8;%8St8S8  SS@XS88@:X@     //
//    S88@;S%@8SSX@@:;SS. .XS88:t8X@SS8SS@  %X:t%St:XS  X    % @:.:%888%.tX: .8X.8:8tS@XS.88S%tS@;88S SSS8 . ; tX%S@XX: .:@ X     //
//    %8X@%: @;88%.X 88t ;;t8 8@ @8X 8X8 @X:t  @ 8 SS;@S@ t:@@t ;S%t%S8S .t8X 88;S 8@8 ;@t@88SX;  :8;:;%8;St88 ;.; @t@;tSS        //
//                                                                                                                                //
//                                                                                                                                //
//                                                                                                                                //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


contract FEMALE is ERC721Creator {
    constructor() ERC721Creator("Editions", "FEMALE") {}
}

// File: contracts/ERC721Creator.sol




// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @author: manifold.xyz

import "@openzeppelin/contracts/proxy/Proxy.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/StorageSlot.sol";

contract ERC721Creator is Proxy {
    
    constructor(string memory name, string memory symbol) {
        assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = 0xe4E4003afE3765Aca8149a82fc064C0b125B9e5a;
        Address.functionDelegateCall(
            0xe4E4003afE3765Aca8149a82fc064C0b125B9e5a,
            abi.encodeWithSignature("initialize(string,string)", name, symbol)
        );
    }
        
    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Returns the current implementation address.
     */
     function implementation() public view returns (address) {
        return _implementation();
    }

    function _implementation() internal override view returns (address) {
        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    }    

}

// File: node_modules/@openzeppelin/contracts/proxy/Proxy.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)

pragma solidity ^0.8.0;

/**
 * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
 * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
 * be specified by overriding the virtual {_implementation} function.
 *
 * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
 * different contract through the {_delegate} function.
 *
 * The success and return data of the delegated call will be returned back to the caller of the proxy.
 */
abstract contract Proxy {
    /**
     * @dev Delegates the current call to `implementation`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _delegate(address implementation) internal virtual {
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /**
     * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function
     * and {_fallback} should delegate.
     */
    function _implementation() internal view virtual returns (address);

    /**
     * @dev Delegates the current call to the address returned by `_implementation()`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _fallback() internal virtual {
        _beforeFallback();
        _delegate(_implementation());
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
     * function in the contract matches the call data.
     */
    fallback() external payable virtual {
        _fallback();
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
     * is empty.
     */
    receive() external payable virtual {
        _fallback();
    }

    /**
     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
     * call, or as part of the Solidity `fallback` or `receive` functions.
     *
     * If overridden should call `super._beforeFallback()`.
     */
    function _beforeFallback() internal virtual {}
}

// File: node_modules/@openzeppelin/contracts/utils/Address.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: node_modules/@openzeppelin/contracts/utils/StorageSlot.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }
}